【发布时间】:2019-09-08 09:29:38
【问题描述】:
我知道如何通过qemu-gdbserver 使用-s 开关设置内核调试。在 Linux 中,内核内存是不可交换的。因此,内核虚拟地址对于系统中的所有进程保持相同。在内核地址上设置断点不是问题。但是,系统上运行的多个进程可能具有重叠的地址范围,但在它们自己的地址空间上。有没有办法在(a)已经运行的特定进程上设置断点,并且我知道它的 PID? (b) 将要创建的特定进程并且我知道二进制/应用程序的名称?
【问题讨论】:
我知道如何通过qemu-gdbserver 使用-s 开关设置内核调试。在 Linux 中,内核内存是不可交换的。因此,内核虚拟地址对于系统中的所有进程保持相同。在内核地址上设置断点不是问题。但是,系统上运行的多个进程可能具有重叠的地址范围,但在它们自己的地址空间上。有没有办法在(a)已经运行的特定进程上设置断点,并且我知道它的 PID? (b) 将要创建的特定进程并且我知道二进制/应用程序的名称?
【问题讨论】:
QEMU 的 gdbstub 本质上是一个“系统级”调试,类似于您从 JTAG 调试器获得的。任何对客户操作系统特定概念(如用户进程)知识的支持都需要在调试器中(它通过对客户操作系统内部的足够了解来查询操作系统进程表、为操作系统切换任务时设置断点来工作)等)。
您可能会在这里查看内核的 gdb 帮助程序脚本是否有任何用处,尽管我不确定它们是否像“用户进程中的断点”一样复杂: https://www.kernel.org/doc/html/latest/dev-tools/gdb-kernel-debugging.html
【讨论】: