暂停Linux内核中的代码执行

时间:2013-03-14 15:20:50

标签: linux debugging linux-kernel kernel

有没有办法在Linux内核中工作时临时暂停代码执行(用于调试目的),比如getchar()或系统(“PAUSE”)类型操作?

4 个答案:

答案 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中找到更多信息。