FxCop Phoenix分析引擎出错

Tra*_*yek 5 code-analysis fxcop static-code-analysis

所以我试图运行一系列在RuleSet中定义的规则.RuleSet文件实际上是使用Sonarqube生成的 - 我已经选择了绝对的所有规则,包括FxCop,ReSharper和StyleCop规则.我正在开这样的FxCop:

C:/FxCop/FxCopCmd.exe /file:C:\TestProject\bin\TestProject.dll /ruleset:=C:\TestProject\testproject.ruleset /out:C:\TestProject\fxcop-report.xml /outxsl:none /forceoutput /searchgac /aspnet
Run Code Online (Sandbox Code Playgroud)

它正确启动,但我收到以下消息:

初始化Introspection引擎...
分析...
初始化Phoenix引擎......
分析...
分析完成.
*1总分析引擎异常.

XML输出包含以下内容:

<Exception Keyword="CA0001" Kind="Engine">
    <Type>Phx.FatalError</Type>
    <ExceptionMessage>Exception of type 'Phx.FatalError' was thrown.</ExceptionMessage>
    <StackTrace>   at Phx.FatalError.Dispatch()
        at Phx.Logging.Diagnostics.DiagnosticMessage.LogMessage(Severity severity, DiagnosticInfo diagnosticInfo, SourceContext sourceContext, String descriptionString)
        at Phx.PE.PEUtilities.UserError(String infoMessage)
        at Phx.Pdb.ReaderImplementation.Open(Boolean loadTypeOnly)
        at Phx.PEModuleUnit.LoadPdb()
        at Phx.PE.ReaderPhase.CheckSymbolicInformation()
        at Phx.PEModuleUnit.LoadGlobalSymbols()
        at Phx.PEModuleUnit.LoadEncodedIRUnitList()
        at Phx.PEModuleUnit.GetEnumerableContributionUnit(ContributionUnitEnumerationKind contributionUnitEnumerationKind)
        at Phx.PEModuleUnit.GetEnumerableContributionUnit()
        at Microsoft.FxCop.Engines.Phoenix.PreScanPass.GetFunctionUnits(PEModuleUnit peModuleUnit)
        at Microsoft.FxCop.Engines.Phoenix.PreScanPass.Execute(ModuleUnit moduleUnit)
        at Phx.Passes.Pass.DoPass(ModuleUnit moduleUnit)
        at Phx.Passes.PassList.DoPassList(ModuleUnit moduleUnit)
        at Microsoft.FxCop.Engines.Phoenix.PhoenixAnalysisEngine.Host.ExecutePasses(PEModuleUnit peModuleUnit)
        at Microsoft.FxCop.Engines.Phoenix.PhoenixAnalysisEngine.AnalyzeInternal()
        at Microsoft.FxCop.Engines.Phoenix.PhoenixAnalysisEngine.Analyze()
        at Microsoft.FxCop.Common.EngineManager.Analyze(Project project, Boolean verboseOutput)
   </StackTrace>
  </Exception>
Run Code Online (Sandbox Code Playgroud)

如果我在没有/aspnet标志的情况下运行相同的命令,我仍会得到相同的错误,但我也会在XML输出文件中获得实际的消息.

我最终的目标是从Sonarqube运行它(使用TeamCity中的Sonarqube运行器),但我也遇到了完全相同的问题.从Teamcity开始这个过程我得到以下内容:

