gdbのprettyプリンタの作成に関するすべてのドキュメントは、基本的にはこの1つのサイトです:https://sourceware.org/gdb/onlinedocs/gdb/Writing-a-Pretty_002dPrinter.html#Writing-a-Pretty_002dPrinterです。共有ライブラリなしでgdb pretty-printerをフックするにはどうしたらいいですか?
共有ライブラリがロードされるときれいなプリンタがロードされることがわかります。
私は共有ライブラリを持っていません。私のライブラリはヘッダーのみです。私は、プログラミング言語NimのためのNimStringDesc用のきれいなプリンタを作成したいと思います。これはCにコンパイルされるので、cファイルに生成されるすべての関連部分がここにあります。
ldd nim-debug-test
linux-vdso.so.1 (0x00007ffed8052000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f4f1bf8e000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f4f1bbed000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4f1c192000)
をロードされるいかなるlibnimがないので、だから私は、/home/user/gdb/nim-gdb.py
のようなものを使用することはできません。
#if defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER)
# define SEQ_DECL_SIZE /* empty is correct! */
#else
# define SEQ_DECL_SIZE 1000000
#endif
typedef char NIM_CHAR;
typedef long long int NI64;
typedef NI64 NI;
struct TGenericSeq {NI len; NI reserved; };
struct NimStringDesc {TGenericSeq Sup; NIM_CHAR data[SEQ_DECL_SIZE]; };
ここでは、私が書いたテストプログラムのロードされるライブラリです。とにかく、このファイルがロードされたらどうすればいいですか?
EDIT:
NIMは、その後コンパイルさと通常のCリンカーと一緒にリンクいくつかのCファイルを作成します。これらは、NIMコンパイラによって生成されたファイルです:
~/proj/nim-debug-test/nimcache/ ls
nim_debug_test_foobar.c stdlib_os.o stdlib_posix.c stdlib_strutils.o stdlib_times.c
nim_debug_test_foobar.o stdlib_parseutils.c stdlib_posix.o stdlib_system.c stdlib_times.o
stdlib_os.c stdlib_parseutils.o stdlib_strutils.c stdlib_system.o
ときobjectfile stdlib_system.o
取得のロードされたことを、私はstdlib_systemが自動的にすべてのNIMプロジェクトにインポートされていることを知っているので、私が言うことができる、それはNIMプロジェクトです。
私は1つのgdbのinitスクリプトがあります。
~/gdb/ ls
stdlib_system-gdb.py
をしかし、それはロードされません。これはstdlib_system-gdb.pyの内容である:ここで
class NimStringPrinter(object):
"Print a Nim string"
def __init__(self, val):
self.val = val
def to_string(self):
return self.val['data']
def display_hint(self):
return 'string'
def string_lookup_function(val):
lookup_tag = val.type.tag
if lookup_tag == None:
return None
regex = re.compile("^NimStringDesc$")
if regex.match(lookup_tag):
return StdStringPrinter(val)
return None
def register_printers(objfile):
objfile.pretty_printers.append(string_lookup_function)
は、いくつかのgdbの出力です:
~/proj/nim_debug_test/ gdb nim_debug_test
GNU gdb (GDB) 7.11
[...]
Reading symbols from nim_debug_test...done.
(gdb) info auto-load
gdb-scripts: No auto-load scripts.
guile-scripts: No auto-load scripts.
libthread-db: No auto-loaded libthread-db.
local-gdbinit: Local .gdbinit file was not found.
python-scripts: No auto-load scripts.
(gdb) show auto-load
gdb-scripts: Auto-loading of canned sequences of commands scripts is on.
guile-scripts: Auto-loading of Guile scripts is on.
libthread-db: Auto-loading of inferior specific libthread_db is on.
local-gdbinit: Auto-loading of .gdbinit script from current directory is on.
python-scripts: Auto-loading of Python scripts is on.
safe-path: List of directories from which it is safe to auto-load files is $debugdir:$datadir/auto-load.
scripts-directory: List of directories from which to load auto-loaded scripts is $debugdir:$datadir/auto-load.
(gdb) info pretty-printer
global pretty-printers:
builtin
mpx_bound128
(gdb)
問題は、私は私が間違っていたかわからない、です。
もっと多くの情報を私のプロジェクトに追加しましたが、問題は、pythonスクリプトをどのように呼び出すべきかわからないため、gdbが実際にオープンしようとしていることです。私は 'stdlib_system.o'のようなものを含む開かれたライブラリのリストを見つけることさえできません。私が追加したばかりの追加情報であなたが私を助けてくれることを願っています。 – Arne
あなたの実行ファイルが 'nim-debug-test'と呼ばれている場合、あなたのスクリプトは' nim-debug-test-gdb.py'と呼ばれる必要があります – o11c
少なくとも今はこれまで動作しています。オートロードセーフティパス。したがって、問題は、現在、 '$ debugdir:$ datadir/auto-load'である自動ロードセーフ・パスです。しかし、$ debugdirと$ datadirは何ですか?彼らはどのような価値を持っていますか、どのようにその価値観を見ますか? – Arne