繁体   English   中英

如何处理进程转储?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM