C 如何在没有共享库的情况下挂接gdb漂亮的打印机?
我找到的关于编写gdb pretty printers的所有文档基本上都是这一个站点: 它告诉我,当加载共享库时,就会加载漂亮的打印机 但我没有一个共享库,可以说我的库只是头库。我想为编程语言Nim的NimStringDesc编写一个漂亮的打印机。它编译为C,所以这里是生成到C文件中的所有相关部分C 如何在没有共享库的情况下挂接gdb漂亮的打印机?,c,debugging,gdb,nim-lang,C,Debugging,Gdb,Nim Lang,我找到的关于编写gdb pretty printers的所有文档基本上都是这一个站点: 它告诉我,当加载共享库时,就会加载漂亮的打印机 但我没有一个共享库,可以说我的库只是头库。我想为编程语言Nim的NimStringDesc编写一个漂亮的打印机。它编译为C,所以这里是生成到C文件中的所有相关部分 #if defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER) # define SEQ_DECL_SIZE /* empty is
#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]; };
以下是我编写的测试程序的加载库:
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)
所以我不能使用像/home/user/gdb/nim gdb.py
这样的东西,因为没有加载的libnim。那么我要怎么做,这个文件被加载了
编辑:
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
我知道stdlib_系统会自动导入到每个nim项目中,所以我可以说,当加载objectfilestdlib_system.o
get时,它就是一个nim项目
我有一个gdb初始化脚本:
~/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)
问题是,我不知道我做错了什么。文档确实应该说
objfile
。可执行文件和共享库的处理方式完全相同,只是共享库可以dlopen
ed,这样以后就可以调用脚本了
在这两种情况下,只需创建一个名为$objfile gdb.py的文件
;只要加载了objfile,就会执行该代码。该脚本可以是,或者您可以将调试根之一前置到完整路径(通常是/usr/share/gdb/auto-load
和/usr/lib/debug
)
请注意,对于objfile是否多次加载(通常是使用run
-重新启动应用程序,我没有测试是否在dlopen
-dlclose
-dlopen
序列中也会发生这种情况)或是否使用split debuginfo,存在一些不确定因素(因为它算作一个单独的objfile,但使用相同的脚本)
对于一个带有自定义路径的虚拟python包,我有一些模糊的想法,它在每次执行时都会改变,可以解决这个问题…我现在在我的项目中添加了更多的信息,但问题是,我不知道如何调用我的pyton脚本,所以gdb实际上会尝试打开它。我甚至找不到f打开的库包含类似于stdlib_system.o的任何内容。我希望您能帮助我进一步了解我刚才添加的其他信息。如果您的可执行文件名为
nim debug test
,则您的脚本需要名为nim debug test gdb.py
好的,至少到目前为止它可以工作,它告诉我必须设置一个au加载安全路径。所以问题是,自动加载安全路径在哪里,当前是$debugdir:$datadir/auto-load
。但是$debugdir和$datadir是什么。它们有什么值,我如何查找它们的值?这是我前面提到的两个路径,通常是/usr/lib/debug
和/usr/share/gdb/auto-loade> 。如果您想处理用于开发的内容,请添加/home/foo/src
或其他内容。如果您希望它用于部署,则应设置splitdebug等。