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

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

澄清:使用调试器(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崩溃了,即使我没有运行它。


错误当我在几分钟后启动程序时,我得到:应用程序已生成无法处理的exception。

进程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 

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


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

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

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

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

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

  1. 切换到释放模式
  2. 转到Debug \ Exceptions,并标记所有“Thrown”exception,如下所示: http : //vvcap.net/db/JbWS_tzy2IpBoI7R7amm.htp
  3. 在调试器中运行可执行文件,忽略VS中没有调试信息的警告

似乎在执行过程中有一段时间抛出了win32exception,但不管怎么说,你会从调试器那里得到一条或多条消息来解释发生了什么样的exception以及在哪里。 在大多数情况下,这些消息很清楚到底出了什么问题

编辑:我忘记提到的一件事是,必须打开非托管调试,例如这里(当你直接从IDE启动程序时)或这里(当你附加到正在运行的进程时)

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

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

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

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

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

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

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

你有没有用Google搜索错误? 我找到了这个post(当然不是非常有用)

我认为还有一件事就是使用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中一般调试的好博客)

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

我曾经遇到类似的问题,使用插件系统完全相同的行为 。 从MarshalByRef -object加载插件时(请参阅下面的示例代码),似乎.NET为加载的程序集创建了一个新的AppDomain或Context。 (任何人都可以证实这一点吗?我没有找到任何关于此的来源。)

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

此外,在我的情况下,插件加载了不同版本的mscorlib 。 (我的应用程序是CLR2,加载的是CLR4)之后我通过reflection使用插件并尝试访问从其他应用程序域加载的新mscorlib的值。 通常两者都应该可用,因为mscorlib是一个常用的程序集,只加载一次(参见全局程序集缓存 )。 但似乎事实并非如此。 但总的来说,微软建议避免这种情况。

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

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

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

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

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

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

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