相关疑难解决方法(0)

如何在没有有用的调用堆栈的情况下调试难以重现的崩溃?

我在软件中遇到了一个奇怪的崩溃,我在调试它时遇到了很多麻烦,因此我正在寻求如何解决它的建议.

崩溃是读取NULL指针的访问冲突:

$ 00CF0041的第一次机会异常.异常类$ C0000005,消息'访问冲突位于0x00cf0041:读取地址0x00000000'.

它只发生'有时' - 我还没有设法找出任何押韵或理由,但是,当时 - 并且只在主线程中.当它发生时,调用堆栈包含一个不正确的条目:

用一行调用堆栈,Classes :: TList :: Get,地址0x00cf0041

对于主线程,它应该显示一个充满其他项目的大堆栈.

此时,所有其他线程都处于非活动状态(主要是坐在WaitForSingleObject或类似的功能.)我只看到这个崩溃发生在主线程中.它始终具有一个条目的相同调用堆栈,在同一地址的相同方法中.此方法可能相关也可能不相关 - 我们在应用程序中使用VCL.不过,我的赌注是,某些东西(可能是很久以前)正在破坏堆栈,而崩溃的地址实际上是随机的.请注意,它在几个版本中的地址相同 - 但它可能不是真正随机的.

这是我尝试过的:

  • 试图在某一点可靠地再现它.我没有发现任何东西每次都会重现它,以及偶尔做或不做的一些事情,没有明显的理由.这些并不是"狭隘"的足以将其缩小到特定代码段的行为.它可能与时间有关,但在IDE中断的时候,其他线程通常什么都不做.我不能排除线程问题,但认为这不太可能.
  • 使用额外的调试语句构建(额外的调试信息,额外的断言等).这样做之后,崩溃永远不会发生.
  • 在启用Codeguard的情况下构建.执行此操作后,崩溃永远不会发生,Codeguard没有显示错误.

我的问题:

1.如何找到导致崩溃的代码?我怎么做相当于走回堆栈?

2.对于如何追踪此次崩溃的原因,您有什么一般性的建议?

我正在使用Embarcadero RAD Studio 2010(该项目主要包含C++ Builder代码和少量Delphi.)

编辑:我想我应该添加实际导致这个的东西.有一个线程调用ReadDirectoryChangesW然后,使用GetOverlappedResult,等待事件继续并对更改执行某些操作.事件也发出信号,以便在设置状态标志后终止线程.问题是当线程退出时它从未调用过CancelIO.因此,Windows仍在跟踪更改,并且可能仍然在目录更改时写入缓冲区,即使缓冲区,重叠的结构和事件不再存在(也没有创建它们的线程上下文.)CancelIO调用时,没有更多的崩溃.

delphi crash callstack c++builder

15
推荐指数
1
解决办法
5442
查看次数

Visual Studio上的C++错误:"Windows在javaw.exe中触发了断点"

我已经一直在努力我的软件C++和Java的(建立与Microsoft Visual Studio 2008和Eclipse的),我一直在试图将其从32位操作系统迁移到64位的一个.

编译阶段没问题,但在执行时我得到一个错误,上面写着:

"Windows在javaw.exe中触发了断点.这可能是由于堆的损坏,这表明javaw.exe或它加载的任何DLL中的错误.这也可能是由于用户在javaw时按F12 .exe具有焦点.输出窗口可能包含更多诊断信息.[BREAK] [CONTINUE] [IGNORE]"

您可以在此处查看错误的快照:

在此输入图像描述

你知道这个错误意味着什么吗?"腐败堆"是什么意思?你之前有过这种错误的经历吗?

非常感谢!

c++ visual-studio-2008

8
推荐指数
2
解决办法
3万
查看次数

Windows已生成断点

我在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时,一切都继续正常.该程序不会崩溃,并继续按预期工作!

c++ winapi visual-studio-2010

2
推荐指数
1
解决办法
3075
查看次数