2009-04-10 88 views
9

我正在运行一个(大部分)单线程程序(有一个主线程做一切事情,其他人只读东西)。我可以让应用程序在VS2008中稍作改动(我更改了表单的文本和另一个表单的Tab顺序)后正常运行,但我无法再让它在调试器外部工作。有谁知道这会导致什么?C#应用程序运行调试,但不是没有

说明:使用调试器(F5)启动的发布模式起作用。调试模式,带调试器(F5)。调试可执行文件或在VS之外启动或使用Ctrl + F5发布的可执行文件失败。

它使用微软的虚拟地球3D,它似乎在'希望之环'(加载环)即将完成时崩溃。

事件日志说: “.NET运行库版本2.0.50727.3053 - 致命的执行引擎错误(000006427F44AA6E)(80131506)”

罪魁祸首:这一行:

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

使它失败。但是,工作的表单使用完全相同的行,没有问题。这条线对于程序的运行是必要的。我不知道它在做什么。

另一导致该错误似乎在.NET框架内。应用程序在另一台机器上工作,试图重新安装。 更新:没有什么区别,虽然当我修复VS时,它一直告诉我即使我没有运行它,Visual Studio崩溃了。


错误 当我一两分钟后,启动该程序,我得到: 应用程序生成了无法处理的异常。

处理ID = 0x9CC(2508),线程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个字节)...可爱的wi ndows。

+0

你会得到什么错误? – 2009-04-10 17:45:49

+0

没有,它只是崩溃。 Windows说应用程序需要关闭。 – Malfist 2009-04-10 17:47:03

+0

你能更具体地表达“调试器之外”的含义吗?你的意思是F5与Ctrl + F5在Visual Studio中?如果你去bin/debug目录并双击exe文件就会失败? – 2009-04-10 17:47:53

回答

5

我修复了这个问题,.NET 2.0 Framework被破坏,当我重新安装它时,所有的东西都神奇地重新开始工作。

0

搜索#if(DEBUG)指令? 搜索Debug.Assert(?

您是否使用了错误?我发现this线程(承认没有可怕的帮助)

2

Here是一个支持文章与该错误。这是否适用?

也许调试器正在吃掉VE3D API抛出的消息。在VS中,执行ctrl + alt + e并将其更改为在任何异常抛出时中断。这可以是tedius b/c,它会在你所有的try catch块上打破,但它可能会给你一些信息。

Here是一些信息。关于那个PlugInLoader。它似乎暗示它必须从FirstFrameRendered事件处理程序调用。也许你的一个表格是这样做的,一个不是?

7

我遇到过类似的问题,其中时序冲突导致失败,我的调试(断点和单步执行代码)迫使代码以正确的顺序运行。

5

尝试从Release版本(在项目设置中)取消优化,看看是否有帮助。

4

我不能告诉你究竟是什么问题,但这里是你可以做什么来获得线索真正发生的事情。我假设你正在使用VS2008或2005

  1. 切换到发布模式
  2. 进入调试\例外,并标出全部“时抛出”的例外,像在这里说明:在调试器http://vvcap.net/db/JbWS_tzy2IpBoI7R7amm.htp
  3. 运行可执行文件,忽略VS的警告,有没有调试信息

似乎的确有扔在执行过程中一段时间​​win32异常,但这种方式或其他,你会得到调试一个或多个消息解释什么样的异常发生了,在哪里。在大多数情况下,这些消息使之很清楚究竟是什么地方出了错

编辑:有一件事我忘了提的是,非托管的调试也必须打开,例如像here (when you start program directly from IDE)here (when you attach to running process)

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中)

关于它的思考,也有可能是一些服务或某些冲突。尝试停止所有不需要的服务并关闭不需要的程序(包括启动程序),然后查看会发生什么情况。

0

我曾经与完全相同的行为使用插件系统类似的问题。当从MarshalByRef对象(参见下面的示例代码)加载插件时,似乎.NET为加载的程序集创建了新的AppDomain或Context。 (任何人都可以证实这一点?我还没有发现这方面的任何来源。)

public class ProxyAssemblyLoader : MarshalByRefObject { 
    public Assembly GetAssembly(string path) { 
     return Assembly.LoadFrom(path); 
    } 
} 

而且在我的情况插件加载不同版本的mscorlib的。 (我的应用程序是CLR2,加载的是CLR4)之后,我通过反射来使用插件,并尝试访问从其他应用程序域加载的新mscorlib的值。通常两者都应该可用,因为mscorlib是一个常用的程序集并且只加载一次(请参阅Global Assembly Cache)。但它似乎好像事实并非如此。但一般微软advises to avoid

我还没弄清楚问题是什么,但我想通了导致应用程序崩溃没有任何提示的调用。 为什么没有任何提示?它没有任何提示就会崩溃,因为抛出的异常只在“其他”appdomain中可用,并且不适用于主/默认应用程序域。

采取的操作只是隐含将另一个appdomains程序集的值复制到默认appdomain中的本地无类型值(object)。这足以得到由于程序集的不同版本而导致的类型标识不匹配错误。看起来好像Visual Studio可以处理它,但是如果应用程序独立运行,它会崩溃。

这也可以解释为什么你需要重新安装.NET。也许你安装的.NET框架是一个测试版或类似的东西,其中包含一个微小的差异。

总之对这个问题的一些解决方案,一般可能是:使用不同的版本,不同版本的同一类型的组件

  • 避免。
  • 在其他情况下可能会尝试在同一个appdomain中加载两个程序集。 (尽可能考虑探测环境。)
  • 解决方案cross appdomain communication could be serialization的值。
  • (请确保安装了正确的.NET框架的非测试版。)
0

我有完全相同的问题与我的控制台应用程序之一。我确定这是我的杀毒软件(Avast)导致的问题。

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

相关问题