当前位置: 技术问答>linux和unix
[ 高手进来研究一下 ] malloc() 失败,并系统调用abort() 从而使程序退出,如何解决?
来源: 互联网 发布时间:2015-06-29
本文导语: 因为一处malloc()失败,使得系统调用abort(),从而使程序退出,如何解决? | 你可以忽略abort这个信号。 | 1、内存被你的程序占完了 2、你的程序代码把你的代码空间给覆盖了 | ...
因为一处malloc()失败,使得系统调用abort(),从而使程序退出,如何解决?
|
你可以忽略abort这个信号。
|
1、内存被你的程序占完了
2、你的程序代码把你的代码空间给覆盖了
2、你的程序代码把你的代码空间给覆盖了
|
应该是程序本身有问题吧。 malloc分配内存的,除非超过4G,否则不容易失败的。
|
malloc是随机错误的还是程序运行到某个地方就一定会出错~
先别管是不是"锁的问题" 先找出解决的方法啊~
先别管是不是"锁的问题" 先找出解决的方法啊~
|
奇怪.malloc失败并不会调用abort的啊.怀疑
不malloc引起的问题
不malloc引起的问题
|
你的程序代码把你的代码空间给覆盖了:就是你的程序使用了非法内存指针,检查你的程序,不要怀疑malloc调用
|
估计是调用后的问题,或者说你没有成功获取空间,然后又对这个指针操作导致的异常。
|
接上面,在程序中可以自己用函数func截获这个致命的信号
signal(SIGSEGV, func)
可以用dbmalloc函数库来调试你的内存分配
http://www.sandia.gov/ASCI/Red/usage/tutorial/dbmalloc/index.html
下载相关的包,解压编译,链接自己的程序时加入生成的libdbmalloc.a,这个库在出现SIGSEGV信号的时候会输出相关的信息,(据其文档说,会输出出错的文件名和行号,但是我用这个东东没有那么详细的输出:( ,但是程序可以继续运行,估计是dbmalloc拦截了SIGSEGV)
再次提醒,可能是你的程序用了free过的指针去访问数据,或者多次free同一个指针。
signal(SIGSEGV, func)
可以用dbmalloc函数库来调试你的内存分配
http://www.sandia.gov/ASCI/Red/usage/tutorial/dbmalloc/index.html
下载相关的包,解压编译,链接自己的程序时加入生成的libdbmalloc.a,这个库在出现SIGSEGV信号的时候会输出相关的信息,(据其文档说,会输出出错的文件名和行号,但是我用这个东东没有那么详细的输出:( ,但是程序可以继续运行,估计是dbmalloc拦截了SIGSEGV)
再次提醒,可能是你的程序用了free过的指针去访问数据,或者多次free同一个指针。
|
malloc调用之前如果没有错误的话,malloc会返回NULL或者正确的指针
如果在调用malloc之前有多次free同一个指针,系统会在malloc时发出SIGSEGV
如果在调用malloc之前有多次free同一个指针,系统会在malloc时发出SIGSEGV
|
另外一点,仅供参考:
你是否使用了异常?没被处理的异常,将被系统默认异常处理程序捕获,
通常默认处理就是调用abort()
你是否使用了异常?没被处理的异常,将被系统默认异常处理程序捕获,
通常默认处理就是调用abort()
|
多线程吗?在什么平台下运行?
|
用gdb看看吧,启动进程然后用gdb attach上去,
> handle all nostop pass print
接收到什么信号都会显示的,而且不会影响进程运行。
或者更简单的用truss
> handle all nostop pass print
接收到什么信号都会显示的,而且不会影响进程运行。
或者更简单的用truss