2013-08-01 13 views
15

Ich versuche, eine ASP.NET-Webanwendung mit Visual Studio 2012, .NET 4 zu instrumentieren. Die Lösung enthält eine Webanwendung und eine Klassenbibliothek. Das Problem ist, ich nicht Schritt in die Klassenbibliothek sehen, erhalte ich eine Meldung, die besagt:Visual Studio Performance Profiling - Klassenbibliothek Symbole wurden nicht gefunden

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

Die Ausgabe während Profilierung zwar gut aussieht:

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. 

Ich stelle fest, die Ausgabe nicht Geben Sie am Ende der Klassenbibliothek "SomeLibrary" an, wo "Loaded Symbols for" steht.

Weiß jemand, warum ich die Klassenbibliothek nicht instrumentieren kann?

Hier ist die VS-Lösung: http://www.fileswap.com/dl/C9HPd8uEC/

+0

Haben Sie eine Lösung gefunden? Ich bleibe auch dabei. Es gibt ein paar andere ähnliche SO Fragen, aber keine Antworten [hier] (http://stackoverflow.com/questions/9609300/cant-collect-instrumentation-profiler-data-for-dll-in-visual-studio-2010) und [hier] (http://stackoverflow.com/questions/13240084/how-to-profile-only-a-class-library) – Ilan

+0

Uhm nein, ich habe dies nur vor 3 Tagen gepostet ...: -/ – kipusoep

Antwort

13

Soweit ich aus Ihrer Lösung geladen werden, um die DLL sagen kann, dass sein wird instrumentiert ist im Ordner "obj" der Klassenbibliothek.

Jetzt kann ich nur reden, wenn ich meinen Mund halten sollte (weil ich wenig Einblick in den Visual Studio Profiler habe, und ich habe keine Ahnung warum/wenn man "obj" Binärdateien anstatt instrumentieren möchte "bin"), und daher denke ich, dass ich meinen Gedankengang besser beschreiben sollte:

VS sucht nach den Symboldateien (speziell der .instr.pdb-Datei) im Speicherort "ASP.NET Temporary Files" , weil dort die DLL der Klassenbibliothek geladen wurde. Es wird jedoch nicht gefunden, da diese Datei in obj \ Debug im Klassenbibliotheksprojekt erstellt und nicht in den Ordner "bin" der Webanwendung kopiert wird. Daher wird der Schatten niemals nach "ASP.NET Temporary Files" kopiert. entweder.

die Ziele aus der Performance Explorer aus- und "Project Ziel" Auswahl, beiden Projekte überprüft, gibt mir genau das, was Sie (und ich) hatten vor:

  • PerformanceTest.dll in Web Application Projekt .. . \ bin \ Debug
  • SomeLibrary.dll in Klassenbibliothek Projekt ... \ obj \ Debug

So offensichtlich, das ist, wie VS es sein will, ob es funktioniert oder nicht. Es instrumentiert die Klassenbibliothek in obj \ Debug und vergisst dann beim Starten des Profilers alles über die neu erzeugten Symbole.

Aber wenn ich stattdessen die "SomeLibrary.dll "target again, wähle" Target binary hinzufügen ... "und wähle manuell das in der Webapplikation ... \ bin \ Debug ... und starte dann das Profiling: Der Report sieht ungefähr gleich aus, aber ich kann hineinschauen „SomeLibrary“ und ich dies in der Ausgabe:

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. 

Ist dies der richtige Weg, es zu beheben Auch hier habe ich keine Ahnung Wenn nicht, kann es eine Möglichkeit sein, den Profiler zu bekommen für Symbole suchen?. im obj-Ordner der Klassenbibliothek, wenn sie dort nicht gefunden wird, wo sie erwartet wird - oder eine Möglichkeit zum Kopieren der .instr.pdb-Datei in den bin-Ordner pre-profiling, sodass sie in die Schattenkopie in ASP.NET Temporary aufgenommen wird Dateien

+0

Danke JimmiTh. Ich weiß nicht, ob es der richtige Weg ist, es zu reparieren, aber es funktioniert und genau darum habe ich gebeten, danke! – kipusoep

1

ich erfolgreich geschafft haben, meine Klassenbibliothek zum Profil - aber nur innerhalb einer Konsolenanwendung. Ich konnte die Klassenbibliothek während einer ASP.NET-App-Profilerstellungssitzung nicht profilieren.

Einige sortierte Links - was leider nicht mein Problem lösen, aber Sie können einige Leitungen geben:

4

Ich hatte dieses Problem in VS2014 mit einer Exe, die für "Any CPU" gebaut wurde mit "Prefer 32 bit" gesetzt, während die referenzierten Bibliotheken kein "Prefer 32 bit" hatten (d. h. 32-Bit-Exe, 64-Bit-Bibliotheken).

Ändern der exe zu nicht "lieber 32 Bit" behoben das Problem mit Symbolen, ich denke es ist, weil die Bibliotheken geändert werden, um die Bissigkeit der EXE (während der Instrumentierung) und die Symbole nicht mehr übereinstimmen.

0

Die derzeit akzeptierte Antwort hat mir geholfen, dorthin zu gelangen, aber ich werde versuchen, denen, die genau das Gleiche erreichen wollen, etwas leichtere Anweisungen zu geben, nur für den Fall, dass ich ein paar retten würde von harten Stunden für jemanden googeln. Ich habe erfolglos versucht, einen WCF-Dienst zu profilieren, der externe Assemblys verwendet, die zur Laufzeit durch Reflektion geladen werden und diesen Dienst von meinem benutzerdefinierten Client auslösen lassen. Ich hatte zwei Probleme: Mein WCF-Dienst startete während der Profiling-Sitzung überhaupt nicht (während das Debugging das immer tat), und wenn es dann aus irgendeinem Grund geschah, konnte Visual Studio die Symbole für externe Assemblys nicht laden. Um beide Dinge zum Laufen zu bringen, musste ich eine Instrumentierungssitzung mit dem Ziel erstellen, das auf meinen WCF-Hauptdienst zusammen mit den benutzerdefinierten externen Assemblys gesetzt wurde, und den Startmodus festlegen - Internet Explorer (andernfalls würde der Dienst nicht starten). Keine Exes oder auf Client von Lösung zeigen. Dann habe ich den Profiler nicht sofort gestartet, sondern seine Eigenschaften im "Performance Explorer" -Fenster geändert und eine Binary meines benutzerdefinierten Clients dem "Launch" -Tab hinzugefügt, um ihn als 2. zu starten (direkt nach dem Dienst selbst). Es half auch, eine richtige "Service-Referenz" direkt im Client zu haben (ich benutze es nicht wirklich, ich benutze Shared Assembly und erzeuge Channels mit ChannelFactory) und starte den Client zuerst im Debug-Modus (aber ohne tatsächlich auf einen Service zuzugreifen). Vielleicht ist das nicht der richtige Weg, aber es macht den Trick und ich kann meinen Service nach zwei Tagen Googeln endlich profilieren - zu diesem Thema sind nicht viele Dokumente verfügbar, und die akzeptierte Antwort auf diese Stackoverflow-Frage ist die beste Ressource, die ich habe gefunden.

Verwandte Themen