Kann WinDBG veranlasst werden, mscordacwks.dll im Symbolspeicher zu finden?

Die Frage

Es gibt viele manuelle Möglichkeiten, WinDBG zu veranlassen, mscordacwks.dll ohne einen Symbolspeicher zu finden (die Datei irgendwo im Pfad ablegen, im selben Ordner wie windbg.exe ablegen, im Ordner Framework \ v ablegen und den Pfad angeben) WinDBG mit.cordll -lp c:\dacFolder, etc.), aber sie alle beheben es nur fürmir. Ich muss es allgemeiner für behebenJeder, der meinen Symbolspeicher benutzt.

Die möglichen Lösungen, die ich mir vorstellen kann, sind:

WinDBG überprüft den Symbolspeicher mithilfe des Unterordnernamens von mscordacwks.dll anstelle des Ordnernamens von mscorwks.dll.SymStore.exe muss so erstellt werden, dass mscordacwks.dll unter dem Unterordnernamen von mscorwks.dll hinzugefügt wird, damit WinDBG es findet, wenn es dort angezeigt wird.

Q:Ist eines dieser Dinge möglich oder gibt es einen anderen Weg, an den ich nicht denke, um das Problem zu lösen?

Der Hintergrund

Bei der Analyse eines .NET-Prozesses stieß ich auf das (anscheinend häufige) Problem, dass psscor2 (und sosex) die entsprechende mscordacwks.dll nicht auf meinem Computer finden konnten. Der Fehler in WinDBG ist:

Failed to load data access DLL, 0x80004005 
Verify that 1) you have a recent build of the debugger (6.2.14 or newer) 
            2) the file mscordacwks.dll that matches your version of mscorwks.dll is 
                in the version directory 
            3) or, if you are debugging a dump file, verify that the file 
                mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path. 
            4) you are debugging on the same architecture as the dump file. 
                For example, an IA64 dump file must be debugged on an IA64 
                machine.

You can also run the debugger command .cordll to control the debugger's 
load of mscordacwks.dll.  .cordll -ve -u -l will do a verbose reload. 
If that succeeds, the SOS command should work on retry.

If you are debugging a minidump, you need to make sure that your executable 
path is pointing to mscorwks.dll as well.

Es gibt viele SO-Fragen und viele gute Antworten, die letztendlich auf Doug Stewarts hervorragenden Blog-Post verweisen.Was ist eine mscordacwks.dll-Datei?.

Dank dessen konnte ich meine Situation verbessern, indem ich die richtige mscordacwks.dll beschaffte und sie hier platzierte:

"C:\Symbols\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll\4E1545829a3000\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll"

wo ich wusste, dass WinDBG aussehen würde, weil ich es vorher mit versucht hatte!sym noisy.

Jetzt bin ich also fertig, aber ich musste es physisch in diesen Pfad einfügen, anstatt es über den normalen Weg meinem Symbolserver hinzuzufügensymstore.exe Mechanismus. Da mein Symbolspeicher nicht nur von mir verwendet wird, muss ich ihn für alle anderen Benutzer des Speichers richtig ausführen.

Und das ist das Problem. Wenn ich mit hinzufügesymstore.exe anstatt in den obigen Pfad zu gehen, geht es in:

"C:\Symbols\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll\4E1545CB1bd000\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll"

Der einzige Unterschied ist, dass der Name des Unterordners ist4E1545CB1bd000 hier statt der4E1545829a3000 das WinDBG sucht.

Der Grund dafür ist, dass beim Hinzufügen einer Binärdatei zum Symbolspeichersymstore.exe Verwendet den PE der Binärdatei, um den Bildzeitstempel und die Bildgröße zu erhalten. Im Fall dieser bestimmten DLL,dumpbin.exe /headers mscordacwks.dll offenbart diese zu sein:

Bildzeitstempel:0x4E1545CB (Do 07. Juli 01:36:11 2011)Bildgröße:0x1BD000

Daher der Name des Unterordners4E1545CB1BD000.

Was WinDBG sucht, ist andererseits ein Unterordner, der auf dem Bildzeitstempel und der Bildgröße von basiertmscorwks.dllnichtmscordacwks.dll, weil der erstere in den Prozess geladen wird, nicht der letztere. WinDBG kann den Zeitstempel und die Größe des DAC-Moduls nicht kennen, da sich dieses Modul nicht im Prozess-Dump befindet.

Als weitere Bestätigung dieser Erklärungdumpbin.exe /headers mscorwks.dll enthüllt:

Bildzeitstempel:0x4E154582 (Do 07. Juli 01:34:58 2011)Bildgröße:0x9A3000

was Sie sehen können, addieren sich zu Unterordnernamen4E1545829A3000.

Wenn man das weiß, ist es jetzt viel sinnvoller, warum all diese vielen Versionen der mscordacwks.dll, auf die die Leute immer wieder stoßen, auf den Symbolservern von Microsoft zu fehlen scheinen. Ich bin mir sicher, dass sie dort sind. Nur WinDBG und psscor2 können sie nicht finden, weil sie den falschen Unterordnernamen auswählen. Warum es sogar stört, den Pfad der Symbole zu durchsuchen, ist mir ein Rätsel, da es garantiert nie gefunden wird!

Das ist also meine Herausforderung. Kann ich irgendwie zwingensymstore.exe füge ich mscordacwks.dll mithilfe der PE-Informationen von mscorwks.dll hinzu? Wenn nicht, vermisse ich etwas über WinDBG und psscor2, könnte es eine Möglichkeit geben, den korrekten Zeitstempel und die korrekte Größe von mscordacwks.dll zu ermitteln, obwohl diese nicht geladen sind (und eine Möglichkeit, diese anstelle von mscorwks.dll zu verwenden )?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage