1

有没有办法在 Linux 内核中工作时暂时暂停代码执行(出于调试目的),比如 getchar() 或 system("PAUSE") 类型的操作?

4

4 回答 4

1

您需要的是 GNU 调试器,gdb. 请记住,您必须使用-g标志编译代码才能使其正常工作。

例如: $ gcc -g -o out -c file.c

然后通过调试器执行你的程序: $ gdb ./out <params>

gdb如果您对用法一无所知 ,则值得阅读手册页。$ man gdb

于 2013-03-14T15:24:31.077 回答
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

于 2013-03-14T15:39:04.203 回答
1

是的,在技术上可以通过 kgdb(和单独的机器,因为它通常通过串行端口连接)动态调试内核。

更实用的方法是生成内核转储并对其进行调试(只需谷歌它,它相当简单)。

如果您确实需要调试内核的运行部分,请为自己创建一个工作线程并对其进行调试(它不会锁定您的系统)。

您可以通过函数 set_current_state(TASK_STOPPED) 暂停工作线程,并且要“解冻”它,您必须使用 set_task_state(task_mm_struct_pointer, TASK_INTERRUPTIBLE)

于 2015-04-22T17:52:33.107 回答
0

内核本身至少有两个为此目的而设计的工具(假设您要调试内核代码,而不是用户空间代码)。它们都共享相同的框架,因此它们的设置方式非常相似:

  • 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我会kgdbkdb提示符运行命令 - 这会将调试器切换到kgdb模式。连接成熟的调试器 ( gdb) 并为其提供内核映像以访问内核中的所有符号。kgdb您可以像 一样激活,使用内核参数kdb配置其输出。kdboc但是,在这种情况下,您需要串行连接到将运行的其他计算机kdb。所以你会使用类似的东西:

    echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc
    

    现在,如果您同时启用kdbkgdb启用了两者,则默认情况下将运行第一个。您可以使用命令从 shell进入kgdb模式。也可以通过键入返回。现在,如果您处于模式下,请在使用串行连接的第二台计算机上打开,将您的作为参数并使用类似的东西连接到您要调试的计算机。kdbkgdbkdb$3#33kgdbgdbvmlinuxtarget remote /dev/ttyS0

这些是基础知识,您可以Documentation/DocBook/kgdb.tmpl在内核源代码中找到更多信息。

于 2015-04-23T15:58:07.753 回答