ntdll.dll!_RtlAllocateHeap@12() + 0x26916 bytes
csv2bin.exe!malloc(unsigned int size=0x00000014) Line 163 + 0x63 bytes C
csv2bin.exe!operator new(unsigned int size=0x00000014) Line 59 + 0x8 bytes C++
>csv2bin.exe!Record::addField(const char * string=0x0034aac8) Line 62 + 0x7 bytes C++
csv2bin.exe!main(int argc=0x00000007, char * * argv=0x00343998) Line 253 C++
csv2bin.exe!__tmainCRTStartup() Line 327 + 0x12 bytes C
它崩溃的那一行代码是一个看起来很普通的分配操作:
pField = new NumberField(this, static_cast<NumberFieldInfo*>(pFieldInfo));
我认为它还没有到达构造函数,只是在跳转到构造函数之前分配内存。通常情况下,在崩溃之前该代码段已经执行了数十次,通常在一个一致的(但不可疑的)位置崩溃。
当使用/MTd或/MDd(调试运行时)编译时,问题消失了,并且当使用/MT或/MD时,问题会重新出现。
NULL从堆栈加载,并且我可以在内存视图中看到它。_RtlAllocateHeap@12 + 0x26916字节似乎是一个巨大的偏移量,就像做了一个错误的跳转。
我尝试在调试版本中使用“_HAS_ITERATOR_DEBUGGING”,但没有找到任何可疑的问题。
在Record::addField的开头和结尾放置HeapValidate显示,直到崩溃时都有一个OK堆。
这以前曾经有效 - 我不确定现在和上次我们编译工具之间发生了什么变化(可能是几年前,也许是在较旧的VS下)。我们尝试过一个较旧版本的boost(1.36 vs 1.38)。
在手动检查代码或将其馈送给PC-Lint并仔细查看输出之前,您有关于如何有效地调试这个问题的任何建议吗?
(如果您在评论中请求信息,我很乐意更新问题。)