gdb除錯從基礎到精通例項
gdb主要功能:
1 啟動程式,並且按照特定的要求執行程式;
2 可讓被呼叫的程式在指定的斷點位置停住,斷點可以是條件表示式;
3 當程式被停止時,可以檢查此時程式所發生的事情;
4 動態的改變程式的執行環境;
gdb一般用於除錯c/c++程式;
gdb如果希望除錯程式那麼在編譯的時候需要加上 -g 引數才可以除錯,如果沒有 -g 那麼除錯資訊將顯示執行時的記憶體位址,
將不能看到程式的函式名、變數名等資訊;
如:cc -g hello.c -o hello
g++ -g hello.cpp -o hello
啟動gdb的方法:
1 gdb 《執行檔案》
2 gdb 《執行檔案》 core //gdb除錯乙個執行程式和core檔案,core檔案是程式非法執行後coredump產生的檔案
3 gdb 《執行檔案》 //如果程式是乙個服務程式,那麼可以指定程式的程序id,gdb會自動attach上去,並除錯。
執行檔案應該在path(環境變數)中搜尋得到。
gdb基本除錯方法:
執行程式:gdb 執行檔案;如gdb hello
檢視**:list(簡寫 l)
設定斷點:break number(簡寫 b)(在number行設定乙個斷點)
設定斷點:break function(在函式上設定乙個斷點)
顯示所有斷點:info break
執行程式:run(簡寫 r)
*****》程式在斷點處停止
繼續執行一行程式:next (簡寫 n)
跳過當前斷點繼續執行後面的**:continue (簡寫 c),跳過當前斷點則會直接執行到下乙個斷點處並輸出下乙個斷點的位置及**
輸出某個變數的值:print 變數(簡寫 p)(inspect也是此功能); 如果:printf i 或者 p i
檢視當前的堆疊資訊:bt
退出函式:finish
退出gdb:quit(簡寫 q)
如果某個命令記不全則只需要覺得最前面的字母,然後兩次tab鍵,則會彈出所有前面幾個字母系統的關鍵字。函式、變數也是同樣道理
gdb除錯正在執行的程式方法:
方法1:
1 ps -ef | grep 檢視執行程式的程序id
2 gdb 執行程式的執行檔案 程序id 這樣就可以掛起掛起正在執行的程式
方法2:
先用gdb 《執行程式的執行檔案》關聯上源**,並進行gdb,在gdb中用attach命令來掛接程序的pid。並用detach來取消掛接的程序。
gdb 中暫停程式的方法:
1 斷點 (breakpoint)
2 觀察點 (watchpoint)
3 捕捉點 (catchpoint)
4 訊號 (signals)
5 執行緒停止 (thread stops)
下面是設定斷點,觀察點,捕獲點的一些方法:
一、設定斷點(breakpoint)
break
在進入指定函式時停住。c++中可以使用class::function或function(type,type)格式來指定函式名。
break
在指定行號停住。
break +offset
break -offset
在當前行號的前面或後面的offset行停住。offiset為自然數。
break filename:linenum
在原始檔filename的linenum行處停住。
break filename:function
在原始檔filename的function函式的入口處停住。
break *address
在程式執行的記憶體位址處停住。
break
break命令沒有引數時,表示在下一條指令處停住。
break ... if
...可以是上述的引數,condition表示條件,在條件成立時停住。比如在循環境體中,可以設定break if i=100,表示當i為100時停住程式。
檢視斷點時,可使用info命令,如下所示:(注:n表示斷點號)
info breakpoints [n]
info break [n]
二、設定觀察點(watchpoint)
觀察點一般來觀察某個表示式(變數也是一種表示式)的值是否有變化了,如果有變化,馬上停住程式。我們有下面的幾種方法來設定觀察點:
watch
為表示式(變數)expr設定乙個觀察點。只要表示式值有變化時,馬上停住程式。
rwatch
當表示式(變數)expr被讀時,停住程式。
awatch
當表示式(變數)的值被讀或被寫時,停住程式。
info watchpoints
列出當前所設定了的所有觀察點。
三、設定捕捉點(catchpoint)
catch
當event發生時,停住程式。event可以是下面的內容:
1、throw 乙個c++丟擲的異常。(throw為關鍵字)
2、catch 乙個c++捕捉到的異常。(catch為關鍵字)
3、exec 呼叫系統呼叫exec時。(exec為關鍵字,目前此功能只在hp-ux下有用)
4、fork 呼叫系統呼叫fork時。(fork為關鍵字,目前此功能只在hp-ux下有用)
5、vfork 呼叫系統呼叫vfork時。(vfork為關鍵字,目前此功能只在hp-ux下有用)
6、load 或 load 載入共享庫(動態鏈結庫)時。(load為關鍵字,目前此功能只在hp-ux下有用)
7、unload 或 unload 解除安裝共享庫(動態鏈結庫)時。(unload為關鍵字,目前此功能只在hp-ux下有用)
tcatch
只設定一次捕捉點,當程式停住以後,該點被自動刪除。
gdb中可以隨時檢視以下三種的變數:
1 全域性變數(所有檔案可見)
2 靜態全域性變數(當前檔案可見)
3 區域性變數(當前scope可見,如果區域性變數和全域性變數重名,則在scope中將會隱藏全域性變數只顯示區域性變數)
部分整理知識點
知識點回顧 萬用字元選擇器 外邊距 margin right left 文字水平對齊 text ailgn center left right 文字居中對齊 行高等於高 line height 首行縮排 text indent 常用塊級標籤 div p h1 h6 ul li 行內標籤 左右排列 s...
GDB技巧整理
整理常用的gdb技巧。常用的gdb命令.直接執行 gdb args prog arg1 arg2 執行gdb後使用run命令 gdb prog run arg1 arg2 attach到已執行的程式 gdb pid ptype用於顯示symbol的型別,示例原始碼為 struct abc int m...
gdb 命令整理
最近除錯nginx原始碼,使用到了gdb,為方便以後除錯使用。整理了一些常用命令。啟動專案並斷點 start 打臨時斷點 tb打斷點 b根據 行位置設定斷點 根據函式名設定斷點 b func name 根據執行時的位址設定斷點 b 0x5859c0 檢視斷點列表 info break 檢視函式堆疊 ...