Профилирование производительности Visual Studio - символы библиотеки классов не были найдены
Я пытаюсь использовать веб-приложение ASP.NET с Visual Studio 2012,.NET 4.
Решение содержит веб-приложение и библиотеку классов.
Проблема в том, что я не вижу шаг в библиотеке классов, получаю сообщение с сообщением:
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/
Ответы
Ответ 1
Насколько я могу судить по вашему решению, DLL, которая находится под инструментами, находится в папке "obj" библиотеки классов.
Теперь это может быть только я, когда я должен держать язык за зубами (потому что я мало разбираюсь в профилировщике Visual Studio, и я понятия не имею, почему/если бы кто-то хотел бы использовать двоичные файлы obj, а не "bin" ), и поэтому, я думаю, лучше описать мой ход мысли:
VS ищет файлы символов (особенно файл .instr.pdb) в разделе "Временные файлы ASP.NET", потому что там, где он загружал DLL библиотеки классов. Однако он не найдет его, потому что этот файл создается в obj\Debug в проекте библиотеки классов и не скопирован в папку "bin" веб-приложения, поэтому он никогда не получает тень, скопированную в "Временные файлы ASP.NET", либо.
Удаление целей из Проводника производительности и выбор "Добавить цель проекта", проверка обоих проектов, дает мне именно то, что вы (и я) имели раньше:
- PerformanceTest.dll в проекте веб-приложения...\bin\Debug
- SomeLibrary.dll в проекте библиотеки классов... \obj\Debug
По-видимому, так VS хочет, чтобы это было, работает ли оно или нет. Он использует библиотеку классов в obj\Debug, а затем забывает все о вновь созданных символах при запуске профилировщика.
Но, если вместо этого я снова удалю цель "SomeLibrary.dll", выберите "Добавить целевой двоичный файл..." и вручную выберите файл в веб-приложении...\bin\Отладка... И затем начните профилирование: отчет выглядит примерно так же, но я могу перейти в "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.
Ответ 2
У меня была эта проблема в VS2014 с exe, которая была построена для "Any CPU" с набором "Prefer 32 bit", в то время как у библиотек, на которые ссылались, не было "Prefer 32 bit" (то есть 32-разрядный exe, 64- битные библиотеки).
Изменение exe, чтобы не "предпочитать 32-битный", исправляло проблему с символами, я думаю, это потому, что библиотеки модифицированы, чтобы соответствовать битте exe (во время инструментария), и символы больше не совпадают.
Ответ 3
Это решение работало для меня:
http://www.brothersincode.com/post/Matching-symbols-could-not-be-found-Performance-Profiler.aspx
Вы также можете попробовать это наоборот, то есть удалить вашу DLL, как есть, и попытаться поместить ее из bin, которая может также быть наоборот.
Ответ 4
Мне удалось успешно профилировать мою библиотеку классов, но только из консольного приложения. Я не смог профилировать библиотеку классов во время сеанса профилирования производительности приложения ASP.NET.
Некоторые сортированные ссылки, которые, увы, не решили мою проблему, но могут дать вам несколько примеров:
- Запустите
Developer Command Prompt for VS2012
- Затем вы можете использовать это для
VSPerfReport <yourreport.vsp> /debugsympath
, чтобы выяснить, где SomeLibrary.dll должен быть загружен из
- Советы по устранению неполадок http://msdn.microsoft.com/en-us/library/bb385766.aspx
Ответ 5
Ответ, полученный в настоящий момент, помог мне добраться туда, но я попытаюсь смиренно дать немного более простые инструкции тем, кто пытается выполнить то же самое, что и я, на всякий случай, если бы я сэкономил пару жесткие часы для Google.
Я безуспешно пытался профилировать службу WCF, которая использует внешние сборки, которые загружаются отражением во время выполнения и запускают эту службу моим пользовательским клиентом. У меня было 2 проблемы: моя служба WCF просто не начиналась вообще во время сеанса профилирования (но при отладке она всегда это делала), а затем, когда это было сделано по какой-то причине, Visual Studio не загружала символы для внешних сборок.
Поэтому для того, чтобы обе работали, мне нужно было создать сеанс производительности инструментария с целью, установленным для моей главной службы WCF, а также настраиваемыми внешними сборками и установить режим запуска - Internet Explorer (иначе служба не запустилась). Отсутствует exes или указывает на клиента из решения. Затем я не запускал профайлер немедленно, но изменил его свойства в окне "Проводник производительности" и добавил двоичный файл моего пользовательского клиента на вкладку "Запуск", которая будет запущена 2-го (сразу после того, как служба будет работать). Это также помогло получить правильную "ссылку на службу" прямо в клиенте (я ее не использую, я использую совместную сборку и генерирую каналы с использованием ChannelFactory) и сначала запускаю клиент в режиме отладки (но без фактического доступа к службе). Возможно, это не правильный способ сделать это, но это делает трюк, и я, наконец, смогу профилировать мой сервис после 2 дней работы в Интернете - не так много документов по этой теме, и принятый ответ на этот вопрос stackoverflow - лучший ресурс я найдено.