c – GDB:如果没有可用的名称符号,如何打印函数参数值

前端之家收集整理的这篇文章主要介绍了c – GDB:如果没有可用的名称符号,如何打印函数参数值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在检查核心转储,并且当只知道它们的类型时没有打印函数参数值(没有参数名称符号):
(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错误.

猜你在找的C&C++相关文章