GDB常用調試命令以及多進程多線程調試

來源:互聯網
上載者:User

標籤:inf   add   address   cli   bar   單位   ignore   arc   有用   

轉載自:http://blog.csdn.net/freeelinux/article/details/53700266

一:普通命令1.list命令
  • list  linenum      顯示程式第linenum行周圍的程式
  • list  function      顯示函數名為function的函數的來源程式
  • list                      顯示當前行後面的來源程式
  • list -                    顯示當前行前面的來源程式
2.run(r)    運行命令。
  • run args         run命令可以直接接命令列參數值,也可以在執行run之前通過 set args + 參數值實現。 
3.break(b)    打斷點,使用方法:
  • b  linenum                        在某行打斷點
  • b  +offset/-offset               在當前行號的前面或後面offset停住
  • b  filename:linenum         在某檔案的某行打斷點
  • b  filename:function         在某檔案某個函數入口停住
  • b  *address                      在程式的運行地址處停住
  • b                                      沒有參數在下一句停住
  • b where if condition         當某個條件滿足時,在某一行停住(這個很有用,比如b 10 if ret == 5)
    對於break命令,我們要靈活使用。例如打多個斷點。多線程程式中我們可以主函數中線程建立後立即打斷點,執行線程函數入口打斷點等。    關閉斷點:delete(d) breakpoint-id 4.單步命令    普通用法就不說了。
  • step count         一次性執行count步,如果有函數會進入函數
  • next count         一次執行count,不進入函數
  • finish                 運行程式,直到當前函數完成返回,並列印函數返回時的堆棧地址和傳回值以及參數資訊
  • until                   退出迴圈體(尤其是針對for迴圈這種,很煩的)
5.continue命令    當程式被停住之後,可以使用continue(c)命令,恢複程式的運行直到程式結束,或到達下一個斷點。這裡要注意如果沒有斷點程式是會直接結束的。6.print(p)命令    這個命令比較常用,用來查看我們想看的內容。比如有關數組可以看全部,也可以看從左至右某一部分:    print命令針對變數查看的輸出格式有:
  • x 按十六進位格式顯示變數
  • d 按十進位格式顯示變數
  • u 按十六進位格式顯示無符號整型
  • o 按八進位格式顯示變數
  • t 按二進位格式顯示變數t 按二進位格式顯示變數
  • a 按十六進位格式顯示變數
  • c 按字元格式設定顯示變數
  • f 按浮點數格式顯示變數
7.watch命令    這個命令比較有用。watch一般用來觀察某個運算式(變數也是一種運算式)的值是否有變化,如果有變化,馬上停住程式。我們有一下幾種方法設定觀察點:
  • watch   expr                 為運算式expr設定一個觀察點,一旦運算式值有變化,馬上停住程式
  • rwatch  expr                  當運算式expr被讀時,停住程式
  • awatch expr                  當運算式的值被讀或被寫時,停住程式。
  • info      watchpoints       列出所有觀察點(info指令通常可以去套)
    舉例如下,示範觀測*i的值,一旦變化停下來:        在迴圈中我們也可以使用watch,配合ignore,它是除了until命令之外又一個可以讓我們跳出迴圈的方法,不過watch+ignore更強大,可以任意跳轉到第i次迴圈。它們的意思就是觀察一個變數,可以理解為斷點,ignore這個斷點多少次,然後用continue就可以直接跳過了。 8.examine命令    使用該命令來查看記憶體位址中的值。文法是:x/u addr     addr表示一個記憶體位址。“x/”後的n、f、u都是可選的參數,n 是一個正整數,表示顯示記憶體的長度,也就是說從當前地址向後顯示幾個地址的內容;f 表示顯示的格式,如果地址所指的是字串,那麼格式可以是s,如果地址是指令地址,那麼格式可以是i;u 表示從當前地址往後請求的位元組數,如果不指定的話,GDB預設是4位元組。u參數可以被一些字元代替:b表示單位元組,h表示雙位元組,w表示四位元組,g表示八位元組。當我們指定了位元組長度後,GDB會從指定的記憶體位址開始,讀寫指定位元組,並把其當作一個值取出來。n、f、u這3個參數可以一起使用,例如命令“x/3uh 0x54320”表示從記憶體位址0x54320開始以雙位元組為1個單位(h)、16進位方式(u)顯示3個單位(3)的記憶體。9.jump命令    jump命令不會改變程式棧的內容,一般只在同一函數內跳轉。
  • jump linespec     指定下一條語句的運行點,linespec可以是linenum,filename+linenum,+offset這幾種形式
  • jump address      跳到程式碼的地址