18:19:46][Step 4/4] INFO: ------------------------------------------------------------------------
[18:19:46][Step 4/4] INFO: EXECUTION FAILURE
[18:19:46][Step 4/4] INFO: ------------------------------------------------------------------------
[18:19:46][Step 4/4] Total time: 24.122s
[18:19:46][Step 4/4] ERROR: Error during Sonar runner execution
[18:19:46][Step 4/4] org.sonar.runner.impl.RunnerException: Unable to execute Sonar
[18:19:46][Step 4/4]    at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:91)
[18:19:46][Step 4/4]    at org.sonar.runner.impl.BatchLauncher$1.run(BatchLauncher.java:75)
[18:19:46][Step 4/4]    at java.security.AccessController.doPrivileged(Native Method)
[18:19:46][Step 4/4]    at org.sonar.runner.impl.BatchLauncher.doExecute(BatchLauncher.java:69)
[18:19:46][Step 4/4]    at org.sonar.runner.impl.BatchLauncher.execute(BatchLauncher.java:50)
[18:19:46][Step 4/4]    at org.sonar.runner.api.EmbeddedRunner.doExecute(EmbeddedRunner.java:102)
[18:19:46][Step 4/4]    at org.sonar.runner.api.Runner.execute(Runner.java:90)
[18:19:46][Step 4/4]    at org.sonar.runner.Main.executeTask(Main.java:70)
[18:19:46][Step 4/4]    at org.sonar.runner.Main.execute(Main.java:59)
[18:19:46][Step 4/4]    at org.sonar.runner.Main.main(Main.java:41)
[18:19:46][Step 4/4] Caused by: java.lang.IllegalStateException: The execution of "C:/FxCop/FxCopCmd.exe" failed and returned 1 as exit code. See http://msdn.microsoft.com/en-us/library/bb429400(v=vs.80).aspx for details.
[18:19:46][Step 4/4]    at com.google.common.base.Preconditions.checkState(Preconditions.java:145)
[18:19:46][Step 4/4]    at org.sonar.plugins.fxcop.FxCopExecutor.execute(FxCopExecutor.java:63)
[18:19:46][Step 4/4]    at org.sonar.plugins.fxcop.FxCopSensor.analyse(FxCopSensor.java:102)
[18:19:46][Step 4/4]    at org.sonar.plugins.fxcop.FxCopSensor.analyse(FxCopSensor.java:87)
[18:19:46][Step 4/4]    at org.sonar.batch.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:59)
[18:19:46][Step 4/4]    at org.sonar.batch.phases.SensorsExecutor.execute(SensorsExecutor.java:51)
[18:19:46][Step 4/4]    at org.sonar.batch.phases.DatabaseModePhaseExecutor.execute(DatabaseModePhaseExecutor.java:120)
[18:19:46][Step 4/4]    at org.sonar.batch.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:264)
[18:19:46][Step 4/4]    at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
[18:19:46][Step 4/4]    at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
[18:19:46][Step 4/4]    at org.sonar.batch.scan.ProjectScanContainer.scan(ProjectScanContainer.java:235)
[18:19:46][Step 4/4]    at org.sonar.batch.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:230)
[18:19:46][Step 4/4]    at org.sonar.batch.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:228)
[18:19:46][Step 4/4]    at org.sonar.batch.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:220)
[18:19:46][Step 4/4] Final Memory: 20M/428M
[18:19:46][Step 4/4] INFO: ------------------------------------------------------------------------
[18:19:46][Step 4/4]    at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
[18:19:46][Step 4/4]    at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
[18:19:46][Step 4/4]    at org.sonar.batch.scan.ScanTask.scan(ScanTask.java:57)
[18:19:46][Step 4/4]    at org.sonar.batch.scan.ScanTask.execute(ScanTask.java:45)
[18:19:46][Step 4/4]    at org.sonar.batch.bootstrap.TaskContainer.doAfterStart(TaskContainer.java:135)
[18:19:46][Step 4/4]    at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:92)
[18:19:46][Step 4/4]    at org.sonar.api.platform.ComponentContainer.execute(ComponentContainer.java:77)
[18:19:46][Step 4/4]    at org.sonar.batch.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:158)
[18:19:46][Step 4/4]    at org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:95)
[18:19:46][Step 4/4]    at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:67)
[18:19:46][Step 4/4]    at org.sonar.runner.batch.IsolatedLauncher.execute(IsolatedLauncher.java:45)
[18:19:46][Step 4/4]    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[18:19:46][Step 4/4]    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[18:19:46][Step 4/4]    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[18:19:46][Step 4/4]    at java.lang.reflect.Method.invoke(Method.java:497)
[18:19:46][Step 4/4]    at org.sonar.runner.impl.BatchLauncher$1.delegateExecution(BatchLauncher.java:87)
[18:19:46][Step 4/4]    ... 9 more
[18:19:46][Step 4/4] Process exited with code 1
[18:19:46][Step 4/4] Step SonarQube (SonarQube Runner) failed
Run Code Online (Sandbox Code Playgroud)

