15

我正在尝试使用 Visual Studio 2012、.NET 4 来检测 ASP.NET Web 应用程序。该解决方案包含一个 Web 应用程序和一个类库。问题是我看不到进入类库的步骤,我收到一条消息说明:

Matching symbols could not be found. Choose the 'Symbol Settings...' link to add the symbol file location and then reload the report.

分析时的输出看起来不错:

Preparing web server for profiling.
Profiling started.
Instrumenting C:\Users\kipusoep\Documents\InfoCaster\svn\instances\PerformanceTest\\bin\PerformanceTest.dll in place
Info VSP3049: Small functions will be excluded from instrumentation.
Microsoft (R) VSInstr Post-Link Instrumentation 11.0.50727 x86
Copyright (C) Microsoft Corp. All rights reserved.
File to Process:
   C:\Users\kipusoep\Documents\InfoCaster\svn\instances\PerformanceTest\bin\PerformanceTest.dll --> C:\Users\kipusoep\Documents\InfoCaster\svn\instances\PerformanceTest\bin\PerformanceTest.dll
Original file backed up to C:\Users\kipusoep\Documents\InfoCaster\svn\instances\PerformanceTest\bin\PerformanceTest.dll.orig
Successfully instrumented file C:\Users\kipusoep\Documents\InfoCaster\svn\instances\PerformanceTest\bin\PerformanceTest.dll.
Warning VSP2013: Instrumenting this image requires it to run as a 32-bit process.  The CLR header flags have been updated to reflect this.
Instrumenting C:\Users\kipusoep\Documents\InfoCaster\svn\instances\PerformanceTest\SomeLibrary\obj\Debug\SomeLibrary.dll in place
Info VSP3049: Small functions will be excluded from instrumentation.
Microsoft (R) VSInstr Post-Link Instrumentation 11.0.50727 x86
Copyright (C) Microsoft Corp. All rights reserved.
File to Process:
   C:\Users\kipusoep\Documents\InfoCaster\svn\instances\PerformanceTest\SomeLibrary\obj\Debug\SomeLibrary.dll --> C:\Users\kipusoep\Documents\InfoCaster\svn\instances\PerformanceTest\SomeLibrary\obj\Debug\SomeLibrary.dll
Original file backed up to C:\Users\kipusoep\Documents\InfoCaster\svn\instances\PerformanceTest\SomeLibrary\obj\Debug\SomeLibrary.dll.orig
Successfully instrumented file C:\Users\kipusoep\Documents\InfoCaster\svn\instances\PerformanceTest\SomeLibrary\obj\Debug\SomeLibrary.dll.
Warning VSP2013: Instrumenting this image requires it to run as a 32-bit process.  The CLR header flags have been updated to reflect this.
Launching web server with profiling.
Launching profilable project.
Warning VSP2355: Some Windows counters will not be collected.  Without this data, some performance rules may not fire.
Profiling process ID 68 (iisexpress).
Process ID 68 has exited.
Data written to C:\Users\kipusoep\Documents\InfoCaster\svn\instances\PerformanceTest\PerformanceTest_130801(1).vsp.
Profiling finished.
Loaded symbols for C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\0329cb19\89f716fc\App_Web_0slsprtu.dll.
Loaded symbols for C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\0329cb19\89f716fc\assembly\dl3\62c5c0d2\9777513f_ae8ece01\PerformanceTest.dll.
Profiling complete.

我注意到输出最后没有说明关于名为“SomeLibrary”的类库的任何内容,其中显示“已加载符号”。

有谁知道为什么我不能检测类库?

这是 VS 解决方案:http ://www.fileswap.com/dl/C9HPd8uEC/

4

6 回答 6

15

据我从您的解决方案中可以看出,正在检测的 .dll 位于类库的“obj”文件夹中。

现在,这可能只是我应该闭嘴的时候说话(因为我对 Visual Studio 分析器知之甚少,而且我不知道为什么/如果有人想要检测“obj”二进制文件而不是“bin”) ,因此,我想我最好描述一下我的思路:

VS 正在“ASP.NET 临时文件”位置中寻找符号文件(特别是 .instr.pdb 文件),因为它是从那里加载类库 dll 的。但是它不会找到它,因为该文件是在类库项目的 obj\Debug 中创建的,并且没有复制到 Web 应用程序的“bin”文件夹中 - 所以它永远不会被复制到“ASP.NET 临时文件”中任何一个。

从性能资源管理器中删除目标并选择“添加项目目标”,检查这两个项目,我得到了你(和我)之前的确切信息:

  • Web 应用程序项目的 ...\bin\Debug 中的 PerformanceTest.dll
  • 类库项目 ...\obj\Debug 中的 SomeLibrary.dll

显然,这就是 VS 想要的样子,不管它是否有效。它在 obj\Debug 中检测类库,然后在启动分析器时忘记所有新生成的符号。

但是,如果我再次删除“SomeLibrary.dll”目标,请选择“添加目标二进制文件...”并在 Web 应用程序的 ...\bin\Debug... 中手动选择一个,然后开始分析:报告看起来差不多,但我可以浏览到“SomeLibrary”并在输出中得到这个:

