gdb调试Segmentation fault (core dumped)

来源:互联网 发布:833tt换什么域名了 编辑:程序博客网 时间:2024/05/22 00:08

有的程序可以通过编译,但在运行时会出现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。


0 0
原创粉丝点击