VC6 CRT库一BUG记录
帮一哥们调试了一Dump文件。来源是一服务器端程序,连续运行10多天后出现崩溃。看dump崩溃在MSVCRTD!malloc_dbg内,写了个VC6程序试了一下,崩溃的具体位置如下:
_heap_alloc_dbg(unsigned int 100, int 1, const char * 0x00000000, int 0) line 334
_nh_malloc_dbg(unsigned int 100, int 0, int 1, const char * 0x00000000, int 0) line 248 + 21 bytes
malloc(unsigned int 100) line 130 + 21 bytes
代码如下:
lRequest = _lRequestCurr;
/* break into debugger at specific memory allocation */
if (lRequest == _crtBreakAlloc)
_CrtDbgBreak();
因为lRequest和_crtBreakAlloc相等,所以中断在了调试断点处。_lRequestCurr是CRT调试堆用于记录堆内存被申请的次数,每次申请的时候加1,时间长了之后这个变量溢出变成-1,而_crtBreakAlloc默认的值就是-1,因此这里CRT认为被下了用户断点,主动中断。
看来Debug版用于生产环境还是有风险的。合理的还是用Release+调试信息比较好,呵呵。