1. 程式人生 > >Linux下Segmentation fault(core dumped)簡單除錯方法

Linux下Segmentation fault(core dumped)簡單除錯方法

**

什麼是Segmentation fault?

**
Segmentation fault就是段錯誤,一般指訪問的記憶體超出了系統給這個程式所設定的記憶體空間,例如訪問了不存在的記憶體地址、訪問了系統保護的記憶體地址、訪問了只讀的記憶體地址等等情況。

什麼是core dumped

作業系統把程式當掉時的記憶體內容 dump 出來(現在通常是寫在一個叫 core 的 file 裡面),讓 我們或是 debugger 做為參考。這個動作就叫作 core dump。

使用core檔案和gdb進行除錯

1、在一些Linux版本下,預設是不產生core檔案的,首先可以檢視一下系統core檔案的大小限制:

yrs@HP-Z820-Workstation:~/YOLO/darknet-master$ ulimit -c
0

2、可以看到預設設定情況下,本機Linux環境下發生段錯誤時不會自動生成core檔案,下面設定下core檔案的大小限制(單位為KB):

yrs@HP-Z820-Workstation:~/YOLO/darknet-master$ ulimit -c 1024
yrs@HP-Z820-Workstation:~/YOLO/darknet-master$ ulimit -c
1024

3、執行程式,發生段錯誤生成core檔案:

yrs@HP-Z820-Workstation:~/YOLO/darknet-master
$ ./darknet classifier train cfg/mnist.data cfg/mnist.cfg Learning Rate: 0.1, Momentum: 0.9, Decay: 0.0005 60000 Loaded: 0.170935 seconds Segmentation fault (core dumped)

4、載入core檔案,使用gdb工具進行除錯:

yrs@HP-Z820-Workstation:~/YOLO/darknet-master$ gdb ./darknet ./core

5、使用where命令檢視函式呼叫情況

(gdb) where
#0  0x00007f15e52006dc in
?? () from /usr/lib/x86_64-linux-gnu/libcuda.so.1 #1 0x00007f15e52a436e in ?? () from /usr/lib/x86_64-linux-gnu/libcuda.so.1 #2 0x00007f15e536e5ef in ?? () from /usr/lib/x86_64-linux-gnu/libcuda.so.1 #3 0x00007f15e52a5791 in ?? () from /usr/lib/x86_64-linux-gnu/libcuda.so.1 #4 0x00007f15e51c8fca in ?? () from /usr/lib/x86_64-linux-gnu/libcuda.so.1 #5 0x00007f15e51caf2a in ?? () from /usr/lib/x86_64-linux-gnu/libcuda.so.1 #6 0x00007f15e5304f85 in cuMemcpyHtoD_v2 () from /usr/lib/x86_64-linux-gnu/libcuda.so.1 #7 0x00007f15f81eb42e in ?? () from /usr/local/cuda/lib64/libcudart.so.7.5 #8 0x00007f15f81cddb1 in ?? () from /usr/local/cuda/lib64/libcudart.so.7.5 #9 0x00007f15f81f19b8 in cudaMemcpy () from /usr/local/cuda/lib64/libcudart.so.7.5 #10 0x000000000040a68c in cuda_make_array () #11 0x000000000048a5f0 in forward_backward_network_gpu(network, float*, float*) () #12 0x000000000048a68f in train_network_datum_gpu () #13 0x000000000043c9fa in train_network () #14 0x000000000045ca79 in train_classifier () #15 0x0000000000460bea in run_classifier () #16 0x0000000000402d06 in main ()

6、使用q退出gdb

注:如果沒有產生core檔案,可能是ulimit設定的太小,嘗試設定的大一些試試吧~