Preparing web server for profiling.
Profiling started.
Instrumenting E:\...\PerformanceTest\\bin\PerformanceTest.dll in place
Info VSP3049: Small functions will be excluded from instrumentation.
Microsoft (R) VSInstr Post-Link Instrumentation 11.0.50727 x86
Copyright (C) Microsoft Corp. All rights reserved.
File to Process:
   E:\...\PerformanceTest\bin\PerformanceTest.dll -->
   E:\...\PerformanceTest\bin\PerformanceTest.dll
Original file backed up to E:\...\PerformanceTest\bin\PerformanceTest.dll.orig
Successfully instrumented file E:\...\PerformanceTest\bin\PerformanceTest.dll.
Warning VSP2013: Instrumenting this image requires it to run as a 
32-bit process. The CLR header flags have been updated to reflect this.
Instrumenting E:\...\PerformanceTest\bin\SomeLibrary.dll in place
Info VSP3049: Small functions will be excluded from instrumentation.
Microsoft (R) VSInstr Post-Link Instrumentation 11.0.50727 x86
Copyright (C) Microsoft Corp. All rights reserved.
File to Process:
   E:\...\PerformanceTest\bin\SomeLibrary.dll --> 
   E:\...\PerformanceTest\bin\SomeLibrary.dll
Original file backed up to E:\...\PerformanceTest\bin\SomeLibrary.dll.orig
Successfully instrumented file E:\...\PerformanceTest\bin\SomeLibrary.dll.
Warning VSP2013: Instrumenting this image requires it to run as a 
32-bit process. The CLR header flags have been updated to reflect this.
Launching web server with profiling.
Launching profilable project.
Profiling process ID 14652 (iisexpress).
Process ID 14652 has exited.
Data written to E:\...\PerformanceTest\PerformanceTest_130810(1).vsp.
Profiling finished.
Loaded symbols for 
   C:\...\App_Web_yzwcgfbx.dll.
Loaded symbols for 
   C:\...\assembly\dl3\928eb82e\75dbb6f1_5695ce01\PerformanceTest.dll.
Loaded symbols for 
   C:\...\assembly\dl3\6c0d460d\5208c7f1_5695ce01\SomeLibrary.dll.
Profiling complete.

这是修复它的正确方法吗?再说一次,我不知道。如果没有,可能有一种方法可以让分析器在类库的 obj 文件夹中找不到符号时在它期望的位置查找符号 - 或者将 .instr.pdb 文件复制到 bin 文件夹 pre -profiling 以便它包含在 ASP.NET 临时文件的卷影副本中。

于 2013-08-09T23:28:26.713 回答
4

我在 VS2014 中遇到了这个问题,它是为“任何 CPU”构建的,设置了“首选 32 位”,而引用的库没有“首选 32 位”(即 32 位 exe,64 位库) .

将 exe 更改为不“首选 32 位”解决了符号问题,我认为这是因为库被修改为匹配 exe 的位数(在检测期间)并且符号不再匹配。

于 2014-10-27T12:56:30.523 回答
3

这个解决方案对我有用:

http://www.brothersincode.com/post/Matching-symbols-could-not-be-found-Performance-Profiler.aspx

您也可以换一种方式尝试,这意味着按原样删除您的 dll 并尝试将其从 bin 中放入,这也可能是另一种方式。

于 2015-06-15T16:11:45.973 回答
1

我已经成功地分析了我的类库——但只能从控制台应用程序中进行。在 ASP.NET 应用程序性能分析会话期间,我无法分析类库。

一些什锦链接 - 唉,这并没有解决我的问题,但可能会给你一些线索:

于 2013-08-03T22:27:18.583 回答
0

目前接受的答案帮助我到达那里,但我会谦虚地向那些试图完成与我完全相同的事情的人提供一些更直接的指示,以防万一我可以节省几个艰难的谷歌搜索时间为某人。我尝试分析使用外部程序集的 WCF 服务未成功,这些程序集在运行时通过反射加载,并让此服务由我的自定义客户端触发。我有两个问题:我的 WCF 服务在分析会话期间根本没有启动(但在调试时它总是会启动),然后当它出于某种原因启动时 - Visual Studio 无法加载外部程序集的符号。因此,为了让这两项工作都能正常工作,我需要创建一个检测性能会话,并将目标设置为我的主 WCF 服务以及自定义外部程序集,并设置启动模式 - Internet Explorer(否则该服务将无法启动)。没有 exes 或从解决方案指向客户。然后我没有立即启动分析器,而是在“性能资源管理器”窗口中修改了它的属性,并将我的自定义客户端的二进制文件添加到“启动”选项卡中以第二次启动(在服务本身之后)。它还有助于在客户端中拥有正确的“服务引用”(我并没有真正使用它,我使用共享程序集并使用 ChannelFactory 生成通道)并首先以调试模式启动客户端(但实际上从未访问过服务)。也许那'

于 2015-07-28T11:27:01.627 回答
0

我正在使用 Visual Studio 2019 并在对 ASP.NET 网站进行分析时遇到了同样的问题。

受到上述JimmiTh 解决方案的极大启发,我将缺失项目的 [ProjectPath]/obj/Debug 路径添加到 VS Options->Debugging->Symbols。再次进行分析后,我可以轻松访问源代码并获得更准确的分析诊断。

于 2020-04-04T10:07:27.907 回答