我正在尝试更深入地学习程序的工作方式。我碰到有人写“进程转储”的文章,那个人说进程转储可能是从程序中获取信息的一种方式。我已经在我的Linux机器上尝试了process dumping(dr jimbob的答案)方法,并从使用该脚本的程序中获取了一个巨大的文件。它主要包含^@^@^@��^Q^@^@^@^@^@^@^@^@^@^@^@^@^@�^O^@^@���^@^@^@^@^@^@^@^@^@^@^@
之类的内容,但文件中包含一些字符串和大量随机信息(例如库)。我猜想@符号和其他符号的随机组合只是程序中没有以UTF-8 /字母格式格式化的东西。我也尝试了this method,并获得了很多.dump文件。
我的问题归结为:如何实际读取转储文件并获取相关信息?因为我正在寻找的是可读信息,而不是@符号,所以执行strings file.dump
之类的操作不是更有效吗?
[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编译,这会有所帮助-您会看到很多信息,这会有所帮助]