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

3 篇文章 0 订阅


又是这个问题!估计又是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里面,编译之后应该是不同的代码段中,所以,具体实现无所谓了的,变量只是一个名称嘛。

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

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

呵呵,总算解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值