[英]What to do with a process dump?
我正在尝试更深入地了解程序的工作原理。 我遇到有人写“进程转储”,那个人说进程转储可能是从程序中获取信息的一种方式。 我已经在我的 Linux 机器上尝试了这个进程转储(jimbob 博士的回答)方法,并从我使用脚本的程序中获得了一个巨大的文件。 它主要包含诸如^@^@^@ ^Q^@^@^@^@^@^@^@^@^@^@^@^@^@ ^O^@^@ ^@^@^@^@^@^@^@^@^@^@^@
但是文件中有一些字符串和大量随机信息(例如库)。 我猜 @ 符号和其他随机符号组合只是程序中未格式化为 UTF-8/字母格式的东西。 我也试过这种方法,得到了很多 .dump 文件。
我的问题归结为:我如何实际读取转储文件并获取相关信息? 因为我正在寻找的是可读信息,而不是 @ 符号,所以做类似strings file.dump
事情不是更有效吗?
如果您只想检查一些字符串, strings file.dump
非常好。
通常,您要检查函数堆栈和特定变量的值(通常是二进制的 - 所以strings
不起作用)。 为此,您可以将核心转储加载到调试器中,例如:
转储进程 9319 (bash):
gcore 9319
加载到 gdb:
gdb bash core.9319
然后继续进行,就好像它是一个实时过程。 例如,转储堆栈跟踪:
(gdb) bt
#0 0x00007f5ef50318a7 in __GI___waitpid (pid=-1, stat_loc=0x7ffd567683d0,
options=10) at ../sysdeps/unix/sysv/linux/waitpid.c:30
#1 0x000055ef3ea89869 in ?? ()
#2 0x000055ef3ea8acc3 in wait_for ()
#3 0x000055ef3ea78b85 in execute_command_internal ()
#4 0x000055ef3ea78df2 in execute_command ()
#5 0x000055ef3ea60833 in reader_loop ()
#6 0x000055ef3ea5f104 in main ()
或检查一些全局变量:
(gdb) print (int)history_length
$1 = 81
如果您的程序具有调试符号(使用 -g 编译)会有所帮助 - 您将看到更多信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.