Nie można załadować SOS w WinDbg

132

Tło: Jestem nowy w WinDbg i próbuję uruchomić go po raz pierwszy. Chcę zbadać zrzut pamięci pobrany z działającej witryny ASP.NET 4 hostowanej w usługach IIS 7 w systemie Windows Server 2008 (x86) i pobranej na mój komputer lokalny.

Zainstalowałem narzędzia do debugowania i uruchomiłem WinDbg po raz pierwszy, otwierając zrzut awaryjny. Poszedłem do File | Ścieżka pliku symboli i ustaw ścieżkę do *srv*c:\symbols*http://msdl.microsoft.com/download/symbols*wszystkich symboli i czekaj na ich załadowanie.

Podczas próby załadowania SOS napotkałem problemy. Najpierw wypróbowałem następujące polecenie ...

.loadby sos mscorwks

... i otrzymałem odpowiedź Unable to find module 'mscorwks'.

Po przeszukaniu sieci próbowałem załadować mscorwks, wykonując następujące polecenie ...

sxe ld mscorwks.dll
g

... i otrzymałem odpowiedź „No runnable debuggees error in 'g'”

Skopiowałem SOS.dll (z C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319) do katalogu WinDbg, a następnie spróbowałem ...

.load sos

... i otrzymałem błąd ...

The call to LoadLibrary(sos) failed, Win32 error 0n193
    "%1 is not a valid Win32 application."
Please check your debugger configuration and/or network access.

Nie jestem pewien, jak mam postępować. Chcę tylko załadować SOS i przeszukać ten plik zrzutu. Każda pomoc byłaby bardzo mile widziana.

Fyi ... Próbuję otworzyć plik zrzutu w 64-bitowej wersji systemu Windows 7 z 64-bitową wersją Windbg.

Kevin Babcock
źródło

Odpowiedzi:

203

Nazwa biblioteki DLL środowiska wykonawczego CLR została zmieniona na clr.dll.NET 4. Aby załadować poprawną wersję SOS, musisz dostosować swoje .loadbypolecenie. To znaczy

.loadby sos clr

Ponadto, jeśli korzystasz z 64-bitowej wersji, powinieneś również zainstalować 32-bitową wersję narzędzi debugowania dla systemu Windows , aby debugować aplikacje 32-bitowe. Instalują się obok siebie, więc nie ma problemu z posiadaniem zarówno wersji 32-bitowej, jak i 64-bitowej na tym samym komputerze.

Odradzałbym kopiowanie SOS.dll. SOS musi pasować do dokładnej wersji frameworka, więc jeśli ładujesz go z katalogu frameworka za pomocą .loadby, wszystko jest gotowe.

Brian Rasmussen
źródło
Trudno mi jest uzyskać oba w moim systemie, ponieważ najnowsze instalatory automatycznie wykrywają typ procesora. Czy jest jakaś flaga nadpisania, którą znasz dla msi? Zamierzam zainstalować starą 32-bitową wersję WinDbg, ale nie wiem, czego się spodziewać.
Dave,
5
@Dave: Może za mało za późno, ale na stronie instalacyjnej znajdującej się tutaj: msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx możesz wybrać instalację pakietów redystrybucyjnych, które umieszczają tutaj pliki MSI dla każdej wersji architektury : C: \ Program Files \ Microsoft SDKs \ Windows \ v7.1 \ Redist \ Debugging Tools for Windows
Aaron Lerch,
Jeśli powiem .loadby sos clr, dostaję Unable to find module 'clr'. Próbuję debugować .NET 4 z x64 WinDbg
Csaba Toth
2
@CsabaToth czy to zrzut, czy robisz debugowanie na żywo? Jeśli wykonujesz debugowanie na żywo, środowisko CLR mogło nie zostać jeszcze załadowane. Możesz sxe ld clrzatrzymać, gdy CLR zostanie załadowany, a następnie załadować SOS w tym momencie.
Brian Rasmussen
@BrianRasmussen To skompilowany plik wykonywalny. Jeśli spojrzę na okno modułów, clr zostało załadowane.
Csaba Toth
18

Polecenie WinDbg „g” oznacza [Kontynuuj]

Ponieważ otwierasz plik zrzutu, nie ma możliwości „kontynuowania”, zawiera on tylko pamięć procesu.

Tak więc komunikat „No runnable debuggees error in 'g'” jest logiczny w twoim przypadku, ponieważ proces nie jest uruchomiony .

W celu załadowania poprawnej wersji SOS użyj następującego polecenia w zależności od wersji .NET.

.NET 4 i nowsze .loadby SOS

.NET 3.5 i 2 .loadby sos mscorwks

.NET 1.0 i 1.1 .load clr10 \ sos

HerbalMart
źródło
1

Powyższe odpowiedzi wymagają poprawy, ponieważ z biegiem czasu łatwiej było radzić sobie z ładowaniem sosów.

JOHN ROBBINS ma dookoła fajny artykuł . Zobacz, że serwery symboli Microsoft są skonfigurowane w ścieżce do pliku symboli i uruchom! Analys -v po znaku zachęty windbg, to załatwi sprawę, pobierze odpowiednie pliki sos. Aby sprawdzić, uruchom .chain po monicie, zobaczysz załadowany plik dll.

Kiran Prabhu
źródło
Artykuł Johna Robbinsa został przeniesiony na wintellect.com/…
Ryan Hill - MSFT
0

Właśnie natknąłem się na podobny problem podczas ładowania SOS i otrzymywał komunikat „nie można znaleźć określonego modułu”. Pojawił się z innym rozwiązaniem, więc jeśli rozwiązania tutaj nie pomogą, wypróbuj to:

.loadby sos clr - nie można znaleźć określonego modułu

Denis
źródło