如果没有挖掘GDB源代码,我在哪里可以找到有关用于创建核心文件的格式的文档?
在ELF规范离开核心文件格式打开,所以我想这应该是GDB规范的一部分!遗憾的是,我没有从GNU的gdb文档中找到任何帮助.
这就是我要做的事情:将虚拟地址映射到包含正在运行的进程的可执行文件/库中的函数名称.为此,我首先要从核心文件中找出从虚拟地址空间到可执行文件/库的名称的映射,然后深入到相关文件中以获取符号信息.
现在'readelf -a core'告诉我核心文件中的几乎所有段都是'load'类型 - 我猜这些是来自所有参与文件的.text和.bss/.data段,加上堆栈段.除了这些加载段,有一个音符段,但似乎不包含地图.那么关于哪个文件段对应的信息如何存储在核心文件中?这些"加载"段是否以特定方式格式化以包含文件信息?
ysd*_*sdx 10
核心转储文件格式使用ELF格式,但未在ELF标准中描述.AFAIK,对此没有权威性的参考.
那么关于哪个文件段对应的信息如何存储在核心文件中?
ELF注释中包含许多额外信息.你可以用它readelf -n来看看它们.
CORE/NT_FILE注释定义了内存地址范围和文件(+ offset)之间的关联:
Page size: 1
Start End Page Offset
0x0000000000400000 0x000000000049d000 0x0000000000000000
/usr/bin/xchat
0x000000000069c000 0x00000000006a0000 0x000000000009c000
/usr/bin/xchat
0x00007f2490885000 0x00007f24908a1000 0x0000000000000000
/usr/share/icons/gnome/icon-theme.cache
0x00007f24908a1000 0x00007f24908bd000 0x0000000000000000
/usr/share/icons/gnome/icon-theme.cache
0x00007f24908bd000 0x00007f2490eb0000 0x0000000000000000
/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf
[...]
Run Code Online (Sandbox Code Playgroud)
对于每个线程,您应该有一个CORE/NT_PRSTATUS注释,它为您提供线程的寄存器(包括堆栈指针).您可能能够从中推断出堆栈的位置.
有关ELF核心文件格式的更多信息: