簡體   English   中英

gdb - 使用管道調試

[英]gdb - debugging with pipe

假設我有兩個名為blahret 的程序。 我想調試通過 I/O 重定向從ret程序接收輸入的blah程序。 在以下情況下如何使用 gdb 調試blah程序?

bash> ret | blah 

首先,您可以運行該程序並通過pid進行調試。 當然,此解決方案並未涵蓋所有情況。

另一種方法是使用 Linux 功能進行進程間通信。 簡而言之,您將ret的輸出重定向到一個 FIFO 特殊文件(“命名管道”),然后通過調試器從該 FIFO 中讀取。 這是它的完成方式。 從 bash 運行:

mkfifo foo

這會在您的目錄中創建一個特殊文件,用作命名管道 當您將文本寫入此文件時(使用相同的語法echo "Hello" >foo ),寫入程序將阻塞,直到有人從文件中讀取數據(例如cat <foo )。 在我們的例子中,一個 gdb 控制的進程將從這個文件中讀取。

創建 fifo 后,從 bash 運行:

ret > foo &   # ampersand because it may block as nobody is reading from foo
gdb blah

然后,在 gdb 提示符下,運行

run <foo

並得到想要的效果。 請注意,您不能從 fifo(以及從普通管道)讀取數據兩次:當您讀取所有數據后, blah進程就會終止,您應該重復寫入 foo 的命令(您可以這樣做從另一個外殼窗口)。

完成后,使用rm foo刪除fifo(或將其放入系統重新啟動時將自動刪除的目錄中,例如/tmp )。

GDB 的run命令使用bash來執行重定向。 一個簡單的方法來實現等價於ret | blah ret | blah是使用bash的進程替換功能。

$ gdb blah
...
(gdb) run < <(ret)

說明:bash 用/dev/fd/123類的東西替換<(ret) ,它是ret的標准輸出的文件描述符。 我們可以使用該 fd 類似於另一個答案中描述的命名 FIFO,不同之處在於我們不必自己手動創建它,也不必擔心ret進程的生命周期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM