首页 > 解决方案 > 从核心转储中检索可执行文件

问题描述

我想从核心转储中检索可执行文件,并且用于获取此信息的任何 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在其输出中的核心转储中检索可执行文件。

标签: linuxexecutablerhelcoredump

解决方案


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

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

DWARF 调试信息是通过编译和链接你的程序获得的——如果它是用GCC(或Clang)编译的,所以使用最近的gcc, g++, gfortran, clang,clang++命令——带有-g-g2....)标志。

请注意setrlimit(2)。您可能需要使用ulimitGNU 的内置函数bash(请参阅bash(1)GNU bash 的文档...),或者使用 GNU 的limit 内置函数zsh增加core文件大小限制

如果您的core转储限制大小(即RLIMIT_COREfor 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内核也可以配置为避免core转储。询问有关kernelnewbies的详细信息并阅读有关SE Linux的更多信息。一些 Linux 内核接受gzcat /proc/config.gz以 root 身份,但其他不接受,以查询它们的配置。您可能需要使用sudo(8)su(1)进行 root 访问。见凭证(7)

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


推荐阅读