2013-03-14 59 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在你的內核源的詳細信息。