GDB調試快速定位段錯誤

以前學的時候在書上看過GDB調試,那時候就覺得,這玩意相比vs的調試太複雜太麻煩了,一堆的指令和命令,當時是一臉的嫌棄。 當我深入學習linux之後我發現用 shell命令是一個既成的事實,要想學好linux只能去學習各種shell命令。最近用GDB找到一份工程的段錯誤,就是真香打臉。

爲什麼要用GDB呢? 其實是在程序出現段錯誤的時候用GDB去事後調試。爲什麼說是事後調試?在調試之前我們就正常執行自己的程序,在程序執行完之後內核會返回一個core 文件,我們再用 gdb去看這個core文件,加入 就可以一些指令就可以看見裏面的段錯誤的位置。

首先我們要看一下自己的系統裏有沒有gdb調試工具在終端輸入which gdb可以看見返回,一般默認是有裝gdb的,如果沒有的話自己百度搜索裝一下,因爲我也沒有裝過哈哈哈哈

 爲了測試,我就自己編寫一個簡單的測試程序,當然這個程序只要是你稍微有點編程功底的你都可以看得出他的錯誤

#include <stdio.h>

void PrintTest(void)
{
	int *p;
	*p = 1111;
	printf("*p = %d\n",*p);
	return;
}

int main(void)
{
	PrintTest();
	return 0;
}

然後編譯,直接正常編譯gcc hello.c -o hello,這樣就會生成一個hello的執行文件,執行這個文件./hello就發現段錯誤出現了。

如果只是上面的程序大家肯定是可以看出來錯誤在哪裏,但是如果是一個很大的工程, 幾十萬上百萬的代碼呢。這個時候就用GDB。在用GDB之前有一點要特別說明。在編譯的時候一定要用編譯模式去編譯, 所謂的編譯模式就是在編譯的時候加上-g,只有加上-g之後纔會有調製信息,這個很重要,切記切記。如gcc hello.c -o hello -g

另外還有一點需要注意,在加上-g編譯之後生成的可執行文件,在執行完之後會生成一個core文件,這個core文件在可執行程序的同一級目錄下。但是需要注意,不同的系統的環境設置不一樣,所以會有差別。我用Ubuntu系統在正常情況下是不會生成core文件的。這是因爲Ubuntu系統 在默認的情況下出現段錯誤之後內核默認core  file的大小是0,就不輸出這個文件。我們需要去修改這個配置使內核可以輸出這個文件。

首先我們在終端輸入ulimit -a,這個命令就是查看當前資源極限,具體可以百度查看,顯示如下

看第一項,默認core file size是0,所以我們執行完之後看不到core文件。一般來說core文件會比較大,所以這個大小我們直接設置成不限制大小就可以,輸入ulimit -c unlimited,再輸入ulimit -a可以看見第一項變化了

這時候執行./hello在同級目錄可以看見core文件

這個時候輸入命令gdb hello core(這裏的hello是可執行文件,不同的人編譯的名字不一樣)。有些博主寫的調試命令是gdb -q hello core我試過在Ubuntu上都可以

可以看到段錯誤出現的地方在*p = 1111;,輸入bt還可以看見上下級的調用關係。如果想退出就按Quit回車就退出了

 

如果想在開發板上調試的話,需要把gdb調試工具拷貝到開發板上,但是需要注意一點,因爲core文件很大,我們設置成不受限制的大小,一般都設置成不受限制。所以最好是通過nfs掛載你的程序到開發板,不然開發板可能存不下core文件,然後gdb和你的程序在同一級目錄。當然你的程序肯定還得是debug模式的(編譯的時候加-g)。操作跟上面基本一致,然後生成core文件之後需要輸入./gdb XXX core(注:這裏的XXX是你的可執行文件,注意跟在Ubuntu上不一樣,這裏要在gdb前面加./。gdb本身也是一個程序的。)

 

參考鏈接:https://blog.csdn.net/xja31415/article/details/52777509

這位博主寫得不錯,他是在Ubuntu上實現的,我剛開始是參考他在開發板上實現的,然後做了以上總結。感謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章