从核心转储中检索可执行文件

Posted

技术标签:

【中文标题】从核心转储中检索可执行文件【英文标题】:Retrieve executable from core dump 【发布时间】:2020-06-14 14:14:03 【问题描述】:

我想,并且任何用于获取此信息的 linux 包的输出都应在其输出中包含 execfn

到目前为止,我尝试过以下几点:

$ file kms
kms: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from '/test', real uid: 1000440000, effective uid: 1000440000, real gid: 0, effective gid: 0, execfn: '/test', platform: 'x86_64'

file 命令仅适用于特定内核,它不是通用解决方案,因为某些内核转储会提供以下输出。

$ file ss
ss: ELF 64-bit LSB core file x86-64, version 1 (SYSV), too many program header sections (6841)

gdb 命令不适用于所有核心转储以相同的方式。使用 gdb 命令的输出不一致。 gdb 命令接收到的某些核心转储的输出与strings 命令不同。

$gdb kms
Core was generated by `/test'.

我什至尝试过 strings 包,我认为它提供了正确的输出,但格式不包含 execfn 以便在我的解决方案中使用它

$ strings kms | grep ^/ | tail -1
/test

任何人都可以建议任何 linux 软件包,它可以帮助我,其中包含 execfn 在它的输出中。

【问题讨论】:

你问过你的 Linux 电脑的系统管理员了吗? 请在您的问题中提供一些minimal reproducible example 并提供更多详细信息。 使用kill -11 PID 创建标准核心转储。 PID 可以是我们假设崩溃的 docker 容器。但奇怪的是,上述使用file 包的解决方案适用于某些内核,而不适用于其他内核。感谢@BaileStarynkevitch 的投入。 【参考方案1】:

尝试在您的core(5) 文件上运行file(1) 命令。但这需要您的core 文件完整。见下文和gcore(1) 与strace(1) 和ptrace(2)。

如果您的ELF 可执行文件(请参阅elf(5))是使用DWARF 调试信息构建的,那么您的core 文件中应该有足够的信息。另请参阅 gdb(1) 和 this 答案。

DWARF 调试信息是通过编译和链接你的程序获得的——如果它是用GCC(或Clang)编译的,那么使用最近的gccg++、@ 987654357@、clangclang++ 命令 - with -g(或 -g2 ....)标志。

注意setrlimit(2)。您可能需要使用 GNU 的 ulimit 内建函数 bash(参见 bash(1) 和 documentation of GNU bash...),或 zsh 的内建函数 limit增加 core 的大小文件限制

如果您的core 转储限制大小(即RLIMIT_CORE 用于setrlimit)太小,最好提高它并再次运行您的程序。优秀的开发人员可以在可执行文件中禁用core 转储。我的猜测(可能是错误的)是过小的核心限制尺寸可能与您的观察结果一致。

如果您的交互式 Unix shell 是 /bin/bash(例如 fish),请务必阅读其文档。另请参阅passwd(5)、ps(1) - 用作ps $$、pstree(1)、top(1)。

另见proc(5)。在运行程序之前,您可以在终端中尝试cat /proc/$$/limits/bin/cat /self/limits。也许需要/bin/cat /proc/version 来了解更多。

您的 Linux kernel 也可以配置为避免 core 转储。询问kernelnewbies 的详细信息并阅读有关SE Linux 的更多信息。一些 Linux 内核接受 gzcat /proc/config.gz 作为 root,但其他不接受,以查询它们的配置。您可能需要使用sudo(8) 或su(1) 进行root 访问。见credentials(7)。

在 Linux 上,您可能会对 Ian Taylor libbacktrace 感兴趣。 RefPerSys 和 GCC 正在使用它。

【讨论】:

与以前的雇主一起,我的一些同事运行“pstack”以查看核心转储的堆栈跟踪。也许这也可能包含可执行文件的名称? 我们有一个机制来获取堆栈跟踪,但不幸的是它不可用,因为提到的错误ss: ELF 64-bit LSB core file x86-64, version 1 (SYSV), too many program header sections (6841)

以上是关于从核心转储中检索可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

如何调试从执行发布文件生成的核心转储文件?

(Mac) 将核心文件留在可执行文件所在的位置,而不是 /cores?

C++学习(三九五)ELF类型文件

如何获取可执行文件的字符串转储?

从解密的 iOS 应用程序可执行文件中查找常量

如何在 UNIX/Linux 中对生产应用程序进行核心转储分析?