35
A
回答
41
首先,您可以運行該程序並通過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(你可以做到這一點從另一個shell窗口)。
完成後,使用rm foo
刪除fifo(或將其放入系統重新啓動時將自動刪除的目錄中,例如/tmp
)。
9
GDB的run
命令使用bash
執行重定向。實現相當於ret | blah
的簡單方法是使用bash的process substitution功能。
$ gdb blah
...
(gdb) run < <(ret)
說明:bash的替代<(ret)
喜歡的東西/dev/fd/123
,這是ret
標準輸出的文件描述符。除了我們不必自己手動創建它,也不必擔心ret
進程的生命週期,我們可以使用該fd與指定的FIFO相似。
相關問題
- 1. 使用gdb調試Unix管道
- 2. 用gdb調試
- 3. GDB與管道輸入(未參數)調試
- 4. 用gdb調試C
- 5. 使用gdb調試回調
- 6. GDB管道輸入到調試文件,而無需使用一個文件
- 7. 的Gstreamer調試管道C++
- 8. 如何調試scrapy管道?
- 9. 使用GDB調試模板
- 10. 使用gdb來調試C++
- 11. 使用gdb調試pthreads
- 12. 使用gdb調試qemu
- 13. 使用gdb調試conio.h
- 14. 如何使用GDB調試
- 15. 使用GDB調試Android
- 16. 使用GDB調試iPhone
- 17. 使用GDB進行調試
- 18. 使用gdb調試Java .jar
- 19. 使用gdb調試llvm pass
- 20. 使用GDB調試進程
- 21. 用Eclipse CDT和GDB調試
- 22. gdb print NSString調試
- 23. GDB調試保護
- 24. GDB調試警告
- 25. GDB遠程調試
- 26. gdb調試奇怪
- 27. 用GDB調試編程調用函數
- 28. gdb/mi gdb服務器調試
- 29. 從亞馬遜數據管道中的管道調用管道
- 30. 使用GDB調試iOS應用程序
這是不同於:http://stackoverflow.com/questions/4521015/how-to-pass-arguments-and-redirect-stdin-from-a-file-to-program-run-in-gdb – 2015-07-02 18:27:34