Linux下Segmentation fault(core dumped)簡單除錯方法
阿新 • • 發佈:2019-02-11
**
什麼是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設定的太小,嘗試設定的大一些試試吧~