linux - 从核心转储中检索可执行文件
问题描述
我想从核心转储中检索可执行文件,并且用于获取此信息的任何 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
在其输出中的核心转储中检索可执行文件。
解决方案
尝试在你的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)。您可能需要使用ulimit
GNU 的内置函数bash
(请参阅bash(1)和GNU bash 的文档...),或者使用 GNU 的limit
内置函数zsh
来增加core
文件大小限制。
如果您的core
转储限制大小(即RLIMIT_CORE
for 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 感兴趣。RefPerSys和GCC正在使用它。
推荐阅读
- python - 使用 Python 插入 MySQL 表
- android - 在 XAML 中激活 ViewCell 需要做什么?
- javascript - 如何在 Typescript 的列表中查找对象的属性
- python - 在标准化之前/之后训练/测试我的多项式回归时的不同 RMSE
- ios - iTunes 搜索 api 从结果中获取所有曲目
- mysql - MySQL中函数的执行顺序
- java - 如何通过 Java 8 中的过滤器/谓词的多种组合来检索列表对象?
- c++ - 支持引用、值和指针的模板函数?
- asp.net-mvc - 如何在实体框架中更新具有父级的子级
- reactjs - 使用 react-intl,但返回值被转义