我试图在Linux Crash Dump中调试USER进程。
转到崩溃转储的正常步骤是:
crash kernel_link dump.201104181135
。 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
)。
所以我无法调试此过程,因为我无法看到该过程中执行的函数。
任何人都可以帮我解决这个案子吗?
答案 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”。它可以从内核崩溃文件中转储用户进程核心。
另外,请确保在转储时包含用户页面。