none
请教一个使用 vsinstr.exe 来获取代码覆盖率的问题,希望有经验的高人指点一二,谢谢。 RRS feed

  • 问题

  • 正在研究一个关于获取代码覆盖率的问题,卡在其中一个环节很久,不得其解。希望有经验的高人指点一二,谢谢。

    目标是直接执行的 .exe 文件(不是调试)。然后在执行完毕之后,获得其代码覆盖率信息。

    我写了一个极度简单的控制台程序:

      class Program
      {
        static void Main(string[] args)
        {
          Console.WriteLine("Code coverage test.");
          Console.ReadKey();
        }
      }
    
    

     

    用 debug 模式编译,生成 .exe 和 .pdb 文件。然后根据这一份文档:
    http://msdn.microsoft.com/en-us/library/ms182402.aspx

    调用 vsinstr.exe 做 instrument, 命令如下:
    vsinstr.exe /U [assembly.exe] /COVERAGE

    在自己的开发机器上尝试了一下,是没有问题的,能够生成 .coverage 文件。(环境为 windows 7 x64, visual studio 2008)


    然后我就去到模拟的应用环境中尝试。(Windows 2008 x64, .Net framework 3.5, 没有也不可以装 visual studio 2008)

    首先安装一下文档安装 Stand-Alone Profiler
    http://msdn.microsoft.com/en-us/library/bb385771.aspx

    然后调用同样的命令来做 instrument
    vsinstr.exe /U [assembly.exe] /COVERAGE

    提示 successfully instrumented, 生成了 .exe.orig, .instr.pdb 文件。 但是,双击 .exe 文件,直接执行的时候,遇到了一个 Stopped working 的错误,原因好像是抛出了一个 System.DllNotFoundException.....

    琢磨了好久。。。不得其解。。希望高手们能指点一二,谢谢。

    附错误的 event log: (codecoveragetest.exe 就是那个极度简单的程序)

    Fault bucket , type 0
    Event Name: CLR20r3
    Response: Not available
    Cab Id: 0

    Problem signature:
    P1: codecoveragetest.exe
    P2: 1.0.0.0
    P3: 4d96f858
    P4: CodeCoverageTest
    P5: 1.0.0.0
    P6: 4d96f858
    P7: 6
    P8: 7
    P9: System.DllNotFoundException
    P10:

    Attached files:

    These files may be available here:
    C:\Users\...............

    Analysis symbol:
    Rechecking for solution: 0
    Report Id: cb762544-5d12-11e0-a2ba-000c29f79158

     

    更详细的错误信息: (即 Attached file)

    Version=1
    EventType=CLR20r3
    EventTime=129465411587675734
    ReportType=2
    Consent=1
    ReportIdentifier=5a0bcd64-600e-11e0-8e75-000c29f79158
    WOW64=1
    Response.type=4
    Sig[0].Name=Problem Signature 01
    Sig[0].Value=codecoveragetest.exe
    Sig[1].Name=Problem Signature 02
    Sig[1].Value=1.0.0.0
    Sig[2].Name=Problem Signature 03
    Sig[2].Value=4d9bf962
    Sig[3].Name=Problem Signature 04
    Sig[3].Value=CodeCoverageTest
    Sig[4].Name=Problem Signature 05
    Sig[4].Value=1.0.0.0
    Sig[5].Name=Problem Signature 06
    Sig[5].Value=4d9bf962
    Sig[6].Name=Problem Signature 07
    Sig[6].Value=d
    Sig[7].Name=Problem Signature 08
    Sig[7].Value=7
    Sig[8].Name=Problem Signature 09
    Sig[8].Value=System.DllNotFoundException
    DynamicSig[1].Name=OS Version
    DynamicSig[1].Value=6.1.7600.2.0.0.274.10
    DynamicSig[2].Name=Locale ID
    DynamicSig[2].Value=1033
    UI[2]=C:\App\CodeCoverageTest.exe
    UI[3]=CodeCoverageTest has stopped working
    UI[4]=Windows can check online for a solution to the problem.
    UI[5]=Check online for a solution and close the program
    UI[6]=Check online for a solution later and close the program
    UI[7]=Close the program
    LoadedModule[0]=C:\App\CodeCoverageTest.exe
    LoadedModule[1]=C:\Windows\SysWOW64\ntdll.dll
    LoadedModule[2]=C:\Windows\SYSTEM32\MSCOREE.DLL
    LoadedModule[3]=C:\Windows\syswow64\KERNEL32.dll
    LoadedModule[4]=C:\Windows\syswow64\KERNELBASE.dll
    LoadedModule[5]=C:\Windows\syswow64\ADVAPI32.dll
    LoadedModule[6]=C:\Windows\syswow64\msvcrt.dll
    LoadedModule[7]=C:\Windows\SysWOW64\sechost.dll
    LoadedModule[8]=C:\Windows\syswow64\RPCRT4.dll
    LoadedModule[9]=C:\Windows\syswow64\SspiCli.dll
    LoadedModule[10]=C:\Windows\syswow64\CRYPTBASE.dll
    LoadedModule[11]=C:\Windows\syswow64\SHLWAPI.dll
    LoadedModule[12]=C:\Windows\syswow64\GDI32.dll
    LoadedModule[13]=C:\Windows\syswow64\USER32.dll
    LoadedModule[14]=C:\Windows\syswow64\LPK.dll
    LoadedModule[15]=C:\Windows\syswow64\USP10.dll
    LoadedModule[16]=C:\Windows\system32\IMM32.DLL
    LoadedModule[17]=C:\Windows\syswow64\MSCTF.dll
    LoadedModule[18]=C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
    LoadedModule[19]=C:\Windows\WinSxS\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4927_none_d08a205e442db5b5\MSVCR80.dll
    LoadedModule[20]=C:\Windows\syswow64\shell32.dll
    LoadedModule[21]=C:\Windows\syswow64\ole32.dll
    LoadedModule[22]=C:\Windows\system32\profapi.dll
    LoadedModule[23]=C:\Windows\assembly\NativeImages_v2.0.50727_32\mscorlib\8c1770d45c63cf5c462eeb945ef9aa5d\mscorlib.ni.dll
    LoadedModule[24]=C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorjit.dll
    LoadedModule[25]=C:\Windows\assembly\NativeImages_v2.0.50727_32\System\5ba3bf5367fc012300c6566f20cb7f54\System.ni.dll
    LoadedModule[26]=C:\Windows\assembly\NativeImages_v2.0.50727_32\System.Core\1762137638019a091020b3baf52f6de3\System.Core.ni.dll
    LoadedModule[27]=C:\Windows\system32\VERSION.dll
    LoadedModule[28]=C:\Windows\system32\apphelp.dll
    FriendlyEventName=Stopped working
    ConsentKey=CLR20r3
    AppName=CodeCoverageTest
    AppPath=C:\App\CodeCoverageTest.exe
    ReportDescription=Stopped working


    学习学习....
    • 已移动 Aspen VJ 2011年4月10日 6:23 (发件人:Visual C#)
    2011年4月6日 7:52

答案

  • 没有用过这个工具,不过我想可以按照下面的步骤来检查错误。

    首先,请确认你已经按照链接中的步骤正确的将vsintr.exemsdis150.dll的路径添加到系统路径。

    然后,通过将 _NT_SYMBOL_PATH 变量设置为 symsrv*symsrv.dll*c:\localcache*http://msdl.microsoft.com/download/symbols 来设置符号服务器。

    在使用系统环境变量设置了符号服务器后,请在新的命令提示处运行命令行探查器工具。 这将使新环境变量生效。 在命令提示符窗口中,键入以下命令: start %COMSPEC%

     

    使用 VSPerfReport 工具将您的符号序列化到分析数据 (.vsp) 文件中。 使用 VSPerfReport /summary:all /packsymbols 开关。 如果数据文件中未插入符号,请确保设置了 _NT_SYMBOL_PATH 环境变量。

     

    另外,我注意到一些LoadedModule.NetFramework v2.0的,所以在模拟环境中也安装下.Net Framework v2.0试下。

     

    以上仅供参考。


    Paul Zhou [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Paul Zhou 2011年4月14日 7:16
    2011年4月11日 8:05

全部回复

  • 我怎么看起来像是这个程序都没有成功加载 .NET CLR?因为如果加载了 CLR 之后如果抛出 DllNotFoundException,它会被 CLR 捕获,不会出现 Windows Error Reporting 对话框 (虽然可以配置让它出现 Windows Error Reporting。

    Visual Studio Instrumentor 需要修改 PE 文件来做一些采样的,您可以把那个生成的 .exe.orig 的 .orin 扩展名去掉,就变成 exe 了,这个是原始的未修改 exe,因为您只需要 Code Coverage 文件信息不需要修改 exe,所以直接运行这个就好了。


    Mark Zhou
    2011年4月6日 8:43
  • 我怎么看起来像是这个程序都没有成功加载 .NET CLR?因为如果加载了 CLR 之后如果抛出 DllNotFoundException,它会被 CLR 捕获,不会出现 Windows Error Reporting 对话框 (虽然可以配置让它出现 Windows Error Reporting。

    Visual Studio Instrumentor 需要修改 PE 文件来做一些采样的,您可以把那个生成的 .exe.orig 的 .orin 扩展名去掉,就变成 exe 了,这个是原始的未修改 exe,因为您只需要 Code Coverage 文件信息不需要修改 exe,所以直接运行这个就好了。


    Mark Zhou

     

    不是很明白, vsinstr 就是做 instrument 的。如果我不执行这个加工过的 .exe。转而执行未被加工过的 .exe。

    个人感觉不可能取到代码覆盖率的信息。。。不知道我的理解对不对?


    学习学习....
    2011年4月6日 9:33
  • 您好,

    根据您的问题,好像和C#语言没有多大关系。 所以我将这个帖子一道一般性讨论区论坛。 谢谢你的支持。


    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年4月10日 6:22
  • 没有用过这个工具,不过我想可以按照下面的步骤来检查错误。

    首先,请确认你已经按照链接中的步骤正确的将vsintr.exemsdis150.dll的路径添加到系统路径。

    然后,通过将 _NT_SYMBOL_PATH 变量设置为 symsrv*symsrv.dll*c:\localcache*http://msdl.microsoft.com/download/symbols 来设置符号服务器。

    在使用系统环境变量设置了符号服务器后,请在新的命令提示处运行命令行探查器工具。 这将使新环境变量生效。 在命令提示符窗口中,键入以下命令: start %COMSPEC%

     

    使用 VSPerfReport 工具将您的符号序列化到分析数据 (.vsp) 文件中。 使用 VSPerfReport /summary:all /packsymbols 开关。 如果数据文件中未插入符号,请确保设置了 _NT_SYMBOL_PATH 环境变量。

     

    另外,我注意到一些LoadedModule.NetFramework v2.0的,所以在模拟环境中也安装下.Net Framework v2.0试下。

     

    以上仅供参考。


    Paul Zhou [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Paul Zhou 2011年4月14日 7:16
    2011年4月11日 8:05