2013-07-16 39 views
5

是否有可能將gdb附加到正在運行的進程的PID,並且每次程序遇到特定的斷點時gdb都會將堆棧幀輸出到外部文件?自動化GDB在特定斷點處打印堆棧幀

我看過thisthis,但是沒有提到是否可以將gdb附加到已經運行的進程(而不是讓gdb啓動它)。

我可以以其他方式將gdb附加到PID上,但我想自動運行它以運行bt,將輸出存儲在外部文件中,然後運行continue。目前我正在手動完成這項工作,每當遇到斷點時我都必須這樣做,這是一件很痛苦的事情。

+0

好的,這是非常直接的:)它只是它似乎gdb可以自動執行一些命令,當它啓動一個程序,並且因爲你可以檢查一個正在運行的pid就像你剛剛發佈的一樣,感覺它是可能的。 – Nobilis

+0

當然,可以將gdb附加到正在運行的進程中。這是任何調試器的基本必需功能。你嘗試過'man gdb'嗎?在那。 –

+1

@Nobilis,我錯了,你有一些有希望的答案 –

回答

4
Is it possible to have gdb attached to the PID of a running process?? 

是的。可能。

更新:

步驟1:

.gdbinit文件添加下面的命令,

define callstack 
    set $Cnt = $arg0 

    while($Cnt) 
     commands $Cnt 
     silent 
     bt 
     c 
     end 
     set $Cnt = $Cnt - 1 
    end 
end 

步驟2:與-x <path to .gdbinit file >調用GDB。記住PID也適用於運行過程。

第3步:在需要的時候放置斷點。

第4步:調用用戶定義的命令callstack並傳遞中斷點。

gdb> callstack <No.of. Break Points> 

第5步:現在給'c'繼續。 Bcos進程已經在運行。

對於記錄我建議按照@ VoidPointer的答案。

set pagination off 
set logging file gdb.txt 
set logging on 

適合我。 Reference

+0

我應該澄清一下,我有權訪問源代碼,並且程序使用調試符號進行編譯,所以當我將gdb附加到它時,我可以自由設置斷點,查看功能,打印堆棧幀時,我可以得到所有名稱等。這會有什麼區別嗎? – Nobilis

+0

上述步驟將斷點指向您的過程中的所有功能。這些函數名稱將在'function_names'文件中。對於收集函數名稱,我使用需要目標文件的'nm'工具,而不是可執行文件。所以你需要使用-c選項來生成目標文件。 – Jeyaram

+0

我只想在特定的行處設置斷點,因爲我有調試符號,我可以很好地訪問該行並在那裏設置一個斷點。我不需要那裏的所有函數名稱。是否可以設置一個斷點,在那裏運行回溯,然後存儲該輸出? – Nobilis

3

如果你需要的是自動知道PID和功能在使用gdb的,那麼你可以試試這個打印堆棧幀。(鑑於最少的代碼是功能性)

/root/.gdb_init:

set pagination off 
set logging file gdb.txt 
set logging on 

br fun_convert 
# ^^ when breaking at function fun_convert, execute `commands` till next `end` 
commands 
    bt 
    print "Sample print command 1 \n" 
    continue 
end 

br file.c:451 
# ^^ when breaking at line 451 of file.c, execute from `commands` till next `end` 
commands 
    bt 
    print "Sample print command 2 \n" 
    continue 
end 

continue 

調用GDB的PID 6474和命令文件/root/.gdb_init

gdb -p 6474 -x /root/.gdb_init 

他re,fun_convert是打破的功能。這br是實際的break gdb命令,你也可以在使用br file.c:451的任何文件行中斷。有關更多break選項,請查看gdb幫助。您可以在commandsend之間添加所需的任何gdb命令(對應的br)。欲瞭解更多關於commands的信息,請登錄gdb查詢help commands

注意:SO的JS在我的瀏覽器上壞了,請原諒任何錯誤,隨時糾正。也不能添加評論:(

+0

很酷,我該如何從命令行運行,對不起?另外,這是否取決於我設置的斷點或每當'fun_convert'被調用? – Nobilis

+0

例如,不是'b fun_convert',我可以做'b 451',其中451是行號? – Nobilis

+0

感謝您的回答,我選擇了Jeyaram的解決方案,因爲這對我有用,但我對您提供的'set'命令提供了答案:) – Nobilis