【问题标题】:What to do with a process dump?如何处理进程转储?
【发布时间】:2023-03-29 22:13:01
【问题描述】:

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

我的问题归结为:我如何实际读取转储文件并获取相关信息?像strings file.dump 这样的事情不是更有效率吗,因为我要寻找的是可读信息,而不是@ 标志?

【问题讨论】:

    标签: linux debugging dump


    【解决方案1】:

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

    【讨论】:

    • 执行您的过程会导致 gdb 内部出现以下错误:warning: core file may not match specified executable file.warning: Section .reg/55397' in core file too small.,以及其他一些错误。您的方法与我使用的两种方法有区别吗?它们产生相同的数据吗?
    • 您需要与 gdb 兼容的核心转储才能正常工作。看起来您的两种方法将所有内存区域合并在一起 - gdb 不适用于它们。
    • 只是为了澄清一下:我运行 gdb 的方式与您使用 gcore 在进程转储上所做的完全一样。
    • 它应该可以工作。确保您将正确的二进制文件传递给 gdb(核心必须匹配可执行文件):gdb [some_program] [core_dump_from_that_program]
    • 我 100% 确定它是同一个二进制文件。它没有全局变量,没有来自print,没有来自bt。这是一个我已经研究了几个月的程序,它有很多变量和其他东西。很奇怪。
    猜你喜欢
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2012-07-14
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    相关资源
    最近更新 更多