C#app运行调试,但不是没有

时间:2009-04-10 17:44:08

标签: c# .net winforms debugging

我正在运行一个(主要是)单线程程序(有一个主线程可以完成所有事情,其他人只能读取内容)。我可以通过一个小的更改(我更改了表单的文本和另一个表单的Tab键顺序)使应用程序在VS2008中正常运行,但我不能再让它在调试器之外工作。有谁知道会导致什么?

澄清:使用调试器(F5)启动的发布模式有效。调试模式,使用调试器(F5)工作。在VS外部或使用Ctrl + F5启动的调试可执行文件或释放可执行文件失败。

它使用微软的Virtual Earth 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)。

单击“确定”终止该应用程序 单击CANCEL以调试应用程序。


反汇编是奇怪的:

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    

它重复相同的代码块几次(减去与自身交换的斧头)


除了我的电脑,它已经在我测试过的每台机器上运行,除了我的机器上的VM,它不会安装.NET框架,因为安装程序从0字节中下载0字节用于框架)...可爱的窗户。

10 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

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

答案 2 :(得分:5)

我修复了它,.NET 2.0框架已经损坏,当我重新安装它时,一切都神奇地开始了。

答案 3 :(得分:4)

我无法告诉你究竟是什么问题,但是你可以做些什么来弄清楚究竟发生了什么。我假设您使用的是VS2008或2005。

  1. 切换到发布模式
  2. 转到Debug \ Exceptions,并标记所有“Thrown”异常,如下图所示:http://vvcap.net/db/JbWS_tzy2IpBoI7R7amm.htp
  3. 在调试器中运行可执行文件,忽略VS中没有调试信息的警告
  4. 似乎在执行期间有一段时间抛出了win32异常,但不管怎么说,您将从调试器获得一条或多条消息,说明发生了什么样的异常以及在哪里发生。在大多数情况下,这些消息非常清楚到底出了什么问题

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

答案 4 :(得分:2)

Here是一篇包含该错误的支持文章。这适用吗?

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

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

答案 5 :(得分:1)

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

你有google搜索错误吗?我发现this线程(诚然不是非常有帮助)

答案 6 :(得分:1)

我们用MSFT发现并解决了这个问题,我们在VSTO开发中遇到了这个问题。 从MSFT应用以下补丁。

http://support.microsoft.com/kb/975954

http://support.microsoft.com/kb/974372

答案 7 :(得分: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中一般调试的好博客)
  4. 考虑一下,它也可能是某种服务或某种冲突。尝试停止所有不需要的服务并关闭不需要的程序(包括启动程序),看看会发生什么。

答案 8 :(得分: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那个。

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

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

这也可以解释为什么需要重新安装.NET。也许您安装的.NET-Framework是测试版或类似的东西,其中包含一些细微差别。

总之,该问题的一些通用解决方案可能是:

  • 避免使用具有相同类型的不同版本的不同版本的程序集。
  • 在其他情况下,可能会尝试在同一个应用程序域中加载两个程序集。 (尽可能考虑探测背景。)
  • cross appdomain communication could be serialization值的解决方案。
  • (确保安装了正确的.NET-Framework非Beta版本。)

答案 9 :(得分:0)

我的一个控制台应用程序遇到了完全相同的问题。我确定是我的防病毒软件(Avast)造成了这个问题。

BIN文件夹添加到排除列表中并禁用&#34; DeepScreen&#34;。 然后重建项目并再试一次!