首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在代码分析器中运行C#应用程序与运行外部代码分析器有什么不同?

在代码分析器中运行C#应用程序与运行外部代码分析器有什么不同?
EN

Stack Overflow用户
提问于 2012-08-23 16:06:28
回答 2查看 280关注 0票数 5

我试图了解代码分析器(在本例中是无人机轮廓仪)如何运行.NET应用程序,而不是直接运行它。我之所以需要知道这一点,是因为我的dev计算机的.NET安装有一个非常奇怪的问题/损坏,它显示在分析器之外,但奇怪的是,它不在分析器内部,而且我是否能够理解为什么我可以修复我的计算机问题。

这个问题似乎只会影响对System.Net.NetworkInformation的方法的调用(而且只在.NET 3.5到2.0中,如果我使用4 all构建什么就行了)。我建立了一个小测试应用程序,它只做一件事,它叫做System.Net.NetworkInformation.IsNetworkAvailable().在分析器之外,我得到了System.dll中发生的“致命执行引擎错误”,这就是它提供的全部信息。据我所知,错误通常是由本机方法调用造成的,这大概是在System.dll允许某些本地DLL执行IsNetworkAvailable()逻辑时发生的。

  • 我试图使用过程监视器来找出分析器内部和外部的差异,记录两种情况下的事件并进行比较。两个日志都是相同的,直到iphlpapi.dll和winnsi.dll被调用之后,就在分析器运行的代码dnsapi.dll和非分析器代码开始加载崩溃报告相关内容之前。当它似乎出错时,分析器运行的代码创建了4-6个新线程,而非分析器(崩溃)代码只创建了1或2个。如果有什么意义的话,我不知道这意味着什么。

可以说是不必要的背景

我的Windows7包括.NET安装(3.5-2.0)运行良好,直到我的硬盘出现了一些损坏,并且校验盘开始发现不好的集群。我将驱动器映像到一个新的驱动器上,除了.NET的这个问题之外,一切都很好。

我需要解决这个问题,重新安装Windows或恢复到映像备份。

下面是我研究过的一些事情:

  • 我已经区分了文件/目录,这些文件/目录似乎是最相关的(下的.NET文件),在磁盘前后问题上没有看到任何变化,在我没有预料到的情况下(没有明显的文件损坏)。
  • 我已经不同的软件和系统注册表蜂箱前和后磁盘问题,并没有看到似乎相关的变化。
  • 我已经创建了一个新的用户帐户,并清理了任何环境变量,以防与环境相关。没有变化。
  • 我做了“证监会/scannow”,它没有发现诚信问题。
  • 我尝试了"ngen更新“来重新生成预编译的代码,以防我错过了一些可能被损坏而什么也没有改变的东西。
  • 我把我的病毒扫描器移除了看它是否有干扰,没什么区别。
  • 我试着在安全模式下运行测试代码,同样的崩溃问题。

我想我需要修复我的.NET安装,但是因为Windows7包含了.NET 3.5-2.0,所以您不能仅仅重新运行一个.NET安装程序来重做它。我无法访问Windows磁盘来尝试通过自身重新安装Windows (计算机有一个恢复分区,但无法使用);此外,驱动器使用全磁盘加密解决方案,重新安装将很困难。

我绝对不想从这里从头开始,安装一个新的Windows,重新安装几十个软件包,尝试并记住几十个与开发相关的自定义/等等。

考虑到这些..。有人有什么有用的建议吗?我需要.NET 3.5-2.0工作,因为我是一个开发人员,需要构建和测试它。

谢谢!

奎氧

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-25 02:37:12

简单地说,我的System.ni.dll文件被损坏了,我更换了它,一切都很好。

长篇大论的答案可能会帮助其他人通过它的解决办法.

我的问题是.Net被损坏了,只有通过分析器才能运行应用程序。我下载了SlimTune开源分析器的源代码,在本地构建了它,并在调用Process.Start()之前设置了一个断点。然后,我比较了通过分析器成功启动应用程序所涉及的所有参数和手动启动的参数。我发现的唯一有意义的区别是添加到环境变量中的.NET配置文件参数:

  • cor_enable_profiling=1
  • cor_profiler={38A7EA35-B221-425a-AD07-D058C581611D}

然后,我尝试在我自己的用户环境中设置这些,瞧!现在,我手动运行的任何应用程序都可以工作。(几个小时前,我确实尝试过做同样的事情,但我使用了一个包含在示例中的GUID,它没有指向真正的分析器,而且显然.NET知道我给它提供了一个假的GUID,并且没有在分析模式下运行。)

现在我回到过去,开始阅读CLR是如何执行PE文件的,希望找出为什么我的应用程序运行时启用了分析功能。我学到了很多东西,但什么也没学到。

但是,我确实记得,我应该重新检查chkdsk日志,我一直在列出由于驱动器故障而损坏的文件。在失败之后,我将列出的所有文件in转换为文件路径/名称,并且我从备份中替换了所有的100+文件,但当我现在回去查看时,我发现了一个注释,虽然我成功地替换了4或5个.NET相关文件,但是有一个这样的文件我无法替换,因为它“正在使用”。那份文件?System.ni.dll!现在我可以从备份中替换这个文件了,瞧,我的.NET安装已经恢复正常,应用程序可以正常工作,不管是否配置。

令人沮丧的是,当这一事件第一次发生时,我完全希望问题与一个损坏的文件有关,特别是一个名为System.dll的文件,该文件保存了失败的方法。因此,我对所有名为System.dll的文件进行了修改和修改。但当时我没有意识到,System.ni.dll是System.dll (或somesuch)的本地编译形式。因为我已经对.NET相关的目录进行了区分和重新修改,而没有注意到这一点(不知道我是如何错过的),所以我放弃了这种方法。

不管怎样..。长话短说,是一个损坏的System.ni.dll导致了我的问题,其中的一个或多个集群的内容被0x0所取代,而它恰好表现为我观察到的奇怪问题。

票数 1
EN

Stack Overflow用户

发布于 2012-08-23 22:22:04

这听起来像是一个时间问题,分析器通过稍微慢一点“修正”了这个问题。

许多分析器使用插装(这里有更多的信息),这会稍微减慢应用程序的速度。显然,它使一个线程的速度足够慢,使得另一个线程可以做一些更多的工作,从而防止崩溃。这样的错误通常不会直接出现在开发人员机器上,而是在具有更多内核或超线程的处理器上运行时立即出现。有时它们只发生在版本构建中(或者在调试版本中相反)。时间问题可能很难跟踪,因为相同的代码可能在不同的条件下给出不同的结果(在分析器或调试器中)。

根据您的描述,我将尝试对如何修复它做一个粗略的猜测:

尝试在启动新线程的源代码中找到。然后,在生成它们之后,在那里添加一个System.Threading.Thread.Sleep(500);行,以暂停主线程,并给新线程一些启动的时间。

如果没有源代码和一些崩溃的堆栈跟踪,这是相当多的猜测。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12095840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档