使用crash参照用户进程的符号信息的方法
crash命令不使用gcore命令也可以获得添加了符号信息的进程用户内存。使用add-symbol-file命令添加用户进程的符号信息。add-symbol-file命令是gdb命令之一。crash沿用gdb的代码,可以从crash使用一些gdb命令。crash启动时读入的符号信息与gdb vmlinux的情况相同。
add-symbol-file命令的第1参数提取包括应用程序符号信息的obj文件,第2参数提取与符号信息相对应的文本区域的开始地址。按照如下方式找出文本区域的开始地址。
首先使用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",