查找程序中止的位置 (VB.net)

Find where a program aborts (VB.net)

我有一个巨大的 VB6 遗留程序,我刚刚将其转换为 VB.net。 主窗体显示在屏幕上,在进入 Windows 消息循环之前,我成功地在最后一个可执行行上打印了注释。

然后程序终止(所有 windows 消失),没有任何错误提示。

我一直无法确定此程序中止时正在执行什么代码,希望得到建议。

我是 运行 Visual Studio 2008 Professional(因为代码刚从 VB6 转换而来),使用调试器。

我在每个 timer_Tick 处理程序和每个 form_Activated 处理程序中添加了一个方法调用作为第一行。我也在许多主要功能中进行相同的调用。在我调用的 sub 的第一行中设置了一个断点...并且在消息循环开始后它没有命中。

我试图查看所有 Windows 消息,但不熟悉 Spy++ 工具,并且完全被消息淹没了。我知道我可以限制到一个特定的 window,因为我的程序打开了很多 windows,它可能是一个试图打开的新程序导致失败。

如果我没有找到其他解决方案,我可以使用 Spy++ 进行进一步研究,但我真的很想获得其他关于查找位置的建议。

谢谢。

尝试在 Visual Studio 调试器中启用所有异常。在 DEBUG 菜单中,select Exceptions 并选中 Thrown 下的所有框。 (稍后您可以使用 Reset All 恢复为默认设置。)这可能会暴露许多异常,这些异常本来可以处理,您可以忽略,但也可能会导致您找到根本问题。

如果没有代码,这是一个猜测,但它会与您描述的情况相符。当应用程序从 Sub Main 启动时,您的代码必须 启动 消息泵 - 它不会自动发生:

Public Sub Main()
     ...
    ' same as `Enable XP Visual Styles in App settings
    Application.EnableVisualStyles()

    ...
    ' last line
    Application.Run(New MainForm())
End Sub

如果要使用视觉样式,需要在引用任何窗体或控件之前启用它们。

消息泵是通过Application.Run启动的。如果您只是显示您的起始表单(and/or 其他),应用程序将在 Sub Main 终止时终止,因为没有应用程序消息泵。