有没有办法在Linux内核中工作时临时暂停代码执行(用于调试目的),比如getchar()或系统(“PAUSE”)类型操作?
答案 0 :(得分:1)
您需要的是GNU调试器gdb
。请记住,您必须使用-g
标志编译代码才能使其正常工作。
例如:
$ gcc -g -o out -c file.c
然后通过调试器执行您的程序:
$ gdb ./out <params>
如果您对使用情况一无所知,那么值得阅读gdb
的手册页。
$ man gdb
答案 1 :(得分:1)
一般来说,有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
答案 2 :(得分:1)
是的,技术上可以通过kgdb(和单独的机器)动态调试内核,因为它通常通过串口连接。
更实际的方法是生成内核转储和调试(只是google it,它相当直接)。
如果你真的需要调试内核的运行部分,那么自己创建一个工作线程并进行调试(它不会锁定你的系统)。
您可以通过函数set_current_state(TASK_STOPPED)暂停工作线程, 和#34;解冻&#34;它你将不得不使用set_task_state(task_mm_struct_pointer,TASK_INTERRUPTIBLE)
答案 3 :(得分:0)
至少有两个工具专门用于此目的(假设您要在内核中调试内核代码,而不是用户空间代码)。它们都共享相同的框架,因此它们在如何设置它们时非常相似:
KDB
- 允许您在没有任何其他软件工具的情况下进行有限的调试。在某些情况下(例如,当你有KMS图形驱动程序和PS / 2键盘时),甚至可以在同一台机器上执行此操作。我的fedora内核编译了KDB
支持,我的笔记本电脑中有一块intel显卡,所以我可以这样做:
echo kms,kdb > /sys/module/kgdboc/parameters/kgdboc
在我的计算机上启用KDB。现在,如果我想开始调试会话,我所要做的就是调用:
echo g > /proc/sysrq-trigger
现在(几乎)整个内核将被停止,我将看到kdb
提示符。要退出kdb
并恢复正常的内核操作,我会输入go
。您可以在kdb
控制台中执行大量操作,只需键入help
即可了解它们
另一种机制是KGDB
,它允许您激活kgdb
我会从kgdb
提示符运行kdb
命令 - 这会将调试器切换为{ {1}}模式。连接完整的调试器(kgdb
)并为其提供内核映像以访问内核中的所有符号。您可以使用与gdb
相同的方式激活kgdb
,使用kdb
内核参数配置其输出。但是,在这种情况下,您需要与将运行kdboc
的其他计算机进行串行连接。所以你会使用类似的东西:
kdb
现在,如果您同时启用了echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc
和kdb
,则默认情况下会运行第一个。您可以使用kgdb
命令从kgdb
shell进入kdb
模式。也可以通过键入kgdb
返回kdb
。现在,如果您处于$3#33
模式,请在使用serial连接的第二台计算机上打开kgdb
,将gdb
作为参数,并使用类似vmlinux
的内容连接到您要调试的计算机。
这些是基础知识,您可以在内核源代码中的target remote /dev/ttyS0
中找到更多信息。