在核心转储文件上使用 gdb 获取变量的值

Posted

技术标签:

【中文标题】在核心转储文件上使用 gdb 获取变量的值【英文标题】:Geting value of variable using gdb on core dump file 【发布时间】:2020-04-17 17:57:19 【问题描述】:

谁能帮助我了解如何使用 gdb 识别变量的值。我有一个二进制文件和核心转储文件(我没有原始代码)。我试图识别一个变量的值,所以我尝试bt full 来生成完整的回溯。但是,之后我不断收到No symbol table found。到目前为止,我已经进行了相当多的谷歌搜索,我发现二进制文件可能已经过优化,所以我需要做的是在没有-O 的情况下返回并重新编译;但是正如我之前所说,我没有原始文件。目标是能够在没有它的情况下找到价值。如果不使用 gdb,是否有任何其他调试器软件可以帮助我解决这个问题?

一些进一步的cmets: 我尝试转到特定框架并使用info locals,这也会产生No symbol table found。 我也尝试过使用printinfo locals

【问题讨论】:

【参考方案1】:

我正在尝试识别变量的值

什么种类变量?

对于全球用户,您只需print a_global

所以我尝试了 bt full 来生成完整的回溯。但是,之后我不断收到 No symbol table found 。

“无符号表”实际上只是告诉您没有调试信息(打印 参数 值和局部变量值所需的信息)。

我没有原码

...您的二进制文件是在没有调试信息的情况下构建的。

在这种情况下,您将不得不求助于汇编级调试。您需要了解平台的 ABI 和调用约定,反汇编您感兴趣的函数,并找出感兴趣的变量在内存(或哪个寄存器)中的位置,然后检查该内存(或寄存器)。

【讨论】:

以上是关于在核心转储文件上使用 gdb 获取变量的值的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux 上使用核心转储和 gdb 如何使用近似虚拟内存 (VSZ)?

从核心转储中获取堆栈跟踪

在linux上使用gdb调试核心转储时如何知道线程的状态?

有没有办法在gdb核心转储中获取线程的开始时间

如何获取详细的 valgrind 核心或使用 gdb 将调试附加到核心在启动时转储的进程?

核心转储注释部分