2009-07-07 80 views
27

人們使用gdb打開和關閉調試, 當然還有很多其他調試工具 橫跨各種不同的操作系統,with and without GUI and, maybe other fancy IDE features您使用/編寫了哪些有用的GDB腳本?

我想知道what useful gdb scripts you have written and liked
雖然,我並不是指在something.gdb文件中存在一個命令轉儲,您可以從中獲取大量數據,如果這樣做會讓您有一天的時間,請繼續談論它。

  • 讓我們覺得條件處理控制迴路功能更多的優雅和精緻的編程寫入調試和,甚至爲白盒測試,當你開始debugging remote systems
  • 事情變得有趣(比如,通過串行/以太網接口)
  • 而且,如果目標是多處理器(和多線程)系統會怎麼樣?

讓我把一個簡單的情況爲例...
說,

是連續走過了條目
定位在一個大的哈希表
被實現在一個糟糕的條目的腳本一個嵌入式平臺。

這幫助我調試一個破碎的散列表。

回答

3

1.當試圖獲得一些第三方閉源DLL在Mono下使用我們的項目時,它給出了毫無意義的錯誤。因此,我使用Mono project的腳本。

2.我也有可能放棄它自己的信息標準輸出在GDB使用,所以在斷點處,我可以運行的功能,然後切正粘貼其輸出到GDB的項目。

[編輯]

我的大多數海合會/ G ++的使用已經有一段時間,但我還記得使用宏,以充分利用GDB知道一些不透明的成員的事實的優點我有數據(該庫是用調試編譯的)。這非常有幫助。

4.我剛剛也發現了這個。它轉儲一個對象列表(來自全局「headMeterFix」SLL),其中包含另一個對象類型的動態數組。其中幾次我用嵌套循環在宏:

define showFixes 
    set $i= headMeterFix 
    set $n = 0 
    while ($i != 0) 
    set $p = $i->resolved_list 
    set $x = $i->resolved_cnt 
    set $j = 0 
    printf "%08x [%d] = {", $i, $x 
    printf "%3d [%3d] %08x->%08x (D/R): %3d/%-3d - %3d/%-3d {", $n, $i, $x, $i->fix, $i->depend_cnt, dynArySizeDepList($i->depend_list), $i->resolved_cnt, dynArySizeDepList($i->resolved_list) 
    while ($j < $x) 
     printf " %08x", $p[$j] 
     set $j=$j+1 
    end 
    printf " }\n" 
    set $i = $i->next 
    set $n = $n+1 
    end 
end 
+0

Mono的gdb的參考是很好的 - 不知道。不確定我是否正確地獲得了第二部分,是否描述了一個集成到項目構建中的函數,以便從GDB中的斷點調用?這是一個很好的技巧,並且在我的一個項目中,對於慢速串行線調試接口很有用。 – nik 2009-09-19 04:26:32

+0

W.r.t第二部分,很久以前。但是,是的,它只是在GDB的一個斷點處被調用的源代碼。我認爲這是一個試圖在* __ builtin_frame_address(n)*幫助下追蹤一些堆棧損壞的情況 - 這是一個宏,不能從GDB調用。 – NVRAM 2009-09-21 20:30:48

5

當調試AOLserver的SIGSEGV崩潰,我用下面的腳本來檢查從GDB的TCL級調用堆棧:

define tcl_stack_dump 
    set $interp = *(Interp*)interp 
    set $frame = $interp->framePtr 
    while (0 != (CallFrame *)$frame->callerPtr != 0) 
    set $i = 0 

    if 0 != $frame->objv 
     while ($i < $frame->objc) 
     if (0 != $frame->objv[$i] && 0 != $frame->objv[$i]->bytes) 
      printf " %s", (char *)(CallFrame *)$frame->objv[$i]->bytes 
     end 

     set $i = $i + 1 
     end 
     printf "\n" 
    end 

    set $frame = (CallFrame *)$frame->callerPtr 
    end 
end 

document tcl_stack_dump 
    Print a list of TCL procs and arguments currently being called in an 
    interpreter. Most TCL C API functions beginning with Tcl[^_] will have a 
    Tcl_Interp parameter. Assumes the `interp' local C variable holds a 
    Tcl_Interp which is represented internally as an Interp struct. 

    See: 
    ptype Interp 
    ptype CallFrame 
    ptype Proc 
    ptype Command 
    ptype Namespace 
    ptype Tcl_Obj 
end