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设置的太小,尝试设置的大一些试试吧~

你可能感兴趣的:(linux)