debugging - Linux内核实时调试是如何完成的,使用了哪些工具?

标签 debugging linux-kernel kernel

什么是最常见的以及为什么不常用的方法和工具不在 Linux 内核上进行实时调试?

我知道 Linus ,例如 is against这种针对 Linux 内核的调试,或者至少是,因此在那些年里,在这个意义上并没有做太多的事情,但老实说,自 2000 年以来已经过去了很多时间,我很感兴趣这种心态是否已经改变,关于 Linux 项目和目前使用哪些方法在 Linux 内核上进行实时调试(本地或远程)?

欢迎引用有关上述技术和工具的演练和教程。

最佳答案

另一种选择是使用 ICEJTAG Controller 和 GDB。这种“硬件”解决方案特别适用于嵌入式系统。

但是例如 QEMU提供类似的功能:

  • 使用 GDB 'remote' stub 启动 QEMU,该 stub 在 'localhost:1234' 上监听:qemu -s ...,

  • 然后使用 GDB,您打开使用调试信息编译的内核文件 vmlinux(您可以查看 this mailing list thread,他们讨论了内核的未优化)。

  • 连接 GDB 和 QEMU:target remote localhost:1234

  • 查看你的 live 内核:

      (gdb) where
      #0  cpu_v7_do_idle () at arch/arm/mm/proc-v7.S:77
      #1  0xc0029728 in arch_idle () atarm/mach-realview/include/mach/system.h:36
      #2  default_idle () at arm/kernel/process.c:166
      #3  0xc00298a8 in cpu_idle () at arch/arm/kernel/process.c:199
      #4  0xc00089c0 in start_kernel () at init/main.c:713
    

不幸的是,到目前为止,使用 GDB 无法进行用户空间调试(没有任务列表信息,没有 memory management unit 重新编程以查看不同的进程上下文,...),但是如果您留在内核空间,那将非常方便.

  • info threads 将为您提供不同 CPU 的列表和状态

您可以在此 PDF 中获得有关该过程的更多详细信息:

Debugging Linux systems using GDB and QEMU .

关于debugging - Linux内核实时调试是如何完成的,使用了哪些工具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4943857/

相关文章:

c - 对 `printk' 的 undefined reference

linux - submit_bio()一次可以取多少数据

ruby - 调试 Sinatra 应用程序

debugging - Monodevelop: `Waiting for debugger`

c - 什么会导致 printk 不会立即显示在 dmesg 中?

c - 无法从内核模块中的 net_device 获取 mac 地址

c - Linux 内核模块 : Socket buffer (sk_buff->len) non-deterministic behaviour

ios - xcode 调试 - 快速跨过汇编代码回到我的自定义代码

c - 为什么使用GDB检查时,某些局部变量没有列在相应的堆栈帧中?

c++ - "read_format"结构的 "perf_event_attr"属性的选项到底是什么?