这是使用FxCop v12安装在没有Visual Studio的盒子上,如果有任何重要的话......

编辑
问题绝对是凤凰分析部分 - 在禁用此处描述的DFA规则后,它成功.

Chr*_*n.K 11

在互联网上搜索"Phx.FatalError"错误,我找到了这篇博文,其中作者基本上说做了一个

regsrv32.exe msdia100.dll
Run Code Online (Sandbox Code Playgroud)

(在他的情况下显然是VS2010),为他解决了问题.

这导致我必要的暗示可能是我的机器上出错的原因.

我使用Visual Studio独立分析器设置[1]在我的DEV盒子上搞砸了.我安装了分析工具,这会导致%ProgramFiles(x86)%\Microsoft Visual Studio 12.0\Team Tools\Performance Tools(来自原始VS安装)的内容被替换,这在我当时并不知道.但是,所述设置还会创建(或替换)该%ProgramFiles(x86)%\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\msdia120.dll文件.该文件是COM服务器,在安装过程中(Visual Studio或Standalone Profiler软件包)注册,我也不知道.

当然,卸载所述Standalone Profiler软件包,卸载上述目录中的文件,并取消注册msdia1xx.dll.

因此,在我的情况下,最简单的解决方法是在Standalone Profiler软件包中重新安装(在我的情况下为x64),一切都恢复正常.

您可能只是(重新)注册您的msdia1xx.dll版本[可能需要以管理员身份运行]:

对于Visual Studio 2010:

regsvr32 "%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\Packages\Debugger\msdia100.dll"
Run Code Online (Sandbox Code Playgroud)

对于Visual Studio 2012:

regsvr32 "%ProgramFiles(x86)%\Microsoft Visual Studio 11.0\Common7\Packages\Debugger\msdia110.dll"
Run Code Online (Sandbox Code Playgroud)

对于Visual Studio 2013:

regsvr32 "%ProgramFiles(x86)%\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\msdia120.dll"
Run Code Online (Sandbox Code Playgroud)

对于Visual Studio 2015:

regsvr32 "%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\Common7\Packages\Debugger\msdia140.dll"
Run Code Online (Sandbox Code Playgroud)

[1]位于<drive>:\Standalone ProfilerVS安装目录下的VS安装介质中%ProgramFiles(x86)%\Microsoft Visual Studio <version>\Team Tools\Performance Tools\Setup.

  • 我今天在安装最新版本的 VS2019 (v16.8) 后遇到了这个问题,解决方案似乎可以解决该问题(使用与上面所示的 VS2015 类似的路径)。 (6认同)
  • 我遇到了同样的问题,一旦我执行以下命令 regsvr32 "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Professional\Common7\Packages\Debugger\msdia140.dll" 就修复了 (4认同)
  • 注册组件对我有帮助。请记住在管理员命令提示符下运行它。 (2认同)

小智 9

此处发布的答案很好地解释了问题和解决方案。这是为问题如何出现添加上下文,以防将来的读者Phx.FatalError像我一样遇到异常:

就我而言,我仍然使用 VS 2017 Professional,但一直在使用社区版探索 VS 2019。我从使用 VS 2017 创建的客户端存储库克隆了一个相当大的 WPF 解决方案。该解决方案在 VS 2017 中构建良好,使用默认的调试和发布配置。相同的解决方案使用 Release 配置在 VS 2019 中构建良好,但在Phx.FatalError尝试使用默认 Debug 配置重建时抛出异常。按照我在此处找到的指导,以下命令(以管理员身份运行)解决了该问题:

regsvr32 "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\Common7\Packages\Debugger\msdia140.dll
Run Code Online (Sandbox Code Playgroud)

感谢 OP 对问题的详细描述以及提供详尽答案的人。