linux - 解释核心文件中的地址

标签 linux core

我正在寻找有关如何解释核心文件回溯中的地址的任何引用或指导。 例如典型的回溯如下所示:

(gdb) where
#0 [0x000012345] in func1 + 123 (a.out + 0xABC)
#1 [0x000034345] in func2 + 567 (a.out + 0xea7)
..

我可以使用-g进行编译并获得准确的行号。但是生产环境中的可执行文件不会使用 -g 进行编译,在这种情况下我会得到如上所述的堆栈。

我想知道:

what the addresses and offsets [0x000012345], +123 and 0xABC represent, how to interpret them and how to map them to line number in the source code.

感谢任何帮助。

最佳答案

在大多数架构上,如果没有调试信息,根本不可能从核心文件中获取好的数据。即使像堆栈展开这样简单的事情也不起作用。熟悉处理器架构和 ABI 的专家将能够从中确定很多事情,但这是一个繁琐的手动过程。

对于答案的其余部分,我假设您正在使用 GCC。如果您使用优化 -g 编译可执行文件,GCC 将创建带有调试信息的可用于生产的二进制文件。除非存在编译器错误(这种情况很少见),否则 -g 不会影响生成的代码。调试信息由侧面的数据表组成(这会给调试带来问题,因为机器码和原始代码在各个语句的执行顺序等方面可能相差很远)。

如果您不想分发带有调试信息的生产二进制文件,您仍然应该使用 -g 进行编译,但在分发二进制文件之前使用 strip 删除调试信息,同时保留未剥离的二进制文件作为您自己的记录。当稍后分析核心文件时,您将使用这些未剥离的二进制文件,而不是您放弃的剥离的二进制文件。您引用的内存中偏移量在剥离和未剥离的二进制文件之间是相同的,这就是它起作用的原因。

对于更高级的用法,您还可以使用 eu-strip -f 等工具分离调试信息,但这在您的情况下似乎没有必要。

关于linux - 解释核心文件中的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52675054/

相关文章:

java - 有关在类中扩展 JFrame 的问题吗?

php - 如何覆盖magento核心模型(模型类文件直接在app/code/core/Mage/Core/Model目录下)

linux - 页面分配失败时的顺序和模式

linux - 我挂载的 EBS 卷没有显示

linux - Shell 脚本无法识别声明的变量

spring - 可配置应用程序上下文与应用程序上下文

c - 检测到堆栈粉碎 - 在通过指针更新函数中的结构后中止

linux - pushbullet - 参数 'file_url' 的值无效

java - Long 不能转换为 String

c - 段错误(核心转储)Codelite ubuntu