当前位置: 技术问答>linux和unix
这个coredump让我头发白了
来源: 互联网 发布时间:2015-04-13
本文导语: 在solaris上,用gcc编译的单线程纯C程序,总在一个函数中出现coredump。但程序运行时会上百次的调用这个函数,不一定那次就会core dump。分析core文件,发现是地址越界,但想破头也想不出为什么会地址越界。 具体现...
在solaris上,用gcc编译的单线程纯C程序,总在一个函数中出现coredump。但程序运行时会上百次的调用这个函数,不一定那次就会core dump。分析core文件,发现是地址越界,但想破头也想不出为什么会地址越界。
具体现象是这样的(由于逻辑比较复杂,我就不贴出源代码了):
调用函数func1有三个局部变量:
long a;
unsigned short b;
unsigned char c;
a在func1中被赋值,b,c,d都没在func1中用到。
func1调用func2,这四个变量都被传到func2中:
int func2(a,&b,&c,0)
在core文件中发现,传入func2的a,变成了一个莫名其妙的很大的数,&c也已经越界。但这怎么可能呢???!!!它们都是局部变量,不可能被别的程序或线程更改。到底为什么?
给我出个主意,指个方向,万分感谢!
为什么只能给100分,我愿意用上我所有的分。
具体现象是这样的(由于逻辑比较复杂,我就不贴出源代码了):
调用函数func1有三个局部变量:
long a;
unsigned short b;
unsigned char c;
a在func1中被赋值,b,c,d都没在func1中用到。
func1调用func2,这四个变量都被传到func2中:
int func2(a,&b,&c,0)
在core文件中发现,传入func2的a,变成了一个莫名其妙的很大的数,&c也已经越界。但这怎么可能呢???!!!它们都是局部变量,不可能被别的程序或线程更改。到底为什么?
给我出个主意,指个方向,万分感谢!
为什么只能给100分,我愿意用上我所有的分。
|
其他地方的指针飞了,或缓冲区溢出了。
|
调用几百次,那看起来是其他地方的内存管理(也有可能是其他系统资源)上出了问题。
仔细查查你的代码吧。或者请别人看看(自己的错误有时候很难自己发现)。
仔细查查你的代码吧。或者请别人看看(自己的错误有时候很难自己发现)。
|
会不会是FUNC2()参数定义有问题,能不能把FUNC2定义和调用的语句都贴上来看看
|
其他地方非法内存使用。如果你的代码很大,那只能自己一点点看了。或者如果你是用Linux的话,安装Valgrind(http://devel-home.kde.org/~sewardj/)来查找。
|
建议初始化一下,置为0试试。
资料再详细一点吧,最好把函数贴出来
资料再详细一点吧,最好把函数贴出来
|
指针飞了,或其他地方有缓冲区溢出
|
不一定就是这里的问题
|
用工具吧。什么平台?有purify吗?或者你的dbx有没有内存使用检查?
|
此类问题一般是内存错误积累,如果不想查代码,就装一个purify,查一下错误使用内存的情况。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。