C#应用程序在调试时可以运行,但不调试则无法运行

14

我在运行一个(大多数情况下)单线程程序(有一个主线程负责所有操作,其他线程只读取数据)。我可以在VS2008中进行一些小改动后(我更改了一个表单的文本和另一个表单的标签顺序),使应用程序正常运行,但是我无法在调试器之外让它正常工作。有人知道是什么原因吗?

澄清: 在使用调试器(F5)启动的发布模式下可以正常工作。在使用调试器(F5)启动的调试模式下也可以正常工作。在使用Ctrl+F5或在VS之外启动的Debug或Release可执行文件将导致失败。

它使用Microsoft的Virtual Earth 3D,在“希望之环”(加载环)即将完成时似乎会崩溃。

事件日志显示:“.NET Runtime版本2.0.50727.3053 - 致命执行引擎错误(000006427F44AA6E)(80131506)”

罪魁祸首: 这行代码:

        this.loader = PlugInLoader.CreateLoader(this.globeControl.Host);

导致它失败。然而,之前正常工作的表单使用了完全相同的代码行且没有问题。该行对程序的功能是必要的。我不知道它在做什么。

另一个线索错误似乎出现在 .NET 框架内部。该应用程序在另一台机器上工作,尝试重新安装。更新:没有任何差别,但当我修复 VS 时,它一直告诉我 Visual Studio 崩溃了,即使我没有运行它。


错误 启动程序后几分钟,我会收到以下错误信息: Application has generated an exception that could not be handled.

Proccess ID=0x9CC (2508), Thread ID =0xF0C(3852).

点击“确定”终止应用程序。
点击“取消”调试应用程序。


反汇编看起来很奇怪:

0000000077EF2A90  int         3    
0000000077EF2A91  int         3    
0000000077EF2A92  int         3    
0000000077EF2A93  int         3    
0000000077EF2A94  int         3    
0000000077EF2A95  int         3    
0000000077EF2A96  xchg        ax,ax 
0000000077EF2A9A  xchg        ax,ax 
0000000077EF2A9E  xchg        ax,ax 
0000000077EF2AA0  int         3        <-- Crashes here
0000000077EF2AA1  ret    

它多次重复了相同的代码块(除了对自身进行交换)


除了我的电脑外,我测试过的所有机器上都运行正常,但是在我的虚拟机上却无法安装.NET框架,因为设置程序下载0字节中的0字节框架……可爱的Windows。


你能更具体地解释一下你所说的“在调试器之外”是什么意思吗?你是指Visual Studio中的F5与Ctrl+F5吗?如果你转到bin/debug目录并双击exe文件,它会失败吗? - JP Alioto
我认为乔治是正确的,必须将其隔离。 - JP Alioto
他们在里面,我应该移除它们吗? - Malfist
你的项目中的引用,在添加时,是否有使用 .NET 选项卡?我可能错了,但我非常确定那些是你 GAC 的内容。 - George Mauer
没有,我是通过浏览将它们添加到了C:\Program Folder (x86)\Virtual Earth 3D文件夹中。 - Malfist
显示剩余19条评论
10个回答

7

我曾经遇到类似的问题,时间冲突导致失败。通过调试(设置断点并逐行执行代码),可以强制使代码按照正确的顺序运行。


那是一个有趣的想法,但如果他的应用程序只在单线程上写入,它真的可能是问题吗? - George Mauer
调试器中没有断点 :( - Malfist
你说得对,通常是由多线程引起的,但有时对象在后台执行多线程操作。 - C. Ross

7

尝试在项目设置中从发布版本构建中取消优化,并查看是否有帮助。


这对我解决了问题。 - Greg Gum
谢谢。这对我有用,但我真的不喜欢它作为长期解决方案。有人知道取消选中会改变什么,以及更好的方法是什么吗? - Rory McCrossan
这是一篇关于优化的有趣博客文章:https://blogs.msdn.microsoft.com/ericlippert/2009/06/11/what-does-the-optimize-switch-do/,但是说实话,如果这引起了问题,那么更深层次的问题就出现了——只需查看其他答案。甚至可能是 .net 安装文件损坏所致... - Mladen Mihajlovic

5

我解决了问题,.NET 2.0框架损坏了,重装后,一切又神奇地恢复正常了。


无法弄清如何重新安装。安装程序显示已经安装。控制面板(添加或删除程序)有一个更改按钮,显示对话框和进度条,但它没有说明是否重新安装了任何内容,甚至没有说明是否成功或失败。无论我尝试什么都没有影响到我的程序无法运行的问题。 - Jared Updike
你需要一个第三方工具,微软不允许你删除它。你正在寻找dotnetfx或.NET修复工具。谷歌一下,应该不难找到。根据微软的说法,这种情况不会发生,因此您无法卸载它。 - Malfist
为什么这个被投票否决了。它解决了问题... - Malfist

4
我无法告诉您问题的具体情况,但以下是可以帮助您了解实际情况的方法。我假设您正在使用VS2008或2005。
1. 切换到发布模式 2. 转到调试 > 异常,并标记所有“已抛出”异常,如图所示:http://vvcap.net/db/JbWS_tzy2IpBoI7R7amm.htp 3. 在调试器中运行可执行文件,忽略来自VS的没有调试信息的警告
似乎在执行过程中会抛出Win32异常,但通过这种方式,您将从调试器中获得一个或多个消息,解释发生了什么类型的异常以及在哪里发生了异常。在大多数情况下,这些消息清楚地说明了出了什么问题。
编辑:我忘记提到一件事,即还必须开启非托管调试,如(当您直接从IDE启动程序时)(当您附加到运行进程时)

有人已经让我这样做了,这没有任何区别。没有任何异常被抛出。什么都没有。它只是在没有调试器的情况下崩溃了。 - Malfist

3

这里有一篇关于这个错误的支持文章,是否适用?

也许调试器正在吃掉VE3D API抛出的异常。在VS中,按下ctrl+alt+e并将其更改为在抛出任何异常时都会中断。这可能很烦人,因为它会在所有try catch块上中断,但它可能会给你一些信息。

这里有一些关于该PlugInLoader的信息。它似乎暗示它必须从FirstFrameRendered事件处理程序中调用。也许你的某个表单正在这样做,而另一个则没有?


不,它被编译为 .net 3.5 并在具有用户配置文件(即我)的用户下运行。 - Malfist
如果你在 FirstFrameRendered 事件中调用它,那就太晚了。它是为数不多的必须在此之前调用的内容之一。然而,插件的加载发生在第一帧被渲染之后。 - Malfist

1
我曾经遇到过一个类似的问题,使用插件系统时出现了完全相同的行为。当从MarshalByRef对象(请参见下面的示例代码)加载插件时,似乎.NET会为已加载的程序集创建一个新的AppDomain或上下文。(有人能证实这一点吗?我没有找到任何相关的来源。)
public class ProxyAssemblyLoader : MarshalByRefObject {
    public Assembly GetAssembly(string path) {
        return Assembly.LoadFrom(path);
    }
}

此外,在我的情况下,插件加载了不同版本的mscorlib。(我的应用程序是CLR2,而加载的是CLR4)然后,我通过反射使用了插件,并尝试访问新的mscorlib的值,该值是从其他应用程序域加载的。通常,两者都应该可用,因为mscorlib是一个常用程序集,只加载一次(请参见全局程序集缓存)。但是,似乎并非如此。但总的来说,Microsoft 建议避免这样做。
我还没有完全弄清楚问题所在,但我找到了导致应用程序崩溃的调用,而没有任何提示。为什么没有任何提示?它没有任何提示,因为抛出的异常仅在“另一个”应用程序域中可用,而对于主/默认应用程序域不可用。
执行的操作只是将另一个应用程序域的程序集的值隐式复制到默认应用程序域中的本地未类型化值(object)。由于程序集的不同版本,这足以引发类型标识不匹配错误。似乎 Visual Studio 可以处理它,但如果应用程序独立运行,则会崩溃。
这也可能解释了为什么您需要重新安装 .NET。也许您安装的 .NET Framework 是测试版或类似的东西,其中包含了一些微小的差异。
总之,问题的一些通用解决方案可能是:
  • 避免在不同版本的相同类型的程序集中使用不同的版本。
  • 在其他情况下,可以尝试在同一应用程序域内加载两个程序集。(就探测上下文而言,尽可能做到这一点。)
  • 跨应用程序域通信的解决方案可能是对值进行序列化
  • (确保安装了正确的 .NET Framework 非测试版版本。)

1

1

搜索#if(DEBUG)指令?

搜索Debug.Assert(?

你有通过谷歌搜索错误信息吗?我找到了this帖子(可能并不是非常有帮助)


这是一个使用Virtual Earth 3D创建动画的应用程序,之前一直可以正常工作,但在我进行了一些小修改后就出现了问题。 - Malfist
应用程序中没有#if(DEBUG)。 - Malfist

0

我曾经在我的控制台应用程序中遇到了完全相同的问题。我确定是我的杀毒软件(Avast)导致了这个问题。

BIN文件夹添加到排除列表中并禁用“DeepScreen”。 然后重新构建项目并再次尝试!


0

我认为还有一件事情需要做,那就是使用WinDbg进行调试。以下是一些关于如何使用它的链接:

  1. http://www.codeproject.com/KB/debug/windbg_part1.aspx
  2. http://blogs.msdn.com/johan/archive/2007/11/13/getting-started-with-windbg-part-i.aspx
  3. http://blogs.msdn.com/tess/(关于在windbg中进行调试的好博客)

思考一下,可能也是某个服务或其他东西发生了冲突。尝试停止所有不必要的服务和关闭不必要的程序(包括启动项),然后看看会发生什么。


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