我正在检查核心转储,只需知道它们的类型(无参数名称符号)时需要打印函数参数值:
(gdb) frame 7
#7 0x00007f201a269e82 in f1(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char*, int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >*) () from /usr/lib64/libsome.so
(gdb) info args
No symbol table info available.
(gdb) info f
Stack level 7, frame at 0x7f200ebf9e50:
rip = 0x7f201a269e82
in f1(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char*, int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >*); saved rip 0x7f201b430905
called by frame at 0x7f200ebfa1c0, caller of frame at 0x7f200ebf9e00
Arglist at 0x7f200ebf9df8, args:
Locals at 0x7f200ebf9df8, Previous frame's sp is 0x7f200ebf9e50
Saved registers:
rbx at 0x7f200ebf9e28, rbp at 0x7f200ebf9e30, r12 at 0x7f200ebf9e38, r13 at 0x7f200ebf9e40, rip at 0x7f200ebf9e48
具体来说,我需要知道第一个参数(std :: string)和最后一个参数(std :: string *)中的内容。 此框架中的 arglist 和 locals 都指向同一地址......
答案 0 :(得分:6)
没有简单的方法可以做到这一点。
您需要做的是查找适用于您的平台的ABI,然后使用它来了解参数传递约定。这并不容易,但可以做到。这将告诉您如何查找参数,无论它们是在寄存器还是内存中;然后你可以使用强制类型转换来打印它们。
当然,如果你没有debuginfo,那么施法可能也很困难。虽然有一个技巧:编译一个symbol-file
的虚拟文件,其中包含您需要的类型,然后frame
将其导入gdb以访问类型。这当然有警告,你必须使用正确的编译器和库版本,正确的编译器目标和ABI更改标志等。
提前计划并且总是在某处调试信息真的好多了。这对你现在没有帮助,但将来可能会有所帮助。能够运送程序但保持调试信息可用于以后基本上是拆分debuginfo被发明的原因。
另外,值得注意的是gdb {{1}}输出自stabs天以来没有太大变化,这些日子早已消失。我认为&#34; arglist&#34;和#34;当地人&#34; DWARF和现代ABI对信息的确毫无意义。有关于修复此问题的gdb错误。