【问题标题】:C# app runs with debugging, but not without [closed]C# 应用程序在调试的情况下运行,但并非没有 [关闭]
【发布时间】:2010-10-18 19:24:36
【问题描述】:

我正在运行一个(大部分)单线程程序(有一个主线程可以完成所有工作,其他线程只读取内容)。稍作更改(我更改了表单的文本和另一个表单的 tab 顺序)后,我可以让应用程序在 VS2008 中正常运行,但我无法再让它在调试器之外工作。有谁知道这是什么原因造成的?

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

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

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

罪魁祸首:这一行:

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

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

Another Lead 错误似乎在 .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 个字节用于框架)...可爱的窗户。

【问题讨论】:

  • 没有,它只是崩溃了。 Windows 说应用程序需要关闭。
  • 你能更具体地说明你所说的“在调试器之外”是什么意思吗?您是指 Visual Studio 中的 F5 与 Ctrl+F5 吗?如果你去bin/debug目录双击exe会失败?
  • 在调试器之外意味着它没有在调试时运行,使用 Ctrl+F5 启动或直接从可执行文件启动都会导致应用程序崩溃。
  • 事件日志有:.NET 运行时版本 2.0.50727.3053 - 致命的执行引擎错误 (000006427F44AA6E) (80131506)
  • 应用程序是否使用任何网络?就像您允许 VS 通过防火墙但不允许直接通过应用程序一样。

标签: c# .net winforms debugging


【解决方案1】:

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

你用谷歌搜索过错误吗?我找到了this 线程(诚然没有太大帮助)

【讨论】:

  • 这是一个使用 Virtual Earth 3D 创建动画的应用程序,它一直在工作,直到我改变了一些小东西。
  • 应用中没有#if(DEBUG)
【解决方案2】:

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

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

Here 是一些信息。关于那个 PlugInLoader。这似乎暗示它必须从 FirstFrameRendered 事件处理程序中调用。也许您的一种形式正在这样做,而另一种没有?

【讨论】:

  • 不,它被编译为 .net 3.5 并在具有个人资料的用户(我)下运行
  • 如果您从 FirstFrameRendered 事件中调用它,则为时已晚。这是在此之前必须调用的少数几件事之一。但是,加载插件会在第一帧渲染后发生。
【解决方案3】:

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

【讨论】:

  • 这是一个有趣的想法,但如果他的应用程序只在单个线程上写入,这真的会成为问题吗?
  • 调试器中没有断点 :(
  • 你说得对,一般是多线程造成的,但有时候object在后台做多线程。
【解决方案4】:

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

【讨论】:

  • 这为我解决了这个问题。
  • 谢谢。这对我有用,但我真的不喜欢它作为长期解决方案。有谁知道取消选中此更改的确切原因,以及更好的方法是什么?
  • 这是一篇关于优化作用的有趣博客文章:blogs.msdn.microsoft.com/ericlippert/2009/06/11/… 但老实说,如果这导致问题更深层次的问题 - 只需查看其他答案。即使是 .net 的损坏安装...
【解决方案5】:

我无法告诉您到底是什么问题,但您可以通过以下方式了解到底发生了什么。我假设您使用的是 VS2008 或 2005。

  1. 切换到释放模式
  2. 转到 Debug\Exceptions,并标记所有“抛出”异常,如下所示: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)

【讨论】:

  • 已经有人要求我这样做了,没有区别。什么都没有扔。没有。它只是在调试器之外崩溃。
【解决方案6】:

我认为剩下的一件事是使用 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 中进行一般调试的好博客)

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

【讨论】:

    【解决方案7】:

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

    【讨论】:

    • 不知道如何重新安装。安装程序说它已经安装了。控制面板(添加或删除程序)有一个更改按钮,显示一个对话框和一个进度表,但它没有说明它是否重新安装了任何东西,甚至它是成功还是失败。无论我尝试什么都不会影响我的程序无法运行。
    • 您需要第三方工具,微软不会让您删除它。您正在寻找 dotnetfx 或 .NET Fix。谷歌一下,应该不难找到。根据微软的说法,这种事情不会发生,因此您无法卸载它。
    • 为什么这被否决了。这就是解决问题的方法...
    【解决方案8】:

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

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

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

    【讨论】:

      【解决方案9】:

      我曾经遇到过类似的问题,使用插件系统的行为完全相同。从MarshalByRef-object(参见下面的示例代码)加载插件时,.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 程序集的值隐式复制到默认 appdomain 中的本地无类型值 (object)。由于程序集的不同版本,这足以导致类型标识不匹配错误。似乎 Visual Studio 可以处理它,但如果应用程序独立运行,它会崩溃。

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

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

      • 避免将不同版本的程序集与同一类型的不同版本一起使用。
      • 在其他情况下,可能会尝试将两个程序集加载到同一个 appdomain 中。 (尽可能与探测上下文相关。)
      • cross appdomain communication could be serialization 值的解决方案。
      • (确保安装了正确的 .NET-Framework Non-Beta 版本。)

      【讨论】:

        【解决方案10】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-24
          • 1970-01-01
          • 2012-05-21
          相关资源
          最近更新 更多