Czy WinDBG może znaleźć plik mscordacwks.dll w magazynie symboli?

Pytanie

Istnieje wiele ręcznych sposobów, aby WinDBG znalazł mscordacwks.dll bez magazynu symboli (umieszczając plik gdzieś w ścieżce, umieszczając go w tym samym folderze co windbg.exe, umieszczając go w moim folderze Framework, określając ścieżkę w WinDBG używa.cordll -lp c:\dacFolder, itp.), ale wszystko to tylko naprawićmnie. Muszę to naprawić bardziej ogólniekażdy, kto używa mojego sklepu z symbolami.

Możliwe rozwiązania, jakie mogę sobie wyobrazić to:

WinDBG należy wykonać, aby sprawdzić magazyn symboli, używając nazwy podfolderu mscordacwks.dll zamiast nazwy folderu mscorwks.dll.SymStore.exe można dodać, aby dodać mscordacwks.dll pod nazwą podfolderu mscorwks.dll, dzięki czemu WinDBG znajdzie go, gdy tam zajrzy.

P:Czy jedna z tych rzeczy jest możliwa, czy też jest inny sposób, w jaki nie myślę o rozwiązaniu problemu?

Tło

Analizując proces .NET, natrafiłem na (najwyraźniej powszechny) problem, że psscor2 (i sosex) nie mógł znaleźć odpowiedniego mscordacwks.dll na moim komputerze. Błąd w WinDBG to:

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.

Jest wiele pytań na ten temat i wiele dobrych odpowiedzi, z których praktycznie wszystkie odnoszą się do znakomitego wpisu na blogu Douga Stewarta,Co to jest mscordacwks.dll?.

Dzięki temu moja sytuacja została wyjaśniona przez uzyskanie poprawnego pliku mscordacwks.dll i umieszczenie go tutaj:

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

gdzie wiedziałem, że WinDBG będzie wyglądał, ponieważ wcześniej próbowałem!sym noisy.

Więc jestem teraz ustawiony, ale musiałem umieścić go w tej ścieżce fizycznie, zamiast dodawać go do mojego serwera symboli przez normalnesymstore.exe mechanizm. Ponieważ mój sklep z symbolami jest używany przez więcej niż tylko mnie, muszę zrobić to we właściwy sposób dla wszystkich innych użytkowników sklepu.

I to jest problem. Kiedy dodaję za pomocąsymstore.exe zamiast wchodzić na powyższą ścieżkę, przechodzi w:

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

Jedyną różnicą jest to, że nazwa podfolderu to4E1545CB1bd000 tutaj zamiast4E1545829a3000 WinDBG szuka.

Powodem tego jest to, że podczas dodawania pliku binarnego do magazynu symboli,symstore.exe używa PE pliku binarnego, aby uzyskać znacznik czasu obrazu i rozmiar obrazu. W przypadku tego konkretnego .dll,dumpbin.exe /headers mscordacwks.dll ujawnia, że ​​są to:

znacznik czasu obrazu:0x4E1545CB (Czw lip 07 01:36:11 2011)rozmiar obrazu:0x1BD000

Stąd nazwa podfolderu4E1545CB1BD000.

Tym, czego szuka WinDBG, jest podfolder oparty na znaczniku czasu obrazu i rozmiarze obrazumscorwks.dll, niemscordacwks.dll, ponieważ ten pierwszy jest ładowany do procesu, a nie do drugiego. WinDBG nie może znać znacznika czasu i rozmiaru modułu DAC, ponieważ ten moduł nie znajduje się w zrzucie procesu.

Jako dalsza weryfikacja tego wyjaśnienia,dumpbin.exe /headers mscorwks.dll ujawnia:

znacznik czasu obrazu:0x4E154582 (Czw lip 07 01:34:58 2011)rozmiar obrazu:0x9A3000

które możesz zobaczyć dodaj do podfolderu4E1545829A3000.

Wiedząc o tym, teraz ma o wiele więcej sensu, dlaczego wszystkie te wiele wersji mscordacwks.dll, na które ludzie wpadają, wydaje się brakować w serwerach symboli Microsoftu. Jestem pewien, że tam są, po prostu WinDBG i psscor2 nie mogą ich znaleźć, ponieważ wybierają niewłaściwą nazwę podfolderu. Dlaczego nawet przeszkadza w przeszukiwaniu symboli, ścieżka jest poza mną, ponieważ gwarantuje, że nigdy jej nie znajdziesz!

To moje wyzwanie. Czy mogę jakoś wymusićsymstore.exe dodać mscordacwks.dll przy użyciu informacji PE mscorwks.dll? Jeśli nie, czy brakuje mi czegoś o WinDBG i psscor2, czy istnieje sposób, aby znali poprawny znacznik czasu i rozmiar pliku mscordacwks.dll, nawet jeśli nie jest on załadowany (i sposób, w jaki mogą faktycznie używać tych zamiast mscorwks.dll) )?

questionAnswers(2)

yourAnswerToTheQuestion