Linux 如何处理进程转储?

Linux 如何处理进程转储?,linux,debugging,dump,Linux,Debugging,Dump,我试图在更深层次上学习程序是如何工作的。我遇到一个写“进程转储”的人,那个人说进程转储可能是从程序中获取信息的一种方式。我在我的Linux机器上尝试了这个(jimbob博士的答案)方法,从我使用脚本的程序中得到了一个巨大的文件。它主要包含^@^@^@��^Q^@^@^@^@^@^@^@^@^@^@^@^@^@�^O^@^@���^@^@^@^@^@^@^@^@^@^@^@但是文件中有一些字符串和大量随机信息(例如库)。我猜@符号和其他符号的随机组合只是程序中没有UTF-8/字母格式的东西。我也尝

我试图在更深层次上学习程序是如何工作的。我遇到一个写“进程转储”的人,那个人说进程转储可能是从程序中获取信息的一种方式。我在我的Linux机器上尝试了这个(jimbob博士的答案)方法,从我使用脚本的程序中得到了一个巨大的文件。它主要包含
^@^@^@��^Q^@^@^@^@^@^@^@^@^@^@^@^@^@�^O^@^@���^@^@^@^@^@^@^@^@^@^@^@
但是文件中有一些字符串和大量随机信息(例如库)。我猜@符号和其他符号的随机组合只是程序中没有UTF-8/字母格式的东西。我也尝试过,得到了很多.dump文件


我的问题归结为:如何读取转储文件并获取相关信息?像
strings file.dump
这样的操作不是更有效吗?因为我要查找的是可读信息,而不是@signs?

strings文件。如果您只想检查一些字符串,dump
非常好

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

转储进程9319(bash):

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

执行过程会导致gdb中出现以下错误:
警告:核心文件可能与指定的可执行文件不匹配。
警告:核心文件中的.reg/55397'部分太小。
,以及其他一些错误。你的方法和我使用的两种方法有区别吗?它们产生相同的数据吗?您需要gdb兼容的内核转储才能工作。看起来您的两个方法将所有内存区域合并在一起-gdb对它们不起作用。只是澄清一下:我运行gdb的方式与您在使用gcore的进程转储上所做的完全相同。然后它应该可以工作。确保您将正确的二进制文件传递给gdb(core必须匹配可执行文件):
gdb[某个程序][core\u dump\u from\u该程序]
我100%确定它是相同的二进制文件。它没有全局变量,没有来自
print
的任何内容,也没有来自
bt
的任何内容。这是一个我已经做了几个月的程序,它有很多很多变量和其他东西。奇怪的
(gdb) print (int)history_length 
$1 = 81