Czy WinDBG może znaleźć plik mscordacwks.dll w magazynie symboli?
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łoAnalizują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:
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:
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) )?