发生Segmentation fault时看不到错误位置,这时可以使用core file来定位。
1,设置使自动生成core file
执行ulimit -c可以得到core file的最大文件大小,默认为0,即并不记录core file,可以使用命令ulimit -c n来设置core file最大为n个blocks。但是这个设置logout会无效,且一旦设置,只能改小,不能改大。可以在文件/etc/security/limits.conf中加入* soft core unlimited完成永久设置。reboot。
2,编译文件加入调试信息
个人习惯默认使gcc,g++加入调试信息,可以在~/.bashrc中加入一句alias gcc='gcc -g -Wall',如果也写c++代码,还有alias g++='g++ -g -Wall'。省的忘记加-g选项了。
3,执行会发生段错误的可执行文件
执行后会在相同目录下发现core.xxxx文件,即core file
4,使用gdb定位错误
执行gdb a.out core.xxx读出调试信息,在gdb中输入where即可得到发生段错误的代码位置,输入bt可查看栈空间。
完成定位。