10.signal命令使用signal 訊號名(如SIGINT)這種方式把訊號發送給程式,如果程式註冊了signal_handler函數,還可以進行相應的處理,協助偵錯工具。11.set命令
  • set args       設定命令列參數
  • set env environmentVarname=value 設定環境變數。如:set env USER=benben
12.call命令
  • call function     強制調用某函數
    強制調用某函數,它會顯示函數傳回值(如果函數傳回值不是void)。print命令也可以完成該功能。13.disassemble命令    反組譯碼命令,查看執行時原始碼的機器碼。二:多進程調試1.單獨調試子進程    我們可以先運行程式,然後再另一終端使用ps -ef | grep "main"(main此處是可執行檔名)搜尋到子進程pid,然後啟動gdb,在將其附加(attach)到gdb調試器上。
  • attach child-pid        使用該命令後,直接run即可,和調試普通程式就沒區別了
  • dettach                     脫離進程
2.使用調試器選項follow-fork-mode    我們知道如果不設定任何選項,gdb預設調試父進程。調試器選項用法如下:
  • set follow-fork-mode mode     其中mode的可選值是parent和child,分別表示調試父進程和子進程。
  • info inferiors                            查詢正在調試的進程
  • inferior processnum                切換進程
    預設設定下,在調試多進程程式時GDB只會調試主進程。但是GDB(>V7.0)支援多進程的分別以及同時調試,換句話說,GDB可以同時調試多個程式。只需要設定follow-fork-mode(預設值:parent)和detach-on-fork(預設值:on)即可。我們還可以使用catch fork指令,如果fork異常,會停止程式。
        follow-fork-mode  detach-on-fork   說明
        parent                     on               只調試主進程(GDB預設)
        child                        on               只調試子進程
        parent                     off               同時調試兩個進程,gdb跟主進程,子進程block在fork位置
        child                        off               同時調試兩個進程,gdb跟子進程,主進程block在fork位置
   設定方法:set follow-fork-mode [parent|child]   set detach-on-fork [on|off]三:多線程調試    gdb調試一般有兩種模式:all-stop模式和no-stop模式(gdb7.0之前不支援no-stop模式)。    1.all-stop模式        在這種模式下,當你的程式在gdb由於任何原因而停止,所有的線程都會停止,而不僅僅是當前的線程。一般來說,gdb不能單步所有的線程。因為線程調度是gdb無法控制的。無論什麼時候當gdb停止你的程式,它都會自動切換到觸發斷點的那個線程。    2.no-stop模式(網路編程常用)        顧名思義,啟動不關模式。當程式在gdb中停止,只有當前的線程會被停止,而其他線程將會繼續運行。這時候step,next這些命令就只對當前線程起作用。        如果需要開啟no-stop模式,可以向~/.gdbinit添加設定檔:[python] view plain copy
  1. #Enable the async interface  
  2. set target-async 1  
  3. #If using the CLI, pagination breaks non-stop  
  4. set pagination off  
  5. #Finall, turn it on  
  6. set non-stop on  
        gdb支援的命裡有兩種類型:前台的(同步的)和後台(非同步 )的。區別很簡單,同步的在輸出提示符之前會等待程式report一些線程已經終止的資訊,非同步則是直接返回。所以我們需要set target-async 1。set pagination off不要出現 Type <return> to continue 的提示資訊 。最後一步是開啟。        下面是常用命令:
  • info threads                                       顯示所有線程
  • thread id                                            切換到指定線程
  • break filename:linenum thread all     在所有線程相應行設定斷點,注意如果主線程不會執行到該行,並且啟動all-stop模式,主線程執行n或s會切換過去
  • set scheduler-locking off|on\step       預設off,執行s或c其它線程也同步執行。on,只有當前相稱執行。step,只有當前線程執行
  • show scheduler-locking                     顯示當前模式
  • thread apply all command                 每個線程執行同意命令,如bt。或者thread apply 1 3 bt,即線程1,3執行bt。
        主要是我們要用能用的上的,比如no-stop模式,一般多線程調試就很有用的。四:core檔案
  • ulimit -c unlimited           產生core檔案,也可以是指定大小,然後使用gdb ./main core啟動,bt查看調用棧即可。
      參考:1190000003733061               http://www.cnblogs.com/frankbadpot/archive/2010/06/23/1762916.html

GDB常用調試命令以及多進程多線程調試

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.