有没有办法在 Linux 内核中工作时暂时暂停代码执行(出于调试目的),比如 getchar() 或 system("PAUSE") 类型的操作?
4 回答
您需要的是 GNU 调试器,gdb
. 请记住,您必须使用-g
标志编译代码才能使其正常工作。
例如:
$ gcc -g -o out -c file.c
然后通过调试器执行你的程序:
$ gdb ./out <params>
gdb
如果您对用法一无所知
,则值得阅读手册页。$ man gdb
一般有gdb远程调试程序:
http://davis.lbl.gov/Manuals/GDB/gdb_17.html
我不确定是否可以通过这种方式调试 linux 内核。
FreeBSD 内核可能允许这样做:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/kerneldebug-online-gdb.html
是的,在技术上可以通过 kgdb(和单独的机器,因为它通常通过串行端口连接)动态调试内核。
更实用的方法是生成内核转储并对其进行调试(只需谷歌它,它相当简单)。
如果您确实需要调试内核的运行部分,请为自己创建一个工作线程并对其进行调试(它不会锁定您的系统)。
您可以通过函数 set_current_state(TASK_STOPPED) 暂停工作线程,并且要“解冻”它,您必须使用 set_task_state(task_mm_struct_pointer, TASK_INTERRUPTIBLE)
内核本身至少有两个为此目的而设计的工具(假设您要调试内核代码,而不是用户空间代码)。它们都共享相同的框架,因此它们的设置方式非常相似:
KDB
- 它允许您在没有任何额外软件工具的情况下进行有限的调试。在某些情况下(例如,当您拥有 KMS 图形驱动程序和 PS/2 键盘时)甚至可以在同一台机器上执行此操作。我的 Fedora 内核已KDB
编译支持,并且我的笔记本电脑中有英特尔显卡,因此我可以执行以下操作:echo kms,kdb > /sys/module/kgdboc/parameters/kgdboc
在我的计算机上启用 KDB。现在,如果我想开始调试会话,我所要做的就是调用:
echo g > /proc/sysrq-trigger
现在(几乎)整个内核将被停止,我将得到
kdb
提示。要退出kdb
并恢复正常的内核操作,我会键入go
. 您可以在kdb
控制台中执行大量操作,只需键入help
即可了解它们另一种机制是
KGDB
允许您为了激活kgdb
我会kgdb
从kdb
提示符运行命令 - 这会将调试器切换到kgdb
模式。连接成熟的调试器 (gdb
) 并为其提供内核映像以访问内核中的所有符号。kgdb
您可以像 一样激活,使用内核参数kdb
配置其输出。kdboc
但是,在这种情况下,您需要串行连接到将运行的其他计算机kdb
。所以你会使用类似的东西:echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc
现在,如果您同时启用
kdb
并kgdb
启用了两者,则默认情况下将运行第一个。您可以使用命令从 shell进入kgdb
模式。也可以通过键入返回。现在,如果您处于模式下,请在使用串行连接的第二台计算机上打开,将您的作为参数并使用类似的东西连接到您要调试的计算机。kdb
kgdb
kdb
$3#33
kgdb
gdb
vmlinux
target remote /dev/ttyS0
这些是基础知识,您可以Documentation/DocBook/kgdb.tmpl
在内核源代码中找到更多信息。