【问题标题】:Curious Visual Studio 2010 Debugging Behavior in Windows 7 x64Windows 7 x64 中奇怪的 Visual Studio 2010 调试行为
【发布时间】:2012-03-20 20:02:37
【问题描述】:

显然,Windows 吃掉了我的错误。字面上地。我正在处理这个 C# .Net 4.0 @ VS 2010 应用程序,但它最终崩溃了。 Windows 出现并说它做了一些“兼容性”修改以使应用程序“更好地工作”,然后我的应用程序窗口就消失了,再见调试模式。

我又跑了。当应用程序应该崩溃时,它只是退出,没有错误,什么都没有。

不管怎样,我知道错误是什么,并修复了它。这几天一切正常。

但是今天,我通过 ThreadPool 实现了一些简单的线程。会发生什么事情在我的线程中崩溃了,这是很棒的东西:

Visual Studio 在解决方案中导航,打开文件和崩溃的函数,但随后它停止中断我的应用程序并向我显示错误。它只是打开了正确的文件,正确的功能,然后我的线程退出了,我的窗口上的进度条一直在旋转,就是这样......陷入困境......

为了让事情变得更加复杂(即使在单线程场景中也会发生这种情况),请检查一下:我尝试捕获整个程序。从技术上讲,这应该会捕获发生的 ANY 错误。好吧,你猜怎么着,它没有。我在错误日志中没有看到任何错误。

有趣的是,它似乎只在通过我的强类型数据集(使用 .Net 的 MySQL 库)访问数据库时发生。其他错误已成功记录。

但几个月前我在 Windows XP 上使用了相同的 MySQL 库,我总是记录所有错误,并且在使用 Visual Studio 进行调试时,在运行时显示给我。

  try //Main application loop. Logs all errors, yeah.
  {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    ETKSession.DebugMode = false;
    Application.Run(new frmLogin());
  }
  catch (Exception ex)
  {
    AErrorLogging.Log(ex); //This is a tested error log writer of mine which usually worked.
    if (ETKSession.DebugMode) throw new Exception(ex.Message, ex);
  }

你知道里面到底发生了什么吗?!当 Windows 告诉我它的“兼容性改进”时,我尝试点击一些链接,但我得到的只是愚蠢的支持中心链接,没有任何相关内容。我什至无法更改那些兼容性设置。在调查我的应用程序的 EXE 属性后,我发现完全没有进行兼容性更改 ::- (。非常令人沮丧!

【问题讨论】:

  • 这是否发生在 Form_Load() 事件中?我在这里阅读了一些关于 64 位系统的静默异常的有趣问题:stackoverflow.com/questions/4497122/silent-exception
  • 不仅如此。我已经看到它发生在 Form_Load 中,但这次它发生在我在 Form 上的 Windows Forms Timer 中。我还编辑了我的问题,以反映这实际上是如何绕过我的错误处理的!
  • 线程调试一直很困难。尝试在单线程中调试。更不用说我们不知道你的线程中有什么样的 codez :)
  • 只是为了确定,加载和计时器事件中的代码是否被 try catch 语句所包围?
  • 正如我所说,这发生在之前我什至添加了线程。线程业务是我决定发布这个问题的唯一原因,因为调试现在开始变得非常困难。我需要调试器才能工作。

标签: c# visual-studio-2010 windows-7


【解决方案1】:

我会尝试以这种方式捕获异常:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    ETKSession.DebugMode = false;
    Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
    Application.Run(new frmLogin());
}

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    AErrorLogging.Log(ex); //This is a tested error log writer of mine which usually worked.
    if (ETKSession.DebugMode) throw new Exception(ex.Message, ex);
}

您之前提到 Form_Load 和 Timers 不包含 try catch 代码。我认为在您的处理程序中添加一个 try catch 可能会有所帮助:there is an existing issue on 64bits 异常会从 Form_Load 中静默删除。

【讨论】:

  • 我编辑了我的答案。我认为您可以使用您的错误日志编写器尝试在 form_load() 中尝试捕获。
猜你喜欢
  • 2012-02-25
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2014-06-12
  • 2011-04-11
  • 1970-01-01
相关资源
最近更新 更多