2013-03-14 111 views
1

在Linux内核中工作时,像是使用getchar()还是系统(“PAUSE”)类型的操作,是否可以暂时暂停代码执行(用于调试目的)?在Linux内核中暂停代码执行

+1

你的意思是暂停整个内核?然后谁会执行其他任何事情(如调试器)? – m0skit0 2013-03-14 15:23:24

+1

您无法在某些机器上暂停内核,例如,某些笔记本电脑的内核管理其冷却系统 - 如果停止它,机器可能会过热。你可能想使用'kgdb' .... – 2013-03-14 18:51:09

回答

1

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

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

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

它值得一读的gdb手册页,如果你没有使用的任何想法。 $ man gdb

+3

但是原始的海报想要(显然)暂停他的整个内核.... – 2013-03-14 18:25:39

+0

@BasileStarynkevitch它说“代码执行......在Linux内核中工作时”。据我所知'getchar()'不是内核函数,是吗?我认为他不知道如何要求调试器。 – KiaMorot 2013-03-18 09:00:23

+0

@KiaMorot getchar和system(“PAUSE”)是非常类似的窗口技术,可以阻止用户空间程序的执行。 如果他实际上是在问如何做到这一点,但在Linux内核中,那么这个答案是不正确的。 – AoeAoe 2016-05-10 10:10:44

1

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

虽然更实际的方法是生成内核转储和调试(只是谷歌它,它是相当简单的)。

如果你真的需要调试内核的运行部分,创建一个工作线程并调试它(它不会锁定你的系统)。

您可以暂停通过功能set_current_state您的工作线程(TASK_STOPPED), 并以“解冻”它,你将不得不使用set_task_state(task_mm_struct_pointer,TASK_INTERRUPTIBLE)

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

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

    现在,如果你有两个kdbkgdb启用,第一个将被默认运行。您可以使用kgdb命令从kdb shell中输入kgdb模式。输入$3#33也可以返回kdb。现在,如果你在kgdb模式是,在第二台计算机上打开gdb连接使用串口,​​让您的vmlinux作为参数,并使用类似target remote /dev/ttyS0连接到您要调试的计算机。

这些都是基础知识,你可以找到在Documentation/DocBook/kgdb.tmpl在你的内核源的详细信息。