前言
程序员最痛苦的事莫过于深陷于BUG的泥潭,我也没少在这上面摔跤。这里,我把自己的一些经验教训总结出来,涉及的内容包括死循环、死锁、内存泄漏以及内存访问错误等,如果能对朋友们有所帮助,那就再好不过了。不过,我不打算按照循序渐进的方式来撰写这些文章 ,而是想到哪写到哪,也许到最后才会形成一个完整的系列。
本节将以一个真实例子讲述如何在VC6环境下调试“Stack Overflow”错误。
问题浮现
我负责维护前任同事的开发的一个DLL,这是一个用于网络通信的中间件,今天在应用程序断开与服务器的连接时突然报错,而且屡试不爽。调试发现出错总是在一个类的析构函数中出现,其类似代码如下:
class Bar
{
public:
~Bar()
{
stringstream ss;
ss << "~Bar" << 123;
cout << ss.str(); // 这里 出错
}
};
{
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
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
可以看出ÿ