在Linux内核中工作时,像是使用getchar()还是系统(“PAUSE”)类型的操作,是否可以暂时暂停代码执行(用于调试目的)?在Linux内核中暂停代码执行
回答
你需要的是GNU调试器,gdb
。请记住,您必须使用-g
标志编译代码才能使其工作。
例如: $ gcc -g -o out -c file.c
然后通过调试运行你的程序: $ gdb ./out <params>
它值得一读的gdb
手册页,如果你没有使用的任何想法。 $ man gdb
但是原始的海报想要(显然)暂停他的整个内核.... – 2013-03-14 18:25:39
@BasileStarynkevitch它说“代码执行......在Linux内核中工作时”。据我所知'getchar()'不是内核函数,是吗?我认为他不知道如何要求调试器。 – KiaMorot 2013-03-18 09:00:23
@KiaMorot getchar和system(“PAUSE”)是非常类似的窗口技术,可以阻止用户空间程序的执行。 如果他实际上是在问如何做到这一点,但在Linux内核中,那么这个答案是不正确的。 – AoeAoe 2016-05-10 10:10:44
一般来说,有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
是的,技术上是可行的调试内核上通过的kgdb飞(和单独的机器,因为它通常通过串行端口连接)。
虽然更实际的方法是生成内核转储和调试(只是谷歌它,它是相当简单的)。
如果你真的需要调试内核的运行部分,创建一个工作线程并调试它(它不会锁定你的系统)。
您可以暂停通过功能set_current_state您的工作线程(TASK_STOPPED), 并以“解冻”它,你将不得不使用set_task_state(task_mm_struct_pointer,TASK_INTERRUPTIBLE)
但是也有一些专为至少两个工具(假设你想调试内核代码,而不是用户空间代码)。他们都共享同一个框架,以便它们在如何设置他们颇为相似:
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
现在,如果你有两个
kdb
和kgdb
启用,第一个将被默认运行。您可以使用kgdb
命令从kdb
shell中输入kgdb
模式。输入$3#33
也可以返回kdb
。现在,如果你在kgdb
模式是,在第二台计算机上打开gdb
连接使用串口,让您的vmlinux
作为参数,并使用类似target remote /dev/ttyS0
连接到您要调试的计算机。
这些都是基础知识,你可以找到在Documentation/DocBook/kgdb.tmpl
在你的内核源的详细信息。
- 1. 在jQuery中暂停代码执行
- 2. FlexPrintJob暂停Flex代码执行
- 3. 为代码动画暂停JavaScript执行
- 4. 如何暂停代码执行?
- 5. 从JS中暂停在chrome中的代码执行。可能?
- 6. 暂停执行
- 7. 在Linux内核空间执行程序
- 8. Java暂停执行
- 9. 如何在错误时暂停执行vba代码?
- 10. 如何在等待UIAlertView响应时暂停代码执行?
- 11. 我们可以在startActivity()暂停之前执行代码吗?
- 12. AlertView暂停代码
- 13. Linux内核对进程暂停的时间有什么保证?
- 14. 停止执行代码时在Page_Load中
- 15. 停止代码在查询中执行
- 16. 如何在JavaScript中暂停执行?
- 17. Linux内核代码空间写保护
- 18. 暂停代码的执行,而不是应用程序
- 19. 暂停代码执行,直到按下UIAlertView按钮?
- 20. 调用函数导致代码执行暂停?
- 21. Linux内核模块:在运行时动态加载代码
- 22. Linux内核启动在Uncompressing Linux中停止...好吧,启动内核
- 23. 停止执行代码
- 24. ASP.NET:停止代码执行
- 25. HTTPHandler:IRequiresSessionState暂停执行页面
- 26. 如何暂停PerformSelector执行?
- 27. 类星体暂停执行
- 28. Python暂停线程执行
- 29. curl暂停脚本执行
- 30. stdlib.h在Linux内核中的替代?
你的意思是暂停整个内核?然后谁会执行其他任何事情(如调试器)? – m0skit0 2013-03-14 15:23:24
您无法在某些机器上暂停内核,例如,某些笔记本电脑的内核管理其冷却系统 - 如果停止它,机器可能会过热。你可能想使用'kgdb' .... – 2013-03-14 18:51:09