GDB調試一

http://blog.csdn.net/haoel/article/details/2881linux

GDB主要調試的是C/C++的程序。要調試C/C++的程序,首先在編譯時,咱們必需要把調試信息加到可執行文件中。web

使用編譯器(cc/gcc/g++)的 -g 參數能夠作到這一點。若是沒有-g,你將看不見程序的函數名、變量名,所代替的shell

全是運行時的內存地址。函數

ex:    gcc -c hello.c -o hellospa

啓動GDB的方法有如下幾種:.net

    一、gdb <program>         program也就是你的執行文件,通常在固然目錄下。線程

    二、gdb <program> core        用gdb同時調試一個運行程序和core文件,core是程序非法執行後core dump後產生的文件。調試

    三、gdb <program> <PID>        若是你的程序是一個服務程序,那麼你能夠指定這個服務程序運行時的進程ID。gdb會自動attach上去,並調試他。program應該在PATH環境變量中搜索獲得。orm

 

help命令只是例出gdb的命令種類,若是要看種類中的命令,可使用help <class> 命令,如:help breakpointsblog

 

打斷點

break 19     //在第十九行打斷點(等同於 b 19)

b fun        //fun爲函數名,能夠在進入時設置斷點,函數名能夠雙擊tab鍵補齊

 

在gdb中運行linux的shell命令

shell <command string>

ex: shell ls /home

 

在gdb中,運行程序使用r或是run命令。程序的運行,你有可能須要設置下面四方面的事。

一、程序運行參數。    

set args 可指定運行時參數。(如:set args 10 20 30 40 50)    

show args 命令能夠查看設置好的運行參數。

二、運行環境。    

path <dir> 可設定程序的運行路徑。    

show paths 查看程序的運行路徑。    

set environment varname [=value] 設置環境變量。如:set env USER=hchen     show environment [varname] 查看環境變量。

三、工做目錄。     cd <dir> 至關於shell的cd命令。     pwd 顯示當前的所在目錄。

四、程序的輸入輸出。    

info terminal 顯示你程序用到的終端的模式。    

使用重定向控制程序輸出。如:run > outfile     tty命令能夠指寫輸入輸出的終端設備。如:tty /dev/ttyb

 

 

調試已運行的程序 ————————

 

兩種方法:

一、在UNIX下用ps查看正在運行的程序的PID(進程ID),而後用gdb <program> PID格式掛接正在運行的程序。

二、先用gdb <program>關聯上源代碼,並進行gdb,在gdb中用attach命令來掛接進程的PID。並用detach來取消掛接的進程。

 

 

暫停 / 恢復程序運行 —————————

 

調試程序中,暫停程序運行是必須的,GDB能夠方便地暫停程序的運行。你能夠設置程序的在哪行停住,在什麼條件下停住,在收到什麼信號時停往等等。以便於你查看運行時的變量,以及運行時的流程。

 

當進程被gdb停住時,你可使用info program 來查看程序的是否在運行,進程號,被暫停的緣由。

 

在gdb中,咱們能夠有如下幾種暫停方式:斷點(BreakPoint)、觀察點(WatchPoint)、捕捉點(CatchPoint)、信號(Signals)、線程中止(Thread Stops)。若是要恢復程序運行,可使用c或是continue命令。

 

1、設置斷點(BreakPoint)        

咱們用break命令來設置斷點。正面有幾點設置斷點的方法:        

  break <function>         在進入指定函數時停住。C++中可使用class::function或function(type,type)格式來指定函數名。

    break <linenum>         在指定行號停住。

    break +offset     break -offset         在當前行號的前面或後面的offset行停住。offiset爲天然數。

    break filename:linenum         在源文件filename的linenum行處停住。

    break filename:function         在源文件filename的function函數的入口處停住。

    break *address         在程序運行的內存地址處停住。

    break         break命令沒有參數時,表示在下一條指令處停住。

    break ... if <condition>         ...能夠是上述的參數,condition表示條件,在條件成立時停住。好比在循環境體中,能夠設置break if i=100,表示當i爲100時停住程序。

    查看斷點時,可以使用info命令,以下所示:(注:n表示斷點號)     info breakpoints [n]     info break [n]

 

 

2、設置觀察點(WatchPoint)
   
    觀察點通常來觀察某個表達式(變量也是一種表達式)的值是否有變化了,若是有變化,立刻停住程序。咱們有下面的幾種方法來設置觀察點:
   
    watch <expr>
        爲表達式(變量)expr設置一個觀察點。一量表達式值有變化時,立刻停住程序。
       
    rwatch <expr>
        當表達式(變量)expr被讀時,停住程序。
       
    awatch <expr>
        當表達式(變量)的值被讀或被寫時,停住程序。
   
    info watchpoints
        列出當前所設置了的全部觀察點。

 

 

3、設置捕捉點(CatchPoint)

    你可設置捕捉點來補捉程序運行時的一些事件。如:載入共享庫(動態連接庫)或是C++的異常。設置捕捉點的格式爲:

   catch <event>         當event發生時,停住程序。event能夠是下面的內容:        

一、throw 一個C++拋出的異常。(throw爲關鍵字)        

二、catch 一個C++捕捉到的異常。(catch爲關鍵字)        

三、exec 調用系統調用exec時。(exec爲關鍵字,目前此功能只在HP-UX下有用)        

四、fork 調用系統調用fork時。(fork爲關鍵字,目前此功能只在HP-UX下有用)        

五、vfork 調用系統調用vfork時。(vfork爲關鍵字,目前此功能只在HP-UX下有用)        

六、load 或 load <libname> 載入共享庫(動態連接庫)時。(load爲關鍵字,目前此功能只在HP-UX下有用)        

七、unload 或 unload <libname> 卸載共享庫(動態連接庫)時。(unload爲關鍵字,目前此功能只在HP-UX下有用)

 

4、維護中止點

上面說了如何設置程序的中止點,GDB中的中止點也就是上述的三類。在GDB中,若是你以爲已定義好的中止點沒有用了,你可使用delete、clear、disable、enable這幾個命令來進行維護。

    clear         清除全部的已定義的中止點。

    clear <function>     clear <filename:function>         清除全部設置在函數上的中止點。

    clear <linenum>     clear <filename:linenum>         清除全部設置在指定行上的中止點。

    delete [breakpoints] [range...]         刪除指定的斷點,breakpoints爲斷點號。若是不指定斷點號,則表示刪除全部的斷點。range 表示斷點號的範圍(如:3-7)。其簡寫命令爲d。

比刪除更好的一種方法是disable中止點,disable了的中止點,GDB不會刪除,當你還須要時,enable便可,就好像回收站同樣。

    disable [breakpoints] [range...]         disable所指定的中止點,breakpoints爲中止點號。若是什麼都不指定,表示disable全部的中止點。簡寫命令是dis.

    enable [breakpoints] [range...]         enable所指定的中止點,breakpoints爲中止點號。

    enable [breakpoints] once range...         enable所指定的中止點一次,當程序中止後,該中止點立刻被GDB自動disable。

    enable [breakpoints] delete range...         enable所指定的中止點一次,當程序中止後,該中止點立刻被GDB自動刪除。

    tcatch <event>         只設置一次捕捉點,當程序停住之後,應點被自動刪除。

相關文章
相關標籤/搜索