Linux段錯誤除錯

2021-05-09 21:40:13 字數 2776 閱讀 8691

1.單步除錯

編譯時加上-g,然後用gdb除錯,自然就知道出現段錯誤的地方在哪。

2.利用core檔案來進行除錯

用ulimit -c來檢視core檔案的最大值,如果是0就不會產生core檔案。

此時可用ulimit -c 1000將core檔案的最大值設定為1000k。

ulimit -c 1000只會影響當前的終端(對其他的終端無影響),終端關閉後又會恢復為0。

[root@localhost xufaniu]# ulimit -c

0[root@localhost xufaniu]# ulimit -c 1000

[root@localhost xufaniu]# ulimit -c

1000

作為除錯,編寫了以下3個檔案,其內容如下:

(1) main.cpp

#include

#include "../a.h"

int main()

(2) a.h

void show(int value);

(3) a.cpp

#include

int i = 999;

void show(int value)

編譯: g++ -g -o main main.cpp ../a.cpp

發現用gcc時有時會出現亂碼,如??,改為用g++就一切正常了,不知道具體原因。

執行:./main,可以發現段錯誤:

段錯誤 (core dumped)

此時可以在main檔案的路徑下產生了乙個core檔案: core.5083。

除錯: gdb ./main core.5083

core was generated by `./main'.

program terminated with signal 11, segmentation fault.

[new process 5083]

#0  0x08048473 in show (value=201) at ../a.cpp:9

9  strcpy(abc, "hello!/n"); 

(gdb) bt

#0  0x08048473 in show (value=201) at ../a.cpp:9

#1  0x08048447 in main () at main.cpp:6

(gdb) p i

$1 = 999

(gdb) p j

$2 = 888

(gdb) p value

$3 = 201

(gdb) p param

no symbol "param" in current context.

可以用p檢視產生段錯誤時變數的值!

注意,如果此時刪掉../a.cpp,再用gdb除錯,就會出現如下內容:

program terminated with signal 11, segmentation fault.

[new process 5083]

#0  0x08048473 in show (value=201) at ../a.cpp:9

9 ../a.cpp: no such file or directory.

in ../a.cpp

(gdb) bt

#0  0x08048473 in show (value=201) at ../a.cpp:9

#1  0x08048447 in main () at main.cpp:6

(gdb) p i

$1 = 999

(gdb) p j

$2 = 888

(gdb) p value

$3 = 201

(gdb) p param

no symbol "param" in current context.

看不到出錯的語句是哪條,但是知道是哪行出錯了!

如果此時上傳檔案../a.cpp,又會得到第5步的結果!

如果用g++ -o main main.cpp ../a.cpp編譯,執行./main時仍會產生core檔案「core.5128」,

用gdb ./main core.5128 除錯時看不到檔案資訊:

program terminated with signal 11, segmentation fault.

[new process 5128]

#0  0x08048473 in show ()

(gdb) bt

#0  0x08048473 in show ()

#1  0x08048447 in main ()

(gdb) p i

$1 = 999

(gdb) p j

no symbol table is loaded.  use the "file" command.

(gdb) p value

no symbol table is loaded.  use the "file" command.

(gdb) p param

no symbol table is loaded.  use the "file" command.

看不到show函式的引數,也看不到函式體內定義的區域性變數,只能看到全域性變數!

用core檔案進行gdb除錯時,可執行檔案並不是一定要用-g編譯。但是用-g編譯可以看到更多的除錯資訊。

建議用-g編譯,然後用strip main去掉除錯資訊!

檢視出錯資訊時,可用p和bt指令。

3.程式執行正常時不會產生core檔案,因assert引起的異常退出也會產生core檔案。

段錯誤除錯

1 gdb除錯 1 第一步是使用帶有除錯標誌 debugging flags 的方式編譯這段 如下 gcc g segfault.c 2 執行可執行程式 gdb a.out 進入gdb模式 gdb run 執行程式 starting program home dgawd cpsc 363 a.out...

段錯誤除錯

核心轉儲core dumped 概念 當 個程序要異常終止時,可以選擇把程序的使用者空間記憶體資料全部儲存到磁碟上,檔名通常是core,這叫做core dump。也叫核心轉儲,幫助開發者進行除錯,在程式崩潰時把記憶體資料dump到硬碟上,讓gdb識別 乙個程序允許產生多大的core檔案取決於程序的 ...

gdb 除錯段錯誤

開發嵌入式linux的時候經常會遇到segmentation fault,也就是段異常錯誤,一般是使用錯誤的指標訪問記憶體導致。這種錯誤可以通過開啟核心的異常資訊輸出,再用gdb對發生段異常的位址進行定位。1.開啟核心的異常資訊輸出 mips的核心 關閉了arch mips mm fault.c的d...