gdb調試段錯誤
推薦
前言
使用gdb來調試程序應該算是Linux開發(fā)的必備技能吧,今天來看看如何使用gdb調試段錯誤(Segmentation fault)。
如何調試段錯誤
首先來看一下如下例子:
int main(int argc, char **argv)
{
char *buf;
buf = malloc(1<<31);
fgets(buf, 1024, stdin);
printf("%s\n", buf);
return 1;
}
然后編譯執(zhí)行
執(zhí)行時出現(xiàn)了段錯誤(Segmentation fault)。那接下來我們來使用gdb排查問題在哪?
我們重新編譯程序,但是編譯時要加上-g,要使用gdb調試時,編譯要加上該選項。
接下來就是使用gdb進行調試了!
執(zhí)行gdb test
然后使用run開始執(zhí)行程序
我們收到了來自操作系統(tǒng)的SIGSEGV信號,這就意味著我們試圖去訪問一段非法的內存。
我們使用backtrace看一下堆棧情況:
我們主要看我們程序中的,提示我們崩潰在第10行!就是
fgets(buf, 1024, stdin);
為什么會崩潰在fgets呢,肯定是我們給的參數(shù)有問題!我們使用print打印一下buf的值。
呵呵!空指針........那就是malloc沒成功了!我們打斷點來調試。先使用kill停止
接下來在第8行打斷點
看清楚,打斷點的方式,是在C文件上:
break test.c:8
然后run就停在了第8行,我們打印一下buf值
我們發(fā)現(xiàn)執(zhí)行malloc前后都是0x0, 當然有時候malloc前可能是一個亂值。
這已經(jīng)可以說明malloc沒有成功了!其實主要就是我們分配的空間太大了,分配了4G左右的空間。改為1024就OK了!
總結
上面主要還是跟大家講一些基本的排查方法,gdb還有挺多功能的,大家可以去查閱資料。gdb在應用開發(fā)還是比較常用的,大家還是要掌握!
猜你喜歡
bug解決不了?使用日志法
從單片機工程師的角度看嵌入式Linux
你的單片機裸機程序框架是怎樣的?
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!