我正在检查核心转储,并且当只知道它们的类型时没有打印函数参数值(没有参数名称符号):
(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::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::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都指向相同的地址……
解决方法
没有简单的方法可以做到这一点.
您需要做的是查找适用于您的平台的ABI,然后使用它来了解参数传递约定.这并不总是那么容易,但可以做到.这将告诉您如何查找参数,无论它们是在寄存器还是内存中;然后你可以使用强制转换为适当的类型来打印它们.
当然,如果你没有debuginfo,那么转换也可能很困难.虽然有一个技巧:使用-g编译一个具有所需类型的虚拟文件,然后将其符号文件转换为gdb以访问类型.这当然有警告,你必须使用正确的编译器和库版本,正确的编译器目标和ABI更改标志等.
提前计划并且总是在某处调试信息真的好多了.这对你现在没有帮助,但将来可能会有所帮助.能够发送程序但保持调试信息可用于以后基本上是拆分debuginfo被发明的原因.
此外,值得注意的是gdb帧输出自stabs天以来没有太大变化,这些天已经过去了.我认为“arglist”和“locals”信息对于DWARF和现代ABI来说确实毫无意义.有关于修复此问题的gdb错误.