VS2010不显示未处理的WinForms应用程序异常消息在Windows的64位版本 [英] VS2010 does not show unhandled exception message in a WinForms Application on a 64-bit version of Windows

查看:270
本文介绍了VS2010不显示未处理的WinForms应用程序异常消息在Windows的64位版本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我创建一个新项目,我得到了未处理的异常奇怪的行为。这是我怎么能重现该问题:

When I create a new project, I get a strange behavior for unhandled exceptions. This is how I can reproduce the problem:

1)创建一个新的Windows窗体应用程序(C#,.NET Framework 4中,VS2010)

1) create a new Windows Forms Application (C#, .NET Framework 4, VS2010)

2)添加以下code到 Form1_Load的处理程序:

2) add the following code to the Form1_Load handler:

int vara = 5, varb = 0;
int varc = vara / varb;
int vard = 7;

我预计VS休息,并显示在第二行未处理的异常信息。但是,什么情况是,第三行是刚刚跳过没有任何消息,并且应用程序保持运行。

I would expect that VS breaks and shows an unhandled exception message at the second line. However, what happens is that the third line is just skipped without any message and the application keeps running.

我没有这个问题与我现有的C#项目。所以我想我的新项目有一些奇怪的默认设置创建的。

I don't have this problem with my existing C# projects. So I guess that my new projects are created with some strange default settings.

有没有人有一个想法有什么错我的项目???

Does anyone have an idea what's wrong with my project???

我试着在调试 - 检查盒>例外。但随后处决打破即使我处理一个的try-catch 块除外;这也是不是我想要的。如果我没有记错,有一个叫做未处理的异常或在此对话框中这样的事情列,这将excatly我想要什么。但在我的项目只有一个柱(抛出该异常)。

I tried checking the boxes in Debug->Exceptions. But then executions breaks even if I handle the exception in a try-catch block; which is also not what I want. If I remember correctly, there was a column called "unhandled exceptions" or something like this in this dialog box, which would do excatly what I want. But in my projects there is only one column ("Thrown").

推荐答案

这是由WOW64仿真层,使32位code能在Windows 7它的64位版本上运行引发一个棘手的问题燕子在响应由64位窗口管理器生成通知运行,如加载事件code例外。 $ P $无法看到它,并加强在pventing调试器。这个问题确实很难解决,微软的Windows和DevDiv团体指责来回。 DevDiv不能做任何事情,Windows认为它是正确的和记录的行为,神秘这听起来。

This is a nasty problem induced by the wow64 emulation layer that allows 32-bit code to run on the 64-bit version of Windows 7. It swallows exceptions in the code that runs in response to a notification generated by the 64-bit window manager, like the Load event. Preventing the debugger from seeing it and stepping in. This problem is hard to fix, the Windows and DevDiv groups at Microsoft are pointing fingers back and forth. DevDiv can't do anything about it, Windows thinks it is the correct and documented behavior, mysterious as that sounds.

这当然是<一href=\"https://msdn.microsoft.com/en-us/library/windows/desktop/ms633573%28v=vs.85%29.aspx\">documented但几乎没有人能理解的后果,或认为这是合理的行为。尤其不能当窗口过程隐藏从视图当然,就像是在使用包装类隐藏窗口水暖任何项目。如同任何的WinForms,WPF或MFC应用程序。根本的问题是微软无法弄清楚如何流入从32位code回到例外的64位code触发通知回32位code,它试图处理或调试例外。

It is certainly documented but just about nobody understands the consequences or thinks it is reasonable behavior. Especially not when the window procedure is hidden from view of course, like it is in any project that uses wrapper classes to hide the window plumbing. Like any Winforms, WPF or MFC app. Underlying issue is Microsoft could not figure out how to flow exceptions from 32-bit code back to the 64-bit code that triggered the notification back to 32-bit code that tries to handle or debug the exception.

这只是附加调试器的问题,你的code将轰炸无一如常。

It is only a problem with a debugger attached, your code will bomb as usual without one.

项目>属性>生成标签>目标平台=值为anycpu的勾去掉preFER 32位。您的应用程序现在将运行64位程序,消除了WOW64故障模式。一些后果,它禁用编辑+之前,VS2013继续前行VS版本,并可能并不总是可能的,当你有32位code的依赖。

Project > Properties > Build tab > Platform target = AnyCPU and untick Prefer 32-bit. Your app will now run as a 64-bit process, eliminating the wow64 failure mode. Some consequences, it disables Edit + Continue for VS versions prior to VS2013 and might not always be possible when you have a dependency on 32-bit code.

其他可能的解决方法:


  • 调试>异常>勾选框,抛出该异常为CLR例外,强制调试器停在code抛出异常的行。

  • 写的try / catch在加载事件处理程序,并在故障快速转移catch块。

  • 使用 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)的Main()方法,以便异常陷阱消息循环是不是在调试模式下禁用。然而,这使得所有未处理的异常难以调试,在 ThreadException 事件是pretty没用。

  • 试想,如果你的code在加载事件处理真正属于。这是非常罕见需要它,它不过是在VB.NET中非常受欢迎的绝唱,因为它是默认的事件和平凡双击添加事件处理程序。你只有永远的真正的需要加载当你以后用户preferences感兴趣的实际窗口大小和应用自动缩放。其他一切属于在构造函数中。

  • 更新到Windows 8或更高版本,他们有这个WOW64问题就迎刃而解了。

  • Debug > Exceptions > tick the Thrown box for CLR exceptions to force the debugger to stop at the line of code that throws the exception.
  • Write try/catch in the Load event handler and failfast in the catch block.
  • Use Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException) in the Main() method so that the exception trap in the message loop isn't disabled in debug mode. This however makes all unhandled exceptions hard to debug, the ThreadException event is pretty useless.
  • Consider if your code really belongs in the Load event handler. It is very rare to need it, it is however very popular in VB.NET and a swan song because it is the default event and a double-click trivially adds the event handler. You only ever really need Load when you are interested in the actual window size after user preferences and autoscaling is applied. Everything else belongs in the constructor.
  • Update to Windows 8 or later, they have this wow64 problem solved.

这篇关于VS2010不显示未处理的WinForms应用程序异常消息在Windows的64位版本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