没有调试信息的.NET应用程序崩溃

6
我有一个备份程序,目前在我们公司的70台机器上运行。这些机器是笔记本电脑、台式机和Windows系统(xp-32,vista-32,vista-64,7-32-7-64),没有任何问题。
但是有一个例外,这也是我在这里寻求帮助的原因。
在一台装有.Net 4 Framework的Dell Latitude笔记本电脑上,该控制台应用程序在启动Sub Main之前会立即崩溃。它只会给出通用的Windows错误“程序停止工作”,没有查看调试信息的选项。
我尝试过以下几个方法: - 卸载所有非标准软件 - 注释掉几个我认为可能会引起问题的声明 - 重新编译为Auto CPU、x86和x64,以查看是否有区别 - 禁用病毒扫描程序 - 用户是管理员,但我尝试以管理员身份运行 - 在Sub Main中添加了一个消息框,以确定它在哪里崩溃 - 对所有相关代码添加try catch
我从事件查看器中获取了更多信息:
故障模块名称:KERNELBASE.dll,版本:6.1.7600.16385,时间戳:0x4a5bdbdf 异常代码:0xe0434f4d 故障偏移量:0x0000b727
下面的几个条目对我来说似乎很奇怪:
故障进程ID:0x%9 故障应用程序启动时间:0x%10 故障应用程序路径:%11 故障模块路径:%12
我还能打开.wer文件(Windows错误报告平面文件),它重复了大部分相同的信息,但也包括一些正在使用的加载的dll和其他文件。
感谢您花时间阅读我的问题,并希望有人能提出一些解决方法。
Joshua
编辑: 我认为以下Win32 API调用可能会导致问题,它们是唯一我不能轻松注释掉而不需要大量代码重写的内容。 如果是这些API调用导致的问题,为什么只有这台机器会出现呢?
' Obtain a handle to the console application window by passing the title of your application.
Dim hWnd As Integer = Process.GetCurrentProcess().MainWindowHandle
Dim hMenu As Integer = GetSystemMenu(hWnd, False)

'WIN API Functions to assist in disabling the Close button on the Console Window
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Integer, ByVal uPosition As Integer, ByVal uFlags As Integer) As Boolean
Private Declare Function GetForegroundWindow Lib "user32" () As Integer
Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Integer, ByVal bRevert As Boolean) As Integer
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Integer, ByVal uCmd As Integer) As Integer
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Integer, ByVal lpString As String, ByVal nMaxCount As Integer) As Integer
Private Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As Integer, ByVal nCmdShow As Int32) As Boolean
Public Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" (ByVal lpszLocalName As String, ByVal lpszRemoteName As String, ByRef cbRemoteName As Integer) As Integer

我在想为什么我联系不上这个用户。他不得不飞到巴西,所以当我几天后回到他的机器时,我会发布这些努力的结果 :( - JoshF
抱歉没有更新。用户从巴西回来几周后,问题似乎自行解决了。我始终没有找到原因 :( - JoshF
4个回答

1

首先,我会查看Tess Ferrdandez博客,其中有关于创建崩溃调试文件并使用windbg查看的信息。

其次,我会尝试在这些机器中修复框架,因为我们在部署中遇到了类似的问题,而这种方法解决了问题。


当我拿到这台机器时,我会卸载 .Net Framework 4.0 并尝试安装 3.5 看看是否有所不同。 - JoshF
@joshf 最好还是弄清楚为什么在.NET Framework 4.0上失败。想象一下当其他机器从3.5升级到4.0时会发生什么混乱!:) - Jörgen Sigvardsson
+1 给 Tess 的链接,她太棒了! :) Windbg 已经救过我几次了,每个 Windows 开发者都应该学习它的基础知识。观看 Ingo Rammer 在 NDC2010 上的演讲“Hardcore Production Debugging”,非常好。 - Paw Baltzersen
我们没有更改框架,只是修复了安装程序,这解决了我们的问题。 - rerun
我同意Jorgen的看法,最好找出它失败的原因,但我不认为是.NET Framework 4.0的问题。这就是我在我的Windows 7 64位系统上运行的情况,并没有遇到这些问题。更有可能的是安装文件损坏了。再次感谢你的建议 :) - JoshF

1

我会将您所有对句柄(hwnd)的引用更改为IntPtr,因为此数据类型在任何.NET框架中都可以工作,但我不认为整数数据类型在64位环境中适用于句柄。

以下也是来自Microsoft文章的片段:

通常情况下,使用Visual Basic编写的.NET Framework程序集在任何平台上都能够运行。但是,在不同平台上有一些情况表现不同。这些常见情况包括:

结构体中包含根据平台而变化大小的成员,例如任何指针类型。

包含固定大小的常量的指针算术。

不正确的平台调用或COM声明,使用整数代替IntPtr来处理句柄。

将IntPtr转换为Integer。

使用平台调用或COM互操作与不存在于所有平台上的组件。

完整的文章可在此处找到: http://msdn.microsoft.com/en-us/library/8ck8e1y2(v=vs.80).aspx


0

0

当你有32位DLL(或混合32位和64位DLL)时,编译为anyCPU并在64位系统上运行时,有时会出现该错误。我知道你说过尝试编译为x86,但请确保所有的DLL都是32位,然后再编译为x86。


我所使用的所有DLL文件都应该是Win32或来自全局程序集。我没有为这个特定的应用程序创建任何类DLL文件。 - JoshF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接