今天调试代码的时候,遇到一个问题就是出现了“段错误”。出现“段错误”的原因就是:访问的内存超出了系统给这个程序所设定的内存空间。知道原因是一个很好的开始,但是并不代表就很容易解决,特别是在代码量较大的情况下,如何才能定位到出错的地方?接下来,我就大概讲一下自己的一点经验,如何在Linux C中用几个命令搞定“段错误”。
1、dmesg
通过dmesg命令可以查看发生段错误的程序名称、引起段错误发生的内存地址、指令指针地址、堆栈指针地址、错误代码、错误原因等。
如,运行dmesg命令后,
[91046.776582] Test[26966]: segfault at 4 ip 0804f57f sp bfa0a224 error 6 in Test[8048000+1e000]
可以看出,发生段错误的地址:4, 和指令指针地址:0804f57f
2、ldd
使用ldd命令查看二进制程序的共享链接库依赖,包括库的名称、起始地址,这样可以确定段错误到底是发生在了自己的程序中还是依赖的共享库中。
如,运行 ldd bin/Test
linux-gate.so.1 => (0xb77d7000)
libevent-2.0.so.5 => /usr/lib/libevent-2.0.so.5 (0xb777d000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (