[英]gdb - debugging with pipe
假設我有兩個名為blah和ret 的程序。 我想調試通過 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.