程序调试手记—解决Stack Overflow问题

本文记录了一次解决Stack Overflow错误的过程,通过分析函数调用栈和智能指针的使用,揭示了由于消息队列过长导致的深度析构问题。通过增大栈空间、限制队列长度、改变消息队列实现或断开消息链等方式可以避免此类错误。
摘要由CSDN通过智能技术生成

前言

程序员最痛苦的事莫过于深陷于BUG的泥潭,我也没少在这上面摔跤。这里,我把自己的一些经验教训总结出来,涉及的内容包括死循环、死锁、内存泄漏以及内存访问错误等,如果能对朋友们有所帮助,那就再好不过了。不过,我不打算按照循序渐进的方式来撰写这些文章 ,而是想到哪写到哪,也许到最后才会形成一个完整的系列。

本节将以一个真实例子讲述如何在VC6环境下调试“Stack Overflow”错误。

问题浮现

我负责维护前任同事的开发的一个DLL,这是一个用于网络通信的中间件,今天在应用程序断开与服务器的连接时突然报错,而且屡试不爽。调试发现出错总是在一个类的析构函数中出现,其类似代码如下:

class Bar
{
public:
    ~Bar()
    {
        stringstream  ss;
         ss <<  "~Bar" << 123;
        cout << ss.str();  // 这里 出错
    }
};

出错时的函数调用栈为:

memcpy(unsigned char * 0x1da822a9, unsigned char * 0x00000000, unsigned long 1) line 331
std::char_traits<char>::copy(char * 0x1da822a9, const char * 0x00000000, unsigned int 1) line 194 + 20 bytes
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(const char * 0x00000000, unsigned int 1) line 134 + 20 bytes
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> >(const char * 0x00000000, unsigned int 1, const std::allocator<char> & {...}) line 48 + 43 bytes
std::basic_stringbuf<char,std::char_traits<char>,std::allocator<char> >::str() line 36 + 73 bytes
std::basic_stringstream<char,std::char_traits<char>,std::allocator<char> >::str() line 262 + 31 bytes

可以看出ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值