【问题标题】:Pause Code Execution in Linux Kernel在 Linux 内核中暂停代码执行
【发布时间】:2013-03-14 15:20:49
【问题描述】:

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

【问题讨论】:

  • 你的意思是暂停整个内核?那么谁来执行其他任何东西(比如调试器)?
  • 您不能在某些机器上暂停内核,例如,某些笔记本电脑的冷却系统由内核管理 - 如果您停止它,机器可能会过热。您可能想使用kgdb ....

标签: linux debugging linux-kernel kernel


【解决方案1】:

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

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

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

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

【讨论】:

  • @BasileStarynkevitch 它说“代码执行......在Linux内核中工作”。据我所知getchar() 不是内核函数,是吗?我认为他不知道如何要求调试器。
  • @KiaMorot getchar 和 system("PAUSE") 都是非常相似的停止用户空间程序执行的 Windows 技术。如果他实际上是在问如何在 Linux 内核中做同样的事情,那么这个答案就不正确了。
【解决方案2】:

一般都有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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-19
        • 1970-01-01
        • 2021-01-18
        • 1970-01-01
        • 2015-09-05
        • 2011-07-01
        • 2021-04-05
        相关资源
        最近更新 更多