如何在Linux Kernel Crash Dump中检查“USER进程”的回溯

时间:2011-11-09 10:33:58

标签: linux coredump

我试图在Linux Crash Dump中调试USER进程。

转到崩溃转储的正常步骤是:

  1. 转到转储所在的路径。
  2. 使用命令crash kernel_link dump.201104181135
  3. kernel_link是我为vmlinux图像创建的软链接。

    现在您将进入CRASH提示符。 如果您运行命令foreach <PID Of the process> bt 例如:

    crash> **foreach 6920 bt**
    
    **PID: 6920   TASK: ffff88013caaa800  CPU: 1   COMMAND: **"**climmon**"****
    
     #0 [ffff88012d2cd9c8] **schedule** at ffffffff8130b76a
     #1 [ffff88012d2cdab0] **schedule_timeout** at ffffffff8130bbe7
     #2 [ffff88012d2cdb50] **schedule_timeout_uninterruptible** at ffffffff8130bc2a
     #3 [ffff88012d2cdb60] **__alloc_pages_nodemask** at ffffffff810b9e45
     #4 [ffff88012d2cdc60] **alloc_pages_curren**t at ffffffff810e1c8c
     #5 [ffff88012d2cdc90] **__page_cache_alloc** at ffffffff810b395a
     #6 [ffff88012d2cdcb0] **__do_page_cache_readahead** at ffffffff810bb592
     #7 [ffff88012d2cdd30] **ra_submit** at ffffffff810bb6ba
     #8 [ffff88012d2cdd40] **filemap_fault** at ffffffff810b3e4e
     #9 [ffff88012d2cdda0] **__do_fault** at ffffffff810caa5f
     #10 [ffff88012d2cde50] **handle_mm_fault** at ffffffff810cce69
     #11 [ffff88012d2cdf00] **do_page_fault** at ffffffff8130f560
     #12 [ffff88012d2cdf50] **page_fault** at ffffffff8130d3f5
    
        RIP: 00007fd02b7e9071  RSP: 0000000040e86ea0  RFLAGS: 00010202
        RAX: 0000000000000000  RBX: 0000000000000000  RCX: 00007fd02b7e9071
        RDX: 0000000000000000  RSI: 0000000000000000  RDI: 0000000040e86ec0
        RBP: 0000000040e87140   R8: 0000000000000800   R9: 0000000000000000
        R10: 0000000000000000  R11: 0000000000000202  R12: 00007fff16ec43d0
        R13: 00007fd02bcadf00  R14: 0000000040e87950  R15: 0000000000001000
        ORIG_RAX: ffffffffffffffff  CS: 0033  SS: 002b
    

    如果检查上面的回溯,它会显示用于调度/处理页面错误的内核函数,但不显示在USER进程中执行的函数(例如。climmon)。 所以我无法调试此过程,因为我无法看到该过程中执行的函数。 任何人都可以帮我解决这个案子吗?

3 个答案:

答案 0 :(得分:1)

您无法从内核崩溃转储调试用户空间进程。如果您的内核崩溃,那肯定是内核的错误而不是某些用户空间进程。无论在哪个用户空间进程上运行,内核都应始终正常运行。如果要调试用户空间进程,我建议查看ltrace,strace和gdb。

来自toptal.com的Gergely

答案 1 :(得分:1)

使用gdb加载转储:   gdb vmlinux

加载这些gdb宏:http://www.kernel.org/doc/Documentation/kdump/gdbmacros.txt

(gdb)source gdbmacros.txt

使用'btt'“转储使用CONFIG_FRAME_POINTER编译的内核上的所有线程堆栈跟踪”:

(gdb)btt

使用'bttnobp'“转储使用!CONFIG_FRAME_POINTER编译的内核上的所有线程堆栈跟踪”:

(gdb)bttnobp

答案 2 :(得分:0)

我不知道这是不是你想要的。但你可以尝试崩溃扩展调用“gcore”。它可以从内核崩溃文件中转储用户进程核心。

另外,请确保在转储时包含用户页面。