【问题标题】:How can I debug an unhandled exception in code called from a BackgroundWorker?如何在从 BackgroundWorker 调用的代码中调试未处理的异常?
【发布时间】:2010-03-12 20:48:12
【问题描述】:

我正在使用BackgroundWorker 对象及其DoAsync() 方法从一个简单的WinForms 应用程序异步运行一些导入代码。我遇到了一个问题,我不知道正在抛出异常并且线程过早死亡。我最终发现了这一点,现在在阅读Unhandled exceptions in BackgroundWorker 后知道何时抛出异常。

但是,我在调试时仍然遇到问题。如何调试此代码?我想我可以在不使用 BackgrounWorker 的测试应用程序中运行它,但是有没有办法按原样调试它?如果我单步执行实际引发异常的代码,我只会在异常发生时被踢出单步执行。从RunWorkerCompletedEventHandler 重新抛出异常自然也无济于事。

有什么想法!?提前致谢!

【问题讨论】:

  • 我现在在这里看到另一个答案,但标题不像我的那样具有描述性。把这个问题留在这里,只是把人们指向旧的问题是否有意义?这是现有链接的链接:stackoverflow.com/questions/258662/…
  • 实际上,出于某种原因,我从来没有在任何地方遇到异常。与他们所说的有关 Visual Studio 打破 DoWork 线程的说法不同,我的没有!?我认为我在那里没有任何尝试/捕获...是否有原因它没有在预期的地方中断?
  • 我可以在 Visual Studio 的“异常”菜单中禁用此异常吗?我在“托管调试助手”下看到“AsynchronousThreaAbort”,但这似乎没有做任何事情......
  • AsyncCompletedEventArgs (msdn.microsoft.com/en-us/library/…) 中是否设置了错误?
  • 是的,我很好地处理了错误,只是 Visual Studio 没有在实际引发异常的代码处中断。

标签: c# .net debugging asynchronous backgroundworker


【解决方案1】:

为什么不使用 VS 的“Break On Exceptions”选项(Ctrl + Alt + E 或 Debug->Exceptions 并在 Throw 列中放置复选框)?这将在抛出任何异常时停止您的程序执行。

【讨论】:

  • 是的。我必须禁用线程抛出的异常。我还以为是线程问题!
【解决方案2】:

Visual Studio 仅允许您在有源代码的情况下单步执行代码。如果您没有源代码,那么我建议您学习如何使用 winDBG。 MS在这里有一个很好的教程:

http://blogs.msdn.com/tess/pages/net-debugging-demos-information-and-setup-instructions.aspx

它有一个学习曲线并且需要一些时间,但我发现它是值得的。我已经使用这个工具调试了很多突然崩溃、CPU 挂起或性能不佳的应用程序。

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 2010-11-05
    • 2013-06-01
    • 2013-04-25
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多