使用crash参照用户进程的符号信息的方法

crash命令不使用gcore命令也可以获得添加了符号信息的进程用户内存。使用add-symbol-file命令添加用户进程的符号信息。add-symbol-file命令是gdb命令之一。crash沿用gdb的代码,可以从crash使用一些gdb命令。crash启动时读入的符号信息与gdb vmlinux的情况相同。

add-symbol-file命令的第1参数提取包括应用程序符号信息的obj文件,第2参数提取与符号信息相对应的文本区域的开始地址。按照如下方式找出文本区域的开始地址。

使用crash参照用户进程的符号信息的方法 - 图1

首先使用vm命令显示crash进程所管理的部分内存区域。可以看出,从第5行以后的FILE项目开始,把crash的执行文件映射到最前面的2个内存区域。


crash>vm-f 8001875

8001875:(READ|EXEC|MAYREAD|MAYWRITE|MAYEXEC|DENYWRITE|EXECUTABLE)


然后使用vm-f命令,在FLAGS项目显示设置的标志。由于设置了EXECUTABLE标志,因此可以看出是映射到可执行文件的文本区域。这个文本区域的开始地址是START项目中显示的400000。请注意是以十六进制显示的。

按照下列方式,根据文本区域添加符号信息。


crash>add-symbol-fle./crash 0x400000


这样就可以从crash命令使用crash的符号信息。尝试显示crash中使用的全局变量program_context。为了根据变量名称能够联想到这个变量,这个变量中保存了crash的程序上下文的相关数据。对应的地址为用户空间的地址,因此就需要在p命令中使用-u选项。


crash>p-u program_context|head

$7={

program_name=0x7fff3a2f7955"crash",

program_path=0x7fff3a2f7953"./crash",

program_version=0x89f92d"5.1.5",

gdb_version=0x9129a0"7.0",

prompt=0x2435ce0"crash>",

flags=2306124484192570375,

namelist=0x7fff3a2f795b"/usr/lib/debug/lib/modules/2.6.32-71.el6.x86_64/vmlinux",

dumpfile=0x0,

live_memsrc=0x7fff3a2f7993"/dev/crash",