2017-04-08 72 views
0

GNU gdb命令行調試器會在每個stepnext命令後打印它當前所在的行。考慮以下gdb會話,我通過一些代碼步驟:GDB:在每一步後禁止打印當前行

... 
Temporary breakpoint 1, main (argc=1, argv=0x7fffffffd848) 
    at src/main.cc:3 
3  int main(int argc, char **argv){ 
(gdb) next 
4   Printf("Hello World\n"); // <--- disable this 
(gdb) 
5   printf("Hello World 2\n"); // <--- disable this 
(gdb) 

是否有gdb設置來禁用此打印?我知道這在技術上是可行的,因爲gdb TUI具有我正在尋找的行爲(可通過gdb命令set enable tui訪問)。

謝謝!

回答

1

我實現它通過重定向:

define n 
    set logging file /dev/null 
    set logging redirect on 
    set logging on 
    next 
    set logging off 
    display 
end 

我發現,捕捉next輸出沒有使用gdb.execute(gdb的蟒蛇API)工作。我期望情況是這樣,因爲源行不是由next本身打印的,而是由觸發的停止事件打印的。

0

使用gdb CLI時沒有直接的方法來做到這一點。處理向用戶打印「停止」的代碼不會檢查用戶可以設置的任何內容。

解決此問題的一種方法是將n別名爲使用不同解釋器(如interpreter-exec tui next)運行命令的命令。我不確定這是否真的有效。

另一種方式來實現,這將是編寫使用gdb.execute調用next名爲n Python的命令 - 而捕獲它的輸出,而忽略它。這種方法有點危險,因爲有時你可能確實需要一些停止消息,而不是源顯示。

最好的方法是修改gdb以添加新的set命令來禁用源打印。這很容易做到。

+1

我注意到[cgdb](https://cgdb.github.io/)能夠在使用未改變的gdb時實現此目的。他們如何做到這一點的任何線索? – gospes

+0

cgdb是一個包裝器,因此它可以按照喜歡的方式過濾輸出。所以大概是這樣 - 但我只是猜測,我從來沒有看過cgdb的來源。 –

+0

當執行'interpreter-exec console next'時,打印源位置被「禁用」。不幸的是,當把這個命令放在一個函數中時('定義n \ n解釋器 - 執行控制檯下一個\ n結束')gdb生成一個段錯誤。有任何想法嗎? – gospes