gdb使用_轉

來源:互聯網
上載者:User

標籤:nis   系統內容   ulimit   eof   pid   分配   snprintf   顯示   dev   

在編程調試中,經常出現段錯誤,此時可用gdb調試。具體方法為註冊段錯誤訊號處理函數,在處理函數中啟動gdb。
具體代碼如下:
void segv_handler(int no)
{
char buf[512];
char cmd[512];
FILE *file;

snprintf(buf, sizeof(buf), "/proc/%d/cmdline", getpid());
if(!(file = fopen(buf, "r")))
{
exit(EXIT_FAILURE);
}
if(!fgets(buf, sizeof(buf), file))
{
eixt(EXIT_FAILURE);
}
if(buf[strlen(buf) - 1 ] == ‘\n‘)
{
buf[strlen(buf) -1] = ‘\0‘;
}
snprintf(cmd, sizeof(cmd), "gdb %s %d", buf, getpid());
system(cmd);
}

註冊函數:
signal(SIGSEGV, segv_handler);
下面轉自一些總結:
作為一名程式猿,日常開發中解決各種bug是不可避免的。對於簡單的bug通過日誌分析,或者增加列印資訊就能很快定位到原因並解決。但是對於某些比較複雜的情況,想要定位到bug往往十分困難。查閱了很多資料,經過不斷嘗試,我發現gdb調試能夠起到很大的協助。下面我將對使用gdb的一些常用技巧和執行個體做下總結。
下面總結下比較關鍵的幾個用法:
一、啟動GDB調試
使用gdb調試首先在編譯器時加上-g參數:$ gcc –g –o foo foo.c
啟動gdb調試有多種方法,可以根據不同的情境選擇合適的方式,這也是gdb比較好用的地方。
1. 程式沒有運行時,gdb +<program> 直接用gdb運行程式;
2. 程式運行中的gdb調試有兩種方式:
a.ps查看程式的PID,gdb + <program> + PID ,自動掛接到已啟動並執行程式;
b.ps產看程式的PID,gdb + <program>運行gdb後,用attach + PID指令掛接到程式, 並用detach來取消掛接的進程。
3. 程式已經死掉後,gdb +<program> + core檔案進行調試,core檔案是程式非法執行後產生的“核心轉儲”檔案。有些情況下core不能產生,需要用ulimit -c unlimited指令先設定系統內容。
二、針對第二種gdb啟動方式,可以有如下實現方式。
程式發生段錯誤,但是該異常發生有一定的隨機性,為了捕獲異常並進行gdb調試,在程式中捕獲SIGSEGV訊號並進行如下處理,這樣當程式運行出現段錯誤時直接進入gdb調試環境。

三、gdb調試常用指令

關於gdb調試的常用指令及介紹可以參考這裡,http://blog.csdn.net/liwf616/article/details/46833107
Gdb環境下直接按下斷行符號表示執行上一條命令
1. break 設定斷點,
break10 設定斷點,在來源程式第10行
breakfunc 設定斷點,在func函數入口處
infobreak 查看斷點資訊
2. run 運行程式,可簡寫為r
3. next 單步跟蹤,函數調用當作一條簡單語句執行,可簡寫為n
step 單步跟蹤,函數調進入被調用函數體內,可簡寫為s
stepi 或si單步跟蹤一條機器指令
nexti 或ni單步跟蹤一條機器指令
4. continue 繼續運行程式,可簡寫為c
5. print 列印變數、字串、運算式等的值,可簡寫為p
p count 列印count的值
p cou1+cou2+cou3 列印運算式值
6. bt 查看函數堆棧
7. finish 退出函數
8. quit 退出GDB
9. shell 不退出GDB就使用shell命令
10. make <make-args>不退出GDB就重新編譯器
11. set args指定運行時參數。(如:set args10 20 30 40 50)
showargs查看設定好的運行參數。
12. path <dir>設定程式的運行路徑。
showpaths 查看程式的運行路徑。
13. set environment varname [=value] 設定環境變數。如:setenv USER=hchen
showenvironment [varname] 查看環境變數。
14. 其他
cd<dir> 相當於shell的cd命令。
pwd 顯示當前的所在目錄。
infoterminal 顯示程式用到的終端模式。
tty指寫輸入輸出的終端裝置。如:tty /dev/ttyb
until在一個迴圈體內單步跟蹤時,該命令運行程式到退出迴圈體。簡寫u
四、多線程調試
用gdb調試的好處是可以查看程式運行時的堆棧等資訊,可以很直觀的發現問題。
info threads //顯示當前可調試的所有線程,每個線程前面有一個gdb為其分配的ID;
thread ID //切換到該ID對應的線程;
bt //顯示該線程的堆棧資訊
thread apply all bt //顯示所有線程堆棧資訊
break fun.c:123 thread ID //設定指定線程的斷點
set scheduler-locking off|on|step //off表示不鎖定任何線程,所有線程都執行;on只有當前線程執行;step在單步時除了next過一個函數外,只有當前線程執行

 

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.