首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有共享系统库的精确调试符号的远程死后核心分析

没有共享系统库的精确调试符号的远程死后核心分析
EN

Stack Overflow用户
提问于 2010-12-01 22:54:41
回答 1查看 7.2K关注 0票数 7

你通常是怎么解决这个问题的?假设一个线程在Computer1上的libc代码(这是一个系统共享库)中崩溃,然后生成一个coredump。但是用于分析这个核心部分的Computer2可能有一个不同版本的libc。

所以:

  1. 在远程计算机上拥有相同的共享库有多重要?gdb是否会正确地重建堆栈跟踪,而不会在Conputer2上拥有完全相同版本的libc?
  2. 为libc设置正确的调试符号有多重要?gdb是否能够正确地重构堆栈跟踪,而不会在Computer2上具有完全相同的调试符号?
  3. 避免共享系统库的调试符号不匹配问题的“正确”方法是什么?对我来说,似乎没有单一的解决方案能以优雅的方式解决这个问题?也许任何人都能分享他的经验?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-03 05:54:48

  1. 那得看情况。在一些处理器(如x86_64 )上,GDB需要正确的展开描述符才能正确地展开堆栈。在这样的机器上,用不匹配的libc分析核心可能会产生完全的垃圾。
  2. 您不需要libc的调试符号来获得堆栈跟踪。如果没有调试符号,您将无法获得文件号和行号,但是您应该得到正确的函数名(内联时除外)。
  3. 你问题的前提是错误的--调试符号与此无关。在C2上分析coredump的“正确”方法是在C1上生成coredump,即拥有c1库的副本(例如/tmp/C1/lib/...),并指示GDB使用该副本而不是C2安装的libc(gdb) set solib-absolute-prefix /tmp/C1

命令。

注意事项:在将核心加载到GDB之前,上述设置必须有效。这是:

代码语言:javascript
复制
gdb exe core
(gdb) set solib-absolute-prefix /tmp/C1

无法工作(在设置生效之前读取核心)。

以下是正确的方法:

代码语言:javascript
复制
gdb exe
(gdb) set solib-absolute-prefix /tmp/C1
(gdb) core core

(我曾试图在网上找到这方面的参考资料,但没有)。

什么是展开描述符?

在没有框架指针的情况下编译代码时,需要展开描述符(在优化模式下,x86_64是默认的)。这种代码不保存%rbp寄存器,因此需要告诉GDB如何从当前帧“退一步”到调用方帧(此过程也称为堆栈展开)。

为什么C1的libc.so没有包含在核心中?

核心文件通常只包含程序地址空间中可写段的内容。只读段(可执行代码和展开描述符所在的地方)通常不是必需的--您可以直接从磁盘上的libc.so读取它们。

不过,当你在C2上分析C1的核心时,这是行不通的!

一些(但不是所有)操作系统允许配置“完整的代码转储”,操作系统也会转储只读映射,这样您就可以在任何机器上分析内核。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4329986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档