gdb - 如何使用寄存器和原始堆栈分析和调试没有符号的 gdb 核心

标签 gdb stack symbols core

在客户处,第三方软件崩溃了。进程和库被剥离(没有符号),调用堆栈不提供任何有用的信息。我所拥有的只是可能未损坏的寄存器。这个第三方代码是用 C 写的。

现在,到目前为止,我一直使用 gdb 来调试更简单的问题。但是这个有点复杂。我认为寄存器和原始堆栈信息可用于关联崩溃发生的位置,我需要这方面的帮助。

可能无法在客户站点部署未剥离的二进制文件,也无法进行内部崩溃重现。另外,我不熟悉这个第三方代码。

我还需要以下方面的指导/网站/文件:
1) ELF 和各种节标题。
2) 如何为库和进程创建符号文件(在编译期间)。
3) 如何告诉 gdb 从符号文件中读取符号。

最佳答案

我们应该能够做的一件事是针对您的流程的非剥离/带符号版本打开您的核心文件。只要编译过程(编译器、优化标志等)相同并且您只保留所有这些调试信息,GDB 应该能够为您提供您期望从核心获得的所有信息。

gdb [options] executable-file core-file

要使用调试信息(行、类型等的符号和小矮人)编译您的进程,您需要在编译器标志中添加 -g。这同样适用于您的自定义库。

对于系统库,有时(不总是)可能会很方便,现代 Linux 发行版(至少是 Fedora)直接将它们提供给 gdb。

关于gdb - 如何使用寄存器和原始堆栈分析和调试没有符号的 gdb 核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4969037/

相关文章:

gdb - 使用某种 gui 远程调试包含 gdb 的嵌入式系统

testing - cargo test --release 导致堆栈溢出。为什么没有货台?

symbols - 加载用于远程调试的符号

c - 在 Eclipse 中初始化期间,gdb 调试器停留在 62%

python - 如何访问 Python GDB Value 的键或值

c++ - 如何在 C++ 头文件上使用 gdb?

C++:在函数中使用调用者的局部变量是否安全?

c - C中栈的数据结构

Java Oracle 示例编译器错误

variables - Swift - 替换字符串中的字符