在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. 暫停Linux內核函數
- 2. 在jQuery中暫停代碼執行
- 3. 在Linux內核源代碼中執行系統調用/陷阱
- 4. 如何暫停代碼執行?
- 5. Javascript代碼執行暫停問題
- 6. FlexPrintJob暫停Flex代碼執行
- 7. 爲代碼動畫暫停JavaScript執行
- 8. 檢查Linux內核中斷在暫停後恢復系統
- 9. 從JS中暫停在chrome中的代碼執行。可能?
- 10. 在C#中暫停執行
- 11. 在Python中暫停執行
- 12. 暫停執行
- 13. 在Python C API代碼中引發異常並暫停執行
- 14. 暫停代碼
- 15. 在Linux內核空間執行程序
- 16. 如何暫停內核模塊(Linux)中的任務?
- 17. Linux內核代碼中的「當前」
- 18. Linux。 munlockall()在內核源代碼
- 19. Java暫停執行
- 20. 如何在錯誤時暫停執行vba代碼?
- 21. 我們可以在startActivity()暫停之前執行代碼嗎?
- 22. 如何在等待UIAlertView響應時暫停代碼執行?
- 23. VB.Net暫停代碼
- 24. AlertView暫停代碼
- 25. Linux內核對進程暫停的時間有什麼保證?
- 26. 停止執行代碼時在Page_Load中
- 27. 停止代碼在查詢中執行
- 28. 如何在JavaScript中暫停執行?
- 29. 在UIWebView中暫停JavaScript執行
- 30. 在Java GUI中暫停執行
你的意思是暫停整個內核?然後誰會執行其他任何事情(如調試器)? – m0skit0 2013-03-14 15:23:24
您無法在某些機器上暫停內核,例如,某些筆記本電腦的內核管理其冷卻系統 - 如果停止它,機器可能會過熱。你可能想使用'kgdb' .... – 2013-03-14 18:51:09