日常码农生活中,尤其是C/C++码农,时常会遇到段错误(segfault),调试非常费劲,除了单元测试和基本测试外,有些时候是在在线环境下,没有基本开发和测试工具,这就需要调试的技能。以前虫虫文章中介绍过使用strace进行系统调试和追踪《linux动态追踪神器——Strace实例介绍》。今天虫虫再给大家介绍下利用core dump文件和gdb做应用程序调试和追踪的方法。
段错误(segfault)
"段错误"是程序试图操作不允许访问或试图访问的不允许内存的情况。可能导致段错误的原因主要有:
1、试图解引用空指针(你不允许访问内存地址0)
2、试图解引用不在你内存中的其他指针
3、一个C++ vtable虚表指针被破坏并指向错误的地方,这导致程序试图去执行一些不可执行的内存。
4、其他情况,比如未对齐的内存访问也可能会出现段错误。
core dump 文件
在linux下当应用程序发生异常中止退出或者发生崩溃的时候,linux内核会将应用程序在这段运行期间的内存状态等相关信息转存到磁盘,以供系统故障排查或者调试。这个转存的文件叫core dump文件。core dump文件中会记录程序当时的内存调用、堆栈引用、进程和线程调用等信息,可以帮助开发人员和维护人员了解异常发生当时的环境参数和信息,所以core dump对故障排查和bug调试具有重大的意义。
通过valgrind调试段错误
调试段错误最简单的方法是使用valgrind:其运行方法:
valgrind -v app
他的一个实例输出如下图: