段错误是程序员最讨厌的问题之一,其发生往往很突然,且破坏巨大。典型的段错误是由于操作内存不当引起的(如使用野指针或访问受保护的地址等),发生段错误时,内核以一个信号SIGSEGV强行终止进程,留下的出错信息极少,从而导致难以定位。但利用gdb和反汇编工具,可以较准确地定位段错误产生的原因。但想用这种方法调试,一些准备工作和工具是必需的。
准备工作:
(1)coredump:进程异常中止时,内核生成的记录文件,其中保存了进程异常时所占用的内存和CPU资源,如pc计数器、各个寄存器的值等。这个文件是调试段错误最重要的依据。要使内核生成coredump,需要在内核配置中打开CONFIG_ELF_CORE选项,如果没有打开,将其选上后重新编译内核即可。
此外,利用命令ulimit -c unlimited,可以设置coredump大小为不受限制,可以保存更完整的信息。文件/proc/sys/kernel/core_pattern可以配置生成coredump的命名格式,如果不设置格式,则coredump默认生成的位置在出错进程的目录下,且生成的core同名,也就意味着旧的coredump可能被新的coredump所覆盖。如果我想在/tmp目录下生成以core.pid格式命名的coredump文件,只需执行命令:
echo "/tmp/core.%p" > /proc/sys/kernel/core_pattern