Segment fault调试

有的程序可以通过编译,但在运行时会出现Segment fault(段错误)。这通常都是指针错误引起的。但这不像编译错误一样会提示到文件一行,而是没有任何信息。一种办法是用gdb的step, 一步一步寻找。但要step一个上万行的代码让人难以想象。 我们还有更好的办法,这就是core file。

如果想让系统在信号中断造成的错误时产生core文件, 我们需要在shell中按如下设置:

设置core大小为无限 ulimit -c unlimited

设置文件大小为无限 ulimit unlimited

发生core dump之后,用gdb进行查看core文件的内容, 以定位文件中引发core dump的行:

gdb [exec file] [core file]

如: gdb ./test test.core 在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里,来定位core dump的文件->行。

另外需要注意的是,如果你的机器上跑很多的应用,你生成的core又不知道是哪个应用产生的,你可以通过下列命令进行查看:file core

信号错误相关信息:

如果不是正常退出的那就是有信号引起的程序退出,有些信号确实能引起程序退出但不生成core。

SIGHUP 终止进程 终端线路挂断

SIGINT 终止进程 中断进程

SIGQUIT 建立CORE文件终止进程,并且生成core文件

SIGILL 建立CORE文件 非法指令

SIGTRAP 建立CORE文件 跟踪自陷

SIGBUS 建立CORE文件 总线错误

SIGSEGV 建立CORE文件 段非法错误

SIGFPE 建立CORE文件 浮点异常

SIGIOT 建立CORE文件 执行I/O自陷

SIGKILL 终止进程 杀死进程

SIGPIPE 终止进程 向一个没有读进程的管道写数据

SIGALARM 终止进程 计时器到时

SIGTERM 终止进程 软件终止信号

SIGSTOP 停止进程 非终端来的停止信号

SIGTSTP 停止进程 终端来的停止信号

SIGCONT 忽略信号 继续执行一个停止的进程

SIGURG 忽略信号 I/O紧急信号

SIGIO 忽略信号 描述符上可以进行I/O

SIGCHLD 忽略信号 当子进程停止或退出时通知父进程

SIGTTOU 停止进程 后台进程写终端

SIGTTIN 停止进程 后台进程读终端

SIGXGPU 终止进程 CPU时限超时

SIGXFSZ 终止进程 文件长度过长

SIGWINCH 忽略信号 窗口大小发生变化

SIGPROF 终止进程 统计分布图用计时器到时

SIGUSR1 终止进程 用户定义信号1

SIGUSR2 终止进程 用户定义信号2

SIGVTALRM 终止进程 虚拟计时器到

进入gdb调试后,执行where命令可以查查错误信息

在Linux下,使用:

gdb -c core.pid program_name

就可以进入gdb模式。

输入where,就可以指出是在哪一行被Down掉,哪个function内,由谁调用等等。

(gdb) where

或者输入 bt。

参考:https://blog.csdn.net/chinabhlt/article/details/45393645