lea*_*der 9 c++ boost visual-studio-2005 visual-studio
我有一个小的单线程C++应用程序,使用Visual Studio 2005编译和链接,使用boost(crc,program_options和tokenizer),一小部分STL和各种其他系统头文件.
(它的主要目的是读取.csv并生成自定义二进制.dat和配对的.h声明结构,"解释".dat的格式.)
在调试器外部运行时,该工具正在崩溃(对NULL的访问冲突),仅在发布时.例如,按F5不会导致工具崩溃,Ctrl-F5会崩溃.当我重新连接调试器时,我得到这个堆栈:
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
Run Code Online (Sandbox Code Playgroud)
它崩溃的线是一个看似无害的分配:
pField = new NumberField(this, static_cast<NumberFieldInfo*>(pFieldInfo));
Run Code Online (Sandbox Code Playgroud)
...我不相信它已经到达了构造函数,它只是在跳转到构造函数之前分配内存.它在崩溃时也会执行此代码几十次,通常是在一致(但不是非可疑)的位置.
使用/ MTd或/ MDd(调试运行时)进行编译时问题就消失了,使用/ MT或/ MD时会回来.
NULL从堆栈加载,我可以在内存视图中看到它._RtlAllocateHeap @ 12 + 0x26916字节似乎是一个巨大的偏移,就像一个不正确的跳转一样.
我已经尝试_HAS_ITERATOR_DEBUGGING过调试版本,并没有带来任何可疑的东西.
在Record :: addField的开头和结尾删除HeapValidate会在崩溃时显示一个OK堆.
这曾经工作 - 我不完全确定现在和我们最后一次编译工具之间发生了什么变化(可能是几年前,也许是在较旧的VS之下).我们尝试过较旧版本的增强版(1.36 vs 1.38).
在回退到手动调查代码或将其提供给PC-Lint并梳理其输出之前,有关如何有效调试此问题的任何建议?
[如果您在评论中请求信息,我将很乐意通过更多信息更新问题.]
Sum*_*uma 12
运行调试器与运行调试器之间的一个小知识是操作系统调试堆(另请参阅为什么我的代码在连接调试器时运行缓慢?).您可以使用环境变量_NO_DEBUG_HEAP关闭调试堆.您可以在计算机属性中或在Visual Studio的"项目设置"中指定此项.
关闭调试堆后,即使连接了调试器,也应该看到相同的崩溃.
也就是说,请注意内存损坏可能很难调试,因为腐败的真正原因(如某些缓冲区溢出)通常可能与您看到症状(崩溃)的位置相差甚远.
| 归档时间: |
|
| 查看次数: |
8199 次 |
| 最近记录: |