2010-02-23 74 views
1

我正在嘗試編寫與GDB交互的測試,但在捕獲輸出時遇到了問題。我想要生成一個日誌文件,看起來像在終端上看到的那樣,手動執行了測試。然而,GDB在捕捉其輸出時被證明是非常固執的。編寫使用GDB的測試 - 如何捕獲輸出?

我已經能夠編寫能夠與GDB交互並且其輸出可以重定向到日誌文件的Expect腳本,但我不想在TCL中編寫我的測試。我希望使用與Java兼容的Groovy。出於某種原因,使用Perl的Expect和ExpectJ,程序輸出總是進入終端,不能被重定向到文件。

我試着從Java使用ProcessBuilder開始一個GDB進程,它主要工作,但打印語句的輸出永遠不會出現在標準輸出上,並且不能被捕獲。我認爲如果Expect能夠正常工作,那麼我希望能從Java中獲得期望,並讓它與GDB交互,但在這種情況下,大部分程序輸出都會丟失,從不出現在創建過程的標準輸出中。

所以我的問題是,如何在Groovy中編寫一個測試(Java會很好),它與GDB交互並可以捕獲所有輸出?

僞代碼:

process = "gdb -q".execute() 
waitForPrompt() 
send("file exec") 
waitForPrompt() 
send("run") 
send("quit") 

日誌文件:

(gdb) file exec 
Reading symbols from exec...done. 
(gdb) run 
Starting program: exec 
<... output ...> 

Program exited normally. 
(gdb) quit 

回答

1

一種可能性是,GDB的輸出被傾倒在標準錯誤,你只能捕獲標準輸出。您應該能夠通過重定向解決這個問題,這樣的事情,我認爲:

process = "gdb -q 2&>1".execute() 

第二種猜測是,它可能需要檢查什麼「Show互動模式」在工作和非工作情況下,說: 。如果他們不同,在做其他事情之前嘗試「設置交互模式」。

第三個選擇是使用GDB的日誌工具來寫入日誌文件(「set logging file」和「set logging on」)並避免自己捕獲輸出。

+0

我沒有在這裏列出,因爲我想保持簡短,但我已經將stderr與標準輸出合併 - 它不在那兒。我現在意識到,雖然輸出只是沒有被GDB衝昏了頭腦!出現另一個命令和輸出。 日誌記錄選項可用,但不包括髮送到GDB的命令。你可以使用「set trace-commands on」來獲取它們。不完全相同,因爲每個打印都以「+」爲前綴,但足夠接近。 謝謝! – dromodel 2010-02-23 20:57:42

1

如果你的測試涉及使用gdb來實際調試某些東西,而不是測試gdb本身,你應該考慮使用gdb/mi接口。

+0

我已經考慮過它,但想要一個對那些不熟悉腳本語言的人友好的日誌文件。 – dromodel 2010-02-25 02:41:48