我在软件中遇到了一个奇怪的崩溃,我在调试它时遇到了很多麻烦,因此我正在寻求如何解决它的建议.
崩溃是读取NULL指针的访问冲突:
$ 00CF0041的第一次机会异常.异常类$ C0000005,消息'访问冲突位于0x00cf0041:读取地址0x00000000'.
它只发生'有时' - 我还没有设法找出任何押韵或理由,但是,当时 - 并且只在主线程中.当它发生时,调用堆栈包含一个不正确的条目:

对于主线程,它应该显示一个充满其他项目的大堆栈.
此时,所有其他线程都处于非活动状态(主要是坐在WaitForSingleObject或类似的功能.)我只看到这个崩溃发生在主线程中.它始终具有一个条目的相同调用堆栈,在同一地址的相同方法中.此方法可能相关也可能不相关 - 我们在应用程序中使用VCL.不过,我的赌注是,某些东西(可能是很久以前)正在破坏堆栈,而崩溃的地址实际上是随机的.请注意,它在几个版本中的地址相同 - 但它可能不是真正随机的.
这是我尝试过的:
我的问题:
1.如何找到导致崩溃的代码?我怎么做相当于走回堆栈?
2.对于如何追踪此次崩溃的原因,您有什么一般性的建议?
我正在使用Embarcadero RAD Studio 2010(该项目主要包含C++ Builder代码和少量Delphi.)
编辑:我想我应该添加实际导致这个的东西.有一个线程调用ReadDirectoryChangesW然后,使用GetOverlappedResult,等待事件继续并对更改执行某些操作.事件也发出信号,以便在设置状态标志后终止线程.问题是当线程退出时它从未调用过CancelIO.因此,Windows仍在跟踪更改,并且可能仍然在目录更改时写入缓冲区,即使缓冲区,重叠的结构和事件不再存在(也没有创建它们的线程上下文.)CancelIO调用时,没有更多的崩溃.
我已经一直在努力我的软件C++和Java的(建立与Microsoft Visual Studio 2008和Eclipse的),我一直在试图将其从32位操作系统迁移到64位的一个.
编译阶段没问题,但在执行时我得到一个错误,上面写着:
"Windows在javaw.exe中触发了断点.这可能是由于堆的损坏,这表明javaw.exe或它加载的任何DLL中的错误.这也可能是由于用户在javaw时按F12 .exe具有焦点.输出窗口可能包含更多诊断信息.[BREAK] [CONTINUE] [IGNORE]"
您可以在此处查看错误的快照:

你知道这个错误意味着什么吗?"腐败堆"是什么意思?你之前有过这种错误的经历吗?
非常感谢!
我在VS2010中调试我的C++ Win32程序,我总是得到"Windows在program.exe中触发了一个断点".
我对代码进行了双重检查,三重检查和四重检查.我找不到应该发生的任何理由.但它每次都发生在同一点,所以必须有一些东西.
涉及相当多的代码(构造函数,析构函数,窗口消息,内存分配和释放等等),所以在这里放置一些具体内容非常困难,但与此同时我明白,如果没有代码,你可以'我真的做了很多解释.
基本上在点击按钮时,会显示一个显示图像的窗口.如果满足某个条件,我发送一个WM_DESTROY窗口并删除触发析构函数的变量,该析构函数调用Release()my LPPICTURE,并将释放的变量设置为NULL.
然后,当用户再次单击该按钮时,它会尝试动态分配一个新实例(与之前完全相同),这就是生成断点的地方.AFAIK(我一直试图调试这个超过一个小时),构造函数甚至没有启动.它似乎打破new()了动态内存分配的功能.
据我所知,它突破了return HeapAlloc(_crtheap, 0, size ? size : 1);第54行或malloc.c
奇怪的是,当我在VS2010之外运行exe时,一切都继续正常.该程序不会崩溃,并继续按预期工作!