注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

Ubuntu+GCC(g++):Program received signal SIGSEGV, Segmentation fault  

2010-10-23 20:53:25|  分类: linux、FreeBSD等 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

又是这个问题!估计又是stl库的string在作怪。还不如自己写一个简单的string代替stl的string。

 

http://topic.csdn.net/u/20081009/15/b7df31b4-d625-4091-9f09-0be8775a66bf.html

不是这个原因,已经加入了pthread。

 

现在的情况是,代码过于复杂,没法注释掉一部分代码来调试。而每次调试也得操作几十秒,很耽误时间,所以,最好的方法是,找出所有可能的原因,然后逐个地排除。

 

此前没有问题。加入一部分代码后,出现问题,但是,此前这部分是没有问题的。所以,可以排除栈溢出的可能性,以为栈溢出应该是在局部范围内出现的。于是,很可能是堆溢出。

 

Program received signal SIGSEGV, Segmentation fault.
At /mnt/share/Server/common/TLLock/TL_Lock.h:80


class CTL_AutoLock
{
protected:
 I_TL_Lock * m_pLock;

public:
 CTL_AutoLock(I_TL_Lock * plock)
 {
     m_pLock=plock;

     m_pLock->Lock();          //提示出错处
    };

 virtual ~CTL_AutoLock()
 {
     m_pLock->Unlock();
 }

};

反汇编:

0x804d56c push   ebp
0x804d56d mov    ebp,esp
0x804d56f sub    esp,0x18
0x804d572 mov    eax,DWORD PTR [ebp+0x8]
0x804d575 mov    DWORD PTR [eax],0x8066720
0x804d57b mov    eax,DWORD PTR [ebp+0x8]
0x804d57e mov    edx,DWORD PTR [ebp+0xc]
0x804d581 mov    DWORD PTR [eax+0x4],edx
0x804d584 mov    eax,DWORD PTR [ebp+0x8]
0x804d587 mov    eax,DWORD PTR [eax+0x4]
0x804d58a mov    eax,DWORD PTR [eax]
0x804d58c mov    edx,DWORD PTR [eax]     //就是这儿了
0x804d58e mov    eax,DWORD PTR [ebp+0x8]
0x804d591 mov    eax,DWORD PTR [eax+0x4]
0x804d594 mov    DWORD PTR [esp+0x4],0x0
0x804d59c mov    DWORD PTR [esp],eax
0x804d59f call   edx
0x804d5a1 leave
0x804d5a2 ret

寄存器:

eax是0,edx是0x8081990.

也就等同于edx=*((DWORD *)NULL);,不崩溃是不可能的了。

 

解决!

原因是大量使用inline内联函数,导致堆栈溢出!一年半以前,在VC平台下遇到类似的问题。

 

现在,我能深刻地体会到书本上面的那句话,内联函数应该尽量短小。否则,不但不能加快程序的运行速度,反而可能会导致栈溢出。

 

 

然而,问题还是存在的。某些小函数还是使用了内联的,小函数中再调用小函数(也是内联),结果,又出现上面的崩溃现象。

http://blog.csdn.net/kankanli/archive/2009/10/30/4748947.aspx

 

继续。虽然此前去除了很多inline函数,解决了部分问题。但是最根本的问题并没有解决。我把这些内联的小函数改为非内联的,问题依旧。这说明,确确实实存在堆溢出!而不是上面的内联导致的栈溢出。

 

 Linux C中令人讨厌的段错误

http://tieba.baidu.com/f?kz=670490198

 

另外一个程序,gdb调试的时候,基本上不会出问题,但是,一旦直接运行,则也会出现断错误!还会偶尔出现“总线错误”,也会出现double list那个重复回收内存的错误。

总线错误——我这里是因为磁盘空间不足,回收一部分垃圾文件,之后就不再提示。

 

彻底解决!

此次错误完全是我自己造成的。我写了这样的代码:

common.h文件里面:

struct _THREAD_PARAM;

typedef _THREAD_PARAM  THREAD_PARAM;

typedef _THREAD_PARAM * P_THREAD_PARAM;

 

A.h里面:

class A

{

P_THREAD_PARAM m_param;

};

A.cpp 里面:

struct _THREAD_PARAM

{

......

};

 

B.h里面:

class B

{

P_THREAD_PARAM m_param;

};

B.cpp 里面:

struct _THREAD_PARAM

{

......

};

 

简单地说,就是,我使用了一个变量声明,在不同的cpp里面,使用不同的实现体。

因为我没有看过编译原理这些东西了,所以,我的理解是,这些变量位于不同的cpp里面,编译之后应该是不同的代码段中,所以,具体实现无所谓了的,变量只是一个名称嘛。

但是没有想到,正是这个错误,自八月份至今,导致程序一直有崩溃问题,这次算是真正解决了!

 

我就说嘛,我写程序还是很规矩的,自己分配的内存必然回收,自己拉的××必然自己处理,写程序和为人处事是一样的。所以,不应该出现什么段错误啊。这次,也是由于偷懒,因为我实在不想多写几行代码、多定义几个变量名称,一个人写的程序反映了一个人的性格。

呵呵,总算解决了。

 

 

By:zhanyonhu

  评论这张
 
阅读(5499)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016