从核心转储中检索可执行文件
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)编译的,那么使用最近的gcc
、g++
、@ 987654357@、clang
、clang++
命令 - 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)
以上是关于从核心转储中检索可执行文件的主要内容,如果未能解决你的问题,请参考以下文章