你通常是怎么解决这个问题的?假设一个线程在Computer1上的libc代码(这是一个系统共享库)中崩溃,然后生成一个coredump。但是用于分析这个核心部分的Computer2可能有一个不同版本的libc。
所以:
发布于 2010-12-03 05:54:48
x86_64 )上,GDB需要正确的展开描述符才能正确地展开堆栈。在这样的机器上,用不匹配的libc分析核心可能会产生完全的垃圾。/tmp/C1/lib/...),并指示GDB使用该副本而不是C2安装的libc。
(gdb) set solib-absolute-prefix /tmp/C1命令。
注意事项:在将核心加载到GDB之前,上述设置必须有效。这是:
gdb exe core
(gdb) set solib-absolute-prefix /tmp/C1无法工作(在设置生效之前读取核心)。
以下是正确的方法:
gdb exe
(gdb) set solib-absolute-prefix /tmp/C1
(gdb) core core(我曾试图在网上找到这方面的参考资料,但没有)。
什么是展开描述符?
在没有框架指针的情况下编译代码时,需要展开描述符(在优化模式下,x86_64是默认的)。这种代码不保存%rbp寄存器,因此需要告诉GDB如何从当前帧“退一步”到调用方帧(此过程也称为堆栈展开)。
为什么C1的libc.so没有包含在核心中?
核心文件通常只包含程序地址空间中可写段的内容。只读段(可执行代码和展开描述符所在的地方)通常不是必需的--您可以直接从磁盘上的libc.so读取它们。
不过,当你在C2上分析C1的核心时,这是行不通的!
一些(但不是所有)操作系统允许配置“完整的代码转储”,操作系统也会转储只读映射,这样您就可以在任何机器上分析内核。
https://stackoverflow.com/questions/4329986
复制相似问题