又是这个问题!估计又是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里面,编译之后应该是不同的代码段中,所以,具体实现无所谓了的,变量只是一个名称嘛。
但是没有想到,正是这个错误,自八月份至今,导致程序一直有崩溃问题,这次算是真正解决了!
我就说嘛,我写程序还是很规矩的,自己分配的内存必然回收,自己拉的××必然自己处理,写程序和为人处事是一样的。所以,不应该出现什么段错误啊。这次,也是由于偷懒,因为我实在不想多写几行代码、多定义几个变量名称,一个人写的程序反映了一个人的性格。
呵呵,总算解决了。