如何处理转储?

我正在尝试更深入地学习程序的工作方式。我碰到有人写“进程转储”的文章,那个人说进程转储可能是从程序中获取信息的一种方式。我已经在Linux机器上尝试了此process dumping(dr jimbob的答案)方法,并从使用脚本的程序中获取了一个巨大的文件。它主要包含^@^@^@��^Q^@^@^@^@^@^@^@^@^@^@^@^@^@�^O^@^@���^@^@^@^@^@^@^@^@^@^@^@之类的内容,但文件中包含一些字符串和大量随机信息(例如库)。我猜想@符号和其他符号的随机组合只是程序中没有以UTF-8 /字母格式格式化的东西。我还尝试了this method,并获得了很多.dump文件。

我的问题归结为:如何实际读取转储文件并获取相关信息?因为我正在寻找的是可读信息,而不是@符号,所以执行strings file.dump之类的效率不是更高吗?

ychzd_ok 回答:如何处理转储?

strings file.dump很好,如果您只想检查一些字符串。

通常,您要检查函数堆栈和特定变量的值(它们通常是二进制的-因此strings不起作用)。为此,您可以将核心转储加载到调试器中,例如:

转储过程9319(重击):

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编译),它会有所帮助-您将看到很多信息

本文链接:https://www.f2er.com/3002270.html

大家都在问