2016-05-30 97 views
0

我想調試由我的程序調用的共享庫。共享庫輸出到一個單獨的日誌文件:shared-lib.log。我想將lib的輸出重定向到gdb(我想將輸出重定向到GDB運行的同一終端)。我試過如下:gdb:如何將共享庫的日誌文件重定向到gdb輸出

(gdb) run myprogram shared-lib.log>1 

(gdb) run myprogram shared-lib.log>/dev/stdout 

(gdb) run myprogram /dev/stdout 

但是,這並不工作,也與全路徑名/var/log/shared-lib.log。

+0

「將lib的輸出重定向到gdb」是什麼意思?你想用它作爲gdb的命令行輸入嗎?你有沒有嘗試過把'shared-lib.log'作爲fifo,然後用其他工具讀取fifo,比如'cat','tee',甚至shell的重定向? – Paulo1205

回答

1

共享庫輸出到一個單獨的日誌文件:shared-lib.log。

如果您有該庫的來源,你可以將它修改爲做到這一點。如果你不這樣做,你應該讓它的開發人員知道你不喜歡他們的日誌選擇(可以提供某種方式來重定向庫輸出,但是堅持這樣做並不會讓你自己決定)。

我想將lib的輸出重定向到gdb。

假設你想將輸出重定向到GDB運行的同一個終端,所以你可以看到當你單步執行你的程序時庫輸出的樣子。

你可以試試這個作爲第一步:

rm -f shared-lib.log && ln -s /dev/tty shared-lib.log 

如果庫來說確實open("shared-lib.log", O_WRONLY|O_CREAT, ...)那麼這應該足夠了。但如果圖書館首先執行unlink("shared-lib.log"),它將不起作用。

在這種情況下,並非所有都會丟失,但會變得更加困難。你會想知道庫正在寫入哪個文件描述符(在Linux上,ls -l /proc/<pid-of-inferior>/fd應該告訴你)。你也想安排一個開放的fd2/dev/tty。最後,您需要撥打dup2($fd, $fd2)將庫輸出重定向到終端。您可能還需要在程序中使用fflush(NULL),否則該庫可能會完全緩衝其調試輸出(因爲它認爲其輸出將轉到文件,並且stdio完全緩衝此類輸出)。

+0

謝謝,第一步沒有奏效,但它很聰明。第二步在我的情況下不起作用,因爲我沒有得到合理的文件描述符。有很多,我沒有鏈接到lib。 我有源代碼。所以我必須做老員工。謝謝你很好的答案。 – musbach