在客户处,第三方软件崩溃了。进程和库被剥离(没有符号),调用堆栈没有提供任何有用的信息。我所拥有的只是可能不会被损坏的寄存器。这个第三方代码是用C写的。
现在,我已经使用 gdb 来调试更简单的问题。但这有点复杂。我认为寄存器和原始堆栈信息可用于关联崩溃发生的位置,我需要这方面的帮助。
可能无法在客户站点部署未剥离的二进制文件,也不可能进行内部崩溃再现。另外,我对这个第三方代码不熟悉。
我还需要以下内容的指针/站点/文档:
1) ELF 和各种节标题。
2) 如何为库和进程创建符号文件(在编译期间)。
3) 如何告诉gdb从符号文件中读取符号。
我们应该能够做的一件事是针对流程的非剥离/带符号版本打开核心文件。只要编译过程(编译器、优化标志等)相同,并且您只保留所有这些调试信息,GDB 应该能够为您提供您可以从内核期望的所有信息。
gdb [options] executable-file core-file
要使用调试信息(行、类型等的符号和小矮人)编译进程,您需要在编译器标志中添加
-g
。这同样适用于您的自定义库。
对于系统库,有时(并非总是)可能是一致的,现代Linux发行版(至少Fedora)直接将它们提供给gdb。