W jaki sposób włączyć opcję „Enable .NET Framework source stepping”?

118

Aktualizacja z 22 lutego 2013 r . : Wpis Microsoft Connect zawiera informację od Aloka Shrirama (Menedżera programów, Biblioteki klas podstawowych, .NET Framework), że problem powinien zostać rozwiązany. Wpis Connect jest oznaczony jako rozwiązany (naprawiony) :

Ten problem powinien teraz zostać rozwiązany. Opublikowaliśmy aktualizację źródeł referencyjnych. Daj nam znać, jeśli problem nadal nie zostanie rozwiązany.

Rok i pół.

Linki bonusowe

Oryginalne pytanie

Jak włączyć stepping źródła .NET Framework w programie Visual Studio 2010?


Uwaga : to pytanie jest częścią większej całości:


Visual Studio 2010 zawiera nową funkcję:

  • Narzędzia, opcje, debugowanie, ogólne, włączanie kroku źródłowego .NET Framework

Zrzut ekranu menu opcji

Postępuj zgodnie z instrukcjami na stronie MSDN How to: Debug .NET Framework Source :

Aby włączyć debugowanie źródła .NET Framework

  1. W menu Narzędzia kliknij Opcje .

  2. W oknie dialogowym Opcje kliknij kategorię Debugowanie .

  3. W polu Ogólne zaznacz następujące pola wyboru:

    • Włącz stepping źródła .NET Framework
    • Włącz obsługę serwera źródłowego

Robię to:

Zrzut ekranu menu opcji, z zaznaczeniem odpowiednich wybranych opcji

Uwaga : Zauważysz, jak zauważa strona MSDN i jak zauważyłem, że zaznaczenie opcji Enable .NET Framework source stepping spowoduje automatyczne odznaczenie ** Enable Just My Code (only Managed only). Włączyłem również komunikaty diagnostyczne obsługi serwera źródłowego.

Włączenie tych opcji powoduje automatyczne ustawienie lokalizacji pobierania pamięci podręcznej symboli:

Zrzut ekranu menu opcji, pokazujący katalog pamięci podręcznej (podświetlony)

Uwaga : Wpis Microsoft Symbol Server jest już obecny (i nie można go usunąć).


Strona MSDN mówi, aby załadować symbole:

Aby załadować symbole struktury za pomocą okna modułów

  1. W oknie Moduły kliknij prawym przyciskiem myszy moduł, którego symbole nie są załadowane. Możesz stwierdzić, czy symbole są załadowane, czy nie, patrząc na kolumnę Status symboli .

  2. Wskaż polecenie Załaduj symbole z i kliknij opcję Serwery symboli firmy Microsoft, aby pobrać symbole z publicznego serwera symboli firmy Microsoft lub Ścieżkę symboli, aby załadować je z katalogu, w którym wcześniej były przechowywane symbole.

Próbuję tego:

wprowadź opis obrazu tutaj

a następnie ładowane są wszystkie symbole:

Zrzut ekranu okna modułów, jak opisano powyżej

Siedziałem na punkcie przerwania, który ma wywołać kod platformy .NET:

Zrzut ekranu kodu, przepisany poniżej

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);

Wypchnięcie F11powoduje, że debugger po prostu przeskakuje do następnej linii:

Zrzut ekranu kodu, przepisany poniżej

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);

    //Record the running scale factor used
    this.scaleFactor = new SizeF(
            this.scaleFactor.Width * factor.Width,
            this.scaleFactor.Height * factor.Height);

Jak włączyć stepping źródła .NET Framework w programie Visual Studio 2010?


Siedzę w punkcie przerwania w moim kodzie. Próbuję dwukrotnie kliknąć funkcję znajdującą się dalej na stosie wywołań. Mam nadzieję, że pozwoliłoby mi to przejść do kodu .NET:

wprowadź opis obrazu tutaj

Tyle że to nie działa: Visual Studio mówi mi, że nie ma dostępnego źródła:

Zrzut ekranu z komunikatem o błędzie informującym o braku dostępnego źródła

Jak włączyć stepping źródła .NET Framework w programie Visual Studio 2010?


Jeśli przełączę się do widoku dezasemblacji przed próbą przejścia do kodu .NET ( Debug -> Windows -> Disassembly ), widzę callw kodzie .NET:

Zrzut ekranu kodu

A kiedy to zrobię, kończę debugowanie dezasemblacji System.Windows.Forms.ScaleControl:

Zrzut ekranu okna demontażu

Co nie jest tym samym, ani tak przydatne, jak wejście do źródła .NET Framework.

Jak włączyć stepping źródła .NET Framework w programie Visual Studio 2010?


Skonfigurowana ścieżka pamięci podręcznej symboli na moim komputerze zawiera pliki pamięci podręcznej symboli:

Zrzut ekranu z listą folderów

Więc pobiera pdbpliki symboli, ale odmawia ich użycia.

Jak włączyć stepping źródła .NET Framework w programie Visual Studio 2010?


Leppie zasugerował, żebym sprawdził Debugdziennik (przy otwartym oknie dziennika debugowania; w przeciwnym razie nic nie rejestruje):

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

Wcześniej w logu widzę jak ładuje się symbole dla System.Windows.Forms.dll:

Loaded 'C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll', Symbols loaded.

wprowadź opis obrazu tutaj

Więc to jest znalezienie swoje symbole, ale twierdzi, że nie może ich znaleźć.

Jak włączyć stepping źródła .NET Framework w programie Visual Studio 2010?


Facet z Microsoft Italy sugeruje wyłączenie Wymagaj plików źródłowych, aby dokładnie pasowały do ​​wersji oryginalnej :

Zrzut ekranu okna opcji

To nie rozwiązało problemu.

Jak włączyć stepping źródła .NET Framework w programie Visual Studio 2010?


Sugerowano, że jest błąd w źródłowym serwerze Microsoft dla .NET Framework 4.0 . Kierując się tą sugestią, zmieniłem projekt na docelowy .NET Framework 3.5 :

wprowadź opis obrazu tutaj

To nie rozwiązało problemu.

Jak włączyć stepping źródła .NET Framework w programie Visual Studio 2010?


Ktoś gdzieś bezczynnie się zastanawiał, czy inna osoba mająca ten sam problem używa 64-bitowej wersji debuggera . Teraz nie ma czegoś takiego jak 64-bitowa wersja Visual Studio, ale próbowałem zmienić mój projekt z AnyCPU na x86 (był JITed na x64), na wypadek, gdyby Microsoft nie obsługiwał procesorów 64-bitowych:

wprowadź opis obrazu tutaj

To nie rozwiązało problemu:

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

Jak włączyć stepping źródła .NET Framework w programie Visual Studio 2010?


Zobacz też

Ian Boyd
źródło
Czy sprawdziłeś „pamięć podręczną” kodu źródłowego?
leppie
@leppie Co rozumiesz przez „pamięć podręczną kodu źródłowego”? Jeśli masz na myśli folder przechowujący kod źródłowy, jest on zapełniany (patrz Aktualizacja 4 )
Ian Boyd,
Tak. Czy można otworzyć ten plik źródłowy i ustawić punkt przerwania?
leppie
1
świetny opis problemu!
andersonbd1
1
Nie działa również w VS2012. Działało przez jeden dzień, po skonfigurowaniu wszystkiego i po prostu przestało działać. Dwa dni, dziesiątki kaw, setki stron internetowych później to po prostu nie działa. W tym samym czasie źródła publikowane przez symbolsource.org działają jak marzenie.
Wiktor Zychla

Odpowiedzi:

35

Pliki PDB dotyczące przechodzenia przez kod źródłowy są publikowane tylko dla wersji RTM i dodatków Service Pack. W związku z tym, gdy pojawi się aktualizacja zabezpieczeń i zmodyfikuje dll, którą próbujesz debugować, spowoduje to, że przechodzenie do źródła nie będzie działać (to znaczy, pojawi się komunikat „Brak dostępnego źródła” z wyszarzonym „Przeglądaj, aby znaleźć źródło” ”).

Jednak po dokonaniu wszystkich odpowiednich ustawień można zastosować następujące obejście. Sposób obejścia polega zasadniczo na znalezieniu aktualizacji zabezpieczeń, które spowodowały zmianę biblioteki DLL, a następnie ich usunięciu. Ma to oczywistą wadę polegającą na usunięciu tych aktualizacji zabezpieczeń z komputera.

Obejście problemu

  1. Określ, do której biblioteki DLL chcesz debugować (np. System.Windows.Forms.dll)
  2. Podczas debugowania otwórz okno modułów w programie Visual Studio i znajdź kolumnę Wersja . Jeśli wersja nie jest wersją RTM lub Service Pack, musisz wykonać przepływ pracy. Zwykle plik DLL RTM powie „zbudowany przez: RTMRel”. Podczas gdy plik dll, który był częścią aktualizacji zabezpieczeń, powie „zbudowany przez: RTMGDR”. Zanotuj numer wersji (na przykład 4.0.30319.269 zbudowany przez: RTMGDR)
  3. Teraz chcemy znaleźć aktualizację, która utworzyła tę wersję. Zrób to, wyszukując dll i numer wersji pod adresem support.microsoft.com/kb/ Na przykład wykonałem następujące wyszukiwanie w Google: site:support.microsoft.com/kb System.Windows.Forms.dll 4.0.30319.269
  4. Wyszukiwanie powinno ujawnić informacje o aktualizacji. Zanotuj numer KB na pasku adresu. W moim przykładzie adres był http://support.microsoft.com/kb/2604121, więc KB2604121 jest tym, co nas interesuje.
  5. Przejdź do Panelu sterowania-> Programy i funkcje i kliknij „Wyświetl zainstalowane aktualizacje”
  6. Znajdź aktualizację, która zawiera numer KB (możesz skorzystać z wyszukiwania w prawym górnym polu).
  7. Odinstaluj tę aktualizację.
  8. Powtarzaj ten proces dla tej samej biblioteki dll, aż dll powróci do wersji RTMRel lub wersji SP. Na przykład w przypadku System.Windows.Forms.dll musiałem usunąć KB2686827, KB2604121, KB2518870, zanim wróciłem do wersji RTMRel.

Musisz to zrobić dla każdej biblioteki DLL w ramach platformy .NET, w której chcesz debugować.

Gdy to zrobisz, ustaw punkt przerwania w źródle .net (na przykład przejdź do zakładki Breakpoints, powiedz New-> Break at Function i wprowadź System.Windows.Forms.Form.Form) lub wejdź do jednego z .net metody w tym dll.

Matt Smith
źródło
1
Racja, sztuczka polega na zlokalizowaniu odpowiednich do odinstalowania (ponieważ zwykle masz zainstalowanych wiele z nich, a odinstalowanie zajmuje trochę czasu).
Matt Smith
Nie mogę odinstalować aktualizacji zabezpieczeń. Jest to sprzeczne z polityką firmy. Czy istnieje sposób na uzyskanie kopii pliku mscorlib.dll (i innych) pasujących do serwera Microsoft Symbols? Mój plik mscorlib.dll to wersja 4.0.30319.269 (RTMGDR.030319-2600). Możliwe, że mógłbym tymczasowo zaktualizować GAC za pomocą tej nowej biblioteki DLL i wypróbować stepping źródła.
kevinarpe
Prawdopodobnie jest to również sprzeczne z polityką mojej firmy - po prostu ponownie instaluję je po zakończeniu. Nie sądzę, aby można było po prostu zainstalować starą wersję mscorlib.dll niezależnie od innych bibliotek dll, które powinny zostać przywrócone wraz z nią (aby działało poprawnie). Ponadto tymczasowa aktualizacja GAC ​​przy użyciu starych bibliotek DLL byłaby zasadniczo równoważna z tymczasowym odinstalowaniem aktualizacji zabezpieczeń.
Matt Smith
Prawdopodobnym powodem, dla którego firma Microsoft nie publikuje źródła aktualizacji zabezpieczeń, jest to, że ktoś mógłby porównać zmiany kodu, zrozumieć, na czym polegała luka w zabezpieczeniach, i stworzyć własne exploity. Microsoft nie zdaje sobie sprawy, że „kod źródłowy” jest już dostępny przy użyciu ILSpy lub Relfector. Więc Microsoft, nie udostępniając kodu źródłowego, w rzeczywistości nie czyni nikogo bezpieczniejszym - po prostu życie programistów jest trudniejsze.
Ian Boyd
2
@IanBoyd Wątpię, czy to motywacja MS. Zakładam, że ich przepływ pracy po prostu nie obsługuje aktualizacji źródłowych plików PDB do debugowania. Zajmują się głównie zamykaniem luk w zabezpieczeniach.
xanadont
6

Chociaż niestety jest problem z Microsoftem, jak zauważył Leppie (i mam ten sam wynik, patrz

należy zauważyć, że twoja próba i tak zakończy się niepowodzeniem, ponieważ wspomniałeś:

  • Microsoft Symbol Server

zamiast:

  • referencesource.microsoft.com/symbols

Zobacz sekcję Często zadawane pytania / Rozwiązywanie problemów w sekcji Konfigurowanie programu Visual Studio do debugowania kodu źródłowego .NET Framework

yoel halb
źródło
4

Myślę, że znalazłem odpowiedź.

Prześledziłem, co się dzieje na Fiddlerze. Wygląda na to, że obecnie dostępne są tylko symbole i nie ma ich źródła.

Gdy VS próbuje załadować symbole z serwera „źródła odniesienia”, kończy się to niepowodzeniem (404). Ponieważ to się nie powiedzie, myślę, że nie może mapować plików źródłowych na tym serwerze.

http://referencesource.microsoft.com/symbols/mscorlib.pdb/ED96A7F38A2940F39B9CA7AD9BC5CB671/mscorlib.pdb

Po powyższym niepowodzeniu próbuje użyć serwera o nazwie „msdl”, na którym znajduje właściwy plik PDB (ale wygląda na to, że ten serwer nie ma informacji o kodzie źródłowym).

http://msdl.microsoft.com/download/symbols/mscorlib.pdb/ED96A7F38A2940F39B9CA7AD9BC5CB671/mscorlib.pd_

Podsumowując, wydaje się, że jest to (tymczasowy) problem firmy Microsoft z ich serwerami.

Jestem pewien, że jakiś czas temu miałem kod źródłowy. Ale teraz to nie działa.

Edytować:

Wypróbowałem to z różnymi wersjami .NET, wszystkie te same wyniki. :(

leppie
źródło
1
Dobrze, że byłoby bardzo interesujące, jeśli moje dokładne kroki powinny działać (ale nie), będzie działać (w przyszłości) i zrobić pracę (ale nie dzisiaj). Byłoby to również niezwykle frustrujące, ponieważ spędziłem 11 godzin nad tym problemem.
Ian Boyd
2
msdl.microsoft.com wydaje się być serwerem symboli firmy Microsoft
yoel połowa
2
i znowu jest zepsuty
Simon_Weaver,
Nie wydaje się, aby był to „tymczasowy problem z serwerem” po 7 latach, a łącza nadal są martwe.
jrh
1

W moim przypadku debugowałem starą aplikację .NET 2.0 WinForms i otrzymałem komunikat „Źródło niedostępne” . Wypróbowałem wszystkie zalecane ustawienia.

Ostatecznie przebudowałem aplikację, aby tymczasowo była przeznaczona dla platformy .NET 4.5 i udało mi się sprawić, aby źródło zaczęło działać. Być może moja aplikacja była po prostu za stara, aby przejść do źródła. Wiem, że to nie spełnia celu, ale w przypadku szybkich i brudnych testów to działa. Błąd, który mam, jest nadal obecny w .NET 4.5 . :)

Platforma docelowa

Brian Chavez
źródło
0

Możesz znaleźć źródło odniesienia tutaj, dostępne do pobrania:

Źródło odniesienia .NET Framework 4.0

Można tam również znaleźć źródła dla WCF, WF, a nawet wersji 4.5 Beta / RC i wielu innych:

Microsoft Referencesource NetFramework

Mare Infinitus
źródło
3
Kod źródłowy jest bezużyteczny bez symboli. Chyba że lubisz szukać konkretnego fragmentu kodu; p
leppie
0

Oto oficjalne instrukcje https://referencesource.microsoft.com/setup.html

Skonfiguruj program Visual Studio 2013 do debugowania platformy .NET Framework

Aby skonfigurować Visual Studio 2013, wykonaj następujące czynności w menu Narzędzia -> Opcje -> Debugowanie -> Ogólne:

  • Wyłącz tylko mój kod
  • Wyłącz przechodzenie po właściwościach i operatorach
  • Wyłącz wymagaj, aby pliki źródłowe dokładnie odpowiadały oryginalnej wersji
  • Włącz stepping źródła .NET Framework
  • Włącz obsługę serwera źródłowego
Colonel Panic
źródło