Określanie plików symboli (.pdb) i źródłowych w debugerze programu Visual Studio (C#, C++, Visual Basic, F#)

Pliki bazy danych programu (.pdb), nazywane również plikami symboli, identyfikatorami mapy i instrukcjami w kodzie źródłowym projektu do odpowiednich identyfikatorów i instrukcji w skompilowanych aplikacjach. Te pliki mapowania łączą debuger z kodem źródłowym, co umożliwia debugowanie.

Podczas kompilowania projektu z poziomu środowiska IDE programu Visual Studio przy użyciu standardowej konfiguracji kompilacji debugowania kompilator tworzy odpowiednie pliki symboli. W tym artykule opisano sposób zarządzania plikami symboli w środowisku IDE, na przykład:

Aby uzyskać szczegółowe wyjaśnienie plików symboli, zobacz następujące elementy:

Jak działają pliki symboli

Plik .pdb przechowuje informacje debugowania i stanu projektu, które umożliwiają przyrostowe łączenie konfiguracji debugowania aplikacji. Debuger programu Visual Studio używa plików .pdb do określenia dwóch kluczowych informacji podczas debugowania:

  • Nazwa pliku źródłowego i numer wiersza do wyświetlenia w środowisku IDE programu Visual Studio.
  • Gdzie w aplikacji zatrzymać punkt przerwania.

Pliki symboli pokazują również lokalizację plików źródłowych i opcjonalnie serwer do ich pobrania.

Debuger ładuje tylko pliki .pdb, które dokładnie pasują do plików .pdb utworzonych podczas kompilowania aplikacji (czyli oryginalnych plików pdb lub kopii). Takie dokładne duplikowanie jest konieczne, ponieważ układ aplikacji może ulec zmianie, nawet jeśli sam kod nie uległ zmianie. Aby uzyskać więcej informacji, zobacz Dlaczego program Visual Studio wymaga plików symboli debugera, aby dokładnie dopasować pliki binarne, z którymi zostały skompilowane?

Napiwek

Aby debugować kod poza kodem źródłowym projektu, takim jak kod systemu Windows lub kod innej firmy, należy określić lokalizację plików .pdb kodu zewnętrznego (i opcjonalnie pliki źródłowe), które muszą dokładnie odpowiadać kompilacjom w aplikacji.

Gdzie debuger szuka symboli

Podczas debugowania projektu w środowisku IDE programu Visual Studio debuger automatycznie ładuje pliki symboli, które można znaleźć domyślnie.

Uwaga

Podczas debugowania kodu zarządzanego na urządzeniu zdalnym wszystkie pliki symboli muszą znajdować się na komputerze lokalnym lub w lokalizacji określonej w opcjach debugera.

Debuger wyszukuje pliki symboli w następujących lokalizacjach:

  1. Folder projektu.

  2. Lokalizacja określona wewnątrz biblioteki DLL lub pliku wykonywalnego (.exe).

    Domyślnie, jeśli na komputerze utworzono bibliotekę DLL lub plik exe, konsolidator umieszcza pełną ścieżkę i nazwę pliku .pdb skojarzonego pliku DLL lub .exe. Debuger sprawdza, czy plik symboli istnieje w tej lokalizacji.

  3. Ten sam folder co plik DLL lub .exe .

  4. Wszystkie lokalizacje określone w opcjach debugera dla plików symboli. Aby dodać i włączyć lokalizacje symboli, zobacz Konfigurowanie lokalizacji symboli i opcji ładowania.

    • Dowolny lokalny folder pamięci podręcznej symboli.

    • Określona sieć, Internet lub lokalne serwery symboli i lokalizacje, takie jak serwery symboli firmy Microsoft, jeśli wybrano. Program Visual Studio może pobrać pliki symboli debugowania z serwerów symboli, które implementują symsrv protokół. Visual Studio Team Foundation Server i Narzędzia debugowania dla systemu Windows to dwa narzędzia, które mogą używać serwerów symboli.

      Serwery symboli, których można użyć, obejmują:

      Publiczne serwery symboli firmy Microsoft: aby debugować awarię, która występuje podczas wywołania systemowej biblioteki DLL lub biblioteki innej firmy, często potrzebne są pliki .pdb systemu. Pliki .pdb systemu zawierają symbole bibliotek DLL systemu Windows, plików exe i sterowników urządzeń. Symbole dla systemów operacyjnych Windows, MDAC, IIS, ISA i .NET można uzyskać z publicznych serwerów symboli firmy Microsoft.

      Serwery symboli w sieci wewnętrznej lub na komputerze lokalnym: Zespół lub firma może tworzyć serwery symboli dla własnych produktów oraz jako pamięć podręczną symboli symboli ze źródeł zewnętrznych. Możesz mieć serwer symboli na własnym komputerze.

      Serwery symboli innych firm: zewnętrzni dostawcy aplikacji i bibliotek systemu Windows mogą zapewnić dostęp do serwera symboli w Internecie.

      Ostrzeżenie

      Jeśli używasz serwera symboli innych niż publiczne serwery symboli firmy Microsoft, upewnij się, że serwer symboli i jego ścieżka są wiarygodne. Ponieważ pliki symboli mogą zawierać dowolny kod wykonywalny, można je uwidocznić na zagrożenia bezpieczeństwa.

Konfigurowanie lokalizacji plików symboli i opcji ładowania

Debuger sprawdza domyślnie różne lokalizacje symboli. Zobacz Gdzie debuger szuka symboli.

Na stronie Narzędzia>Opcje>debugowania>symboli można wykonywać następujące czynności:

  • Określ i wybierz ścieżki wyszukiwania dla plików symboli.
  • Określ serwery symboli dla składników firmy Microsoft, Windows lub innych firm.
  • Określ moduły, dla których chcesz, aby debuger automatycznie ładował symbole.
  • Zmień te ustawienia podczas aktywnego debugowania. Zobacz Ładowanie symboli podczas debugowania.

Aby określić lokalizacje symboli i opcje ładowania:

  1. W programie Visual Studio otwórz pozycję Narzędzia>Opcje Debugowanie>symboli (lub Symbole opcji>debugowania).>>

  2. W obszarze Lokalizacje pliku symboli (pdb),

    • Aby użyć serwerów symboli firmy Microsoft lub serwera symboli NuGet.org, zaznacz pole wyboru.

    • Aby dodać nową lokalizację serwera symboli,

      1. + Wybierz symbol na pasku narzędzi.
      2. Wpisz adres URL (http), udział sieciowy lub ścieżkę lokalną serwera symboli lub lokalizację symboli w polu tekstowym. Uzupełnianie instrukcji pomaga w znalezieniu właściwego formatu.

      Tools - Options - Debugging - Symbols page

      Tools - Options - Debugging - Symbols page

      Uwaga

      Przeszukiwany jest tylko określony folder. Musisz dodać wpisy dla wszystkich podfolderów, które chcesz wyszukać.

    • Aby dodać nową lokalizację serwera symboli usługi Azure DevOps:

      1. Wybierz ikonę Tools/ Options/ Debugging/Symbols new server icon na pasku narzędzi.

      2. W oknie dialogowym Połączenie do serwera symboli usługi Azure DevOps wybierz jeden z dostępnych serwerów symboli i wybierz Połączenie.

        Aby uzyskać dodatkowe informacje, zobacz Dodawanie serwera symboli usługi Azure Artifacts.

    • Aby zmienić kolejność ładowania lokalizacji symboli, użyj klawiszy Ctrl w górę i Ctrl++w dół lub ikon strzałki w górę i w dół.

    • Aby edytować adres URL lub ścieżkę, kliknij dwukrotnie wpis lub wybierz go i naciśnij klawisz F2.

    • Aby usunąć wpis, zaznacz go, a następnie wybierz ikonę - .

  3. (Opcjonalnie) Aby zwiększyć wydajność ładowania symboli, w obszarze Symbole pamięci podręcznej w tym katalogu wpisz lokalną ścieżkę folderu, do którego serwery symboli mogą kopiować symbole.

    Uwaga

    Nie umieszczaj lokalnej pamięci podręcznej symboli w chronionym folderze, na przykład C:\Windows lub podfolder. Zamiast tego użyj folderu przeznaczonego do odczytu i zapisu.

    Uwaga

    W przypadku projektów języka C++ jeśli masz ustawiony zmienną _NT_SYMBOL_PATH środowiskową, zastąpi ona wartość ustawioną w obszarze Symbole pamięci podręcznej w tym katalogu.

  4. Określ moduły, które mają zostać załadowane z lokalizacji pliku symboli (.pdb) podczas uruchamiania.

    • Wybierz pozycję Załaduj wszystkie moduły, chyba że zostaną wykluczone (ustawienie domyślne), aby załadować wszystkie symbole dla wszystkich modułów w lokalizacji pliku symboli, z wyjątkiem modułów, które zostały specjalnie wykluczone. Aby wykluczyć niektóre moduły, wybierz pozycję Określ wykluczone moduły, wybierz ikonę+, wpisz nazwy modułów do wykluczenia i wybierz przycisk OK.

    • Aby załadować tylko moduły określone z lokalizacji plików symboli, wybierz pozycję Załaduj tylko określone moduły. Wybierz pozycję Określ dołączone moduły, wybierz ikonę+, wpisz nazwy modułów do uwzględnienia, a następnie wybierz przycisk OK. Pliki symboli dla innych modułów nie są ładowane.

  5. Wybierz przycisk OK.

Inne opcje symboli do debugowania

Dodatkowe opcje symboli można wybrać w obszarze Narzędzia>Opcje>debugowania Ogólne (lub Ogólne opcje>debugowania):>>

  • Ładowanie eksportów bibliotek dll (tylko natywne)

    Ładuje tabele eksportu bibliotek DLL dla języka C/C++. Aby uzyskać szczegółowe informacje, zobacz Tabele eksportu bibliotek DLL. Odczytywanie informacji o eksportowaniu bibliotek DLL wiąże się z pewnym obciążeniem, dlatego ładowanie tabel eksportu jest domyślnie wyłączone. Można również użyć dumpbin /exports w wierszu polecenia kompilacji języka C/C++.

  • Włącz debugowanie na poziomie adresu i Pokaż dezasemblacji, jeśli źródło jest niedostępne

    Zawsze pokazuje dezasemblacji, gdy nie można odnaleźć plików źródłowych lub symboli.

    Options / Debugging / General disassembly options

  • Włączanie obsługi serwera źródłowego

    Używa serwera źródłowego do debugowania aplikacji, gdy na komputerze lokalnym nie ma kodu źródłowego lub plik .pdb nie jest zgodny z kodem źródłowym. Serwer źródłowy pobiera żądania dotyczące plików i zwraca rzeczywiste pliki z kontroli źródła. Serwer źródłowy działa przy użyciu biblioteki DLL o nazwie srcsrv.dll, aby odczytać plik .pdb aplikacji. Plik .pdb zawiera wskaźniki do repozytorium kodu źródłowego, a także polecenia używane do pobierania kodu źródłowego z repozytorium.

    Można ograniczyć polecenia, które można wykonać z pliku .pdb aplikacji, wyświetlając listę dozwolonych poleceń w pliku o nazwie srcsrv.ini. Umieść plik srcsrv.ini w tym samym folderze co srcsrv.dll i devenv.exe.

    Ważne

    Dowolne polecenia można osadzać w pliku .pdb aplikacji, dlatego należy umieścić tylko polecenia, które chcesz wykonać w pliku srcsrv.ini. Każda próba wykonania polecenia innego niż w pliku srcsvr.ini spowoduje wyświetlenie okna dialogowego potwierdzenia. Aby uzyskać więcej informacji, zobacz Ostrzeżenie o zabezpieczeniach : Debuger musi wykonać niezaufane polecenie.

    Nie jest sprawdzana poprawność parametrów poleceń, więc należy być ostrożnym z poleceniami zaufanymi. Jeśli na przykład w pliku srcsrv.ini zostanie wyświetlony plik cmd.exe, złośliwy użytkownik może określić parametry w pliku cmd.exe, co spowoduje, że będzie to niebezpieczne.

    Wybierz ten element i żądane elementy podrzędne. Zezwalaj na serwer źródłowy dla zestawów częściowo zaufania (tylko zarządzane) i zawsze uruchamiaj niezaufane polecenia serwera źródłowego bez monitowania mogą zwiększyć ryzyko bezpieczeństwa.

    Enable source server options

Opcje symboli kompilatora

Podczas kompilowania projektu z poziomu środowiska IDE programu Visual Studio przy użyciu standardowej konfiguracji kompilacji debugowania kompilatory języka C++ i zarządzane tworzą odpowiednie pliki symboli dla kodu. Można również ustawić opcje kompilatora w kodzie.

Aby ustawić opcje kompilatora dla konfiguracji kompilacji w programie Visual Studio, zobacz Ustawianie konfiguracji debugowania i wydania.

Opcje platformy .NET

Skompiluj za pomocą polecenia /debug , aby utworzyć plik .pdb . Aplikacje można tworzyć za pomocą polecenia /debug:full lub /debug:pdbonly. Kompilowanie za pomocą polecenia /debug:full generuje kod debugowalny. Kompilowanie za pomocą polecenia /debug:pdbonly generuje pliki .pdb , ale nie generuje DebuggableAttribute polecenia kompilatora JIT, że informacje o debugowaniu są dostępne. Użyj /debug:pdbonly , jeśli chcesz wygenerować pliki .pdb dla kompilacji wydania, której nie chcesz debugować. Aby uzyskać więcej informacji, zobacz /debug (opcje kompilatora C#) lub /debug (Visual Basic).

Opcje języka C/C++

  • Pliki VC<x.pdb> i <project.pdb>

    Plik .pdb dla języka C/C++ jest tworzony podczas kompilacji za pomocą /ZI lub /Zi. W programie Visual C++ opcja /Fd nazywa plik .pdb tworzonym przez kompilator. Podczas tworzenia projektu w programie Visual Studio przy użyciu środowiska IDE opcja /Fd jest ustawiona na utworzenie pliku pdb o nazwie <project.pdb>.

    Jeśli skompilujesz aplikację C/C++ przy użyciu pliku make i określisz /ZI lub /Zi bez użycia /Fd do określenia nazwy pliku, kompilator tworzy dwa pliki .pdb :

    • VC<x.pdb>, gdzie <x> reprezentuje wersję kompilatora Microsoft C++, na przykład VC11.pdb

      Plik VC<x.pdb> przechowuje wszystkie informacje debugowania dla poszczególnych plików obiektów i znajduje się w tym samym katalogu co plik makefile projektu. Za każdym razem, gdy tworzy plik obiektu, kompilator języka C/C++ scala informacje debugowania z plikiem VC<x.pdb>. Więc nawet jeśli każdy plik źródłowy zawiera typowe pliki nagłówkowe, takie jak <windows.h>, definicje typów z tych nagłówków są przechowywane tylko raz, a nie w każdym pliku obiektu. Wstawione informacje zawierają informacje o typie, ale nie zawierają informacji o symbolach, takich jak definicje funkcji.

    • <project.pdb>

      Plik <project.pdb> przechowuje wszystkie informacje debugowania dla pliku exe projektu i znajduje się w podkatalogu \debug. Plik project.pdb> zawiera pełne informacje o debugowaniu, w tym prototypy funkcji, a nie tylko informacje o typie znalezione w pliku VC<x.pdb>.<

    Pliki VC<x.pdb> i <project.pdb> zezwalają na aktualizacje przyrostowe. Konsolidator osadza również ścieżkę do plików .pdb w utworzonym pliku exe lub dll .

  • Tabele eksportu bibliotek DLL

    Użyj dumpbin /exports polecenia , aby wyświetlić symbole dostępne w tabeli eksportu biblioteki DLL. Informacje symboliczne z tabel eksportu bibliotek DLL mogą być przydatne do pracy z komunikatami systemu Windows, procedurami systemu Windows (WindowProcs), obiektami COM, marshalingiem lub dowolną biblioteką DLL, dla której nie masz symboli. Symbole są dostępne dla dowolnej 32-bitowej systemowej biblioteki DLL. Wywołania są wymienione w kolejności wywołań, z bieżącą funkcją (najgłębiej zagnieżdżoną) na początku.

    Odczytując dumpbin /exports dane wyjściowe, można zobaczyć dokładne nazwy funkcji, w tym znaki inne niż alfanumeryczne. Wyświetlanie dokładnych nazw funkcji jest przydatne do ustawiania punktu przerwania w funkcji, ponieważ nazwy funkcji mogą być obcięte w innym miejscu w debugerze. Aby uzyskać więcej informacji, zobacz dumpbin /export.

Aplikacje sieci Web

Ustaw plik web.config aplikacji ASP.NET na tryb debugowania. Tryb debugowania powoduje, że ASP.NET generuje symbole dla dynamicznie generowanych plików i umożliwia debugerowi dołączenie do aplikacji ASP.NET. Program Visual Studio ustawia to automatycznie po rozpoczęciu debugowania, jeśli projekt został utworzony na podstawie szablonu projektów internetowych.

Ładowanie symboli podczas debugowania

Możesz użyć modułów, stosu wywołań, ustawień lokalnych, autos lub dowolnego okna czujki, aby załadować symbole lub zmienić opcje symboli podczas debugowania. Aby uzyskać więcej informacji, zobacz Get more familiar with how the debugger attaches to your app (Dowiedz się więcej o tym, jak debuger dołącza do aplikacji).

Praca z symbolami w oknie Moduły

Podczas debugowania w oknie Moduły są wyświetlane moduły kodu, które debuger traktuje jako kod użytkownika lub Mój kod oraz stan ładowania symboli. Możesz również monitorować stan ładowania symboli, ładować symbole i zmieniać opcje symboli w oknie Moduły .

Aby monitorować lub zmieniać lokalizacje symboli lub opcje podczas debugowania:

  1. Aby otworzyć okno Moduły, podczas debugowania wybierz pozycję Debuguj >moduły systemu Windows>(lub naciśnij klawisze Ctrl + Alt + U).
  2. W oknie Moduły kliknij prawym przyciskiem myszy nagłówki Stan symboli lub Plik symboli lub dowolny moduł.
  3. W menu kontekstowym wybierz jedną z następujących opcji:
Opcja Opis
Ładowanie symboli Pojawia się dla modułów z pominiętymi, nie odnalezionymi lub nie załadowanymi symbolami. Próbuje załadować symbole z lokalizacji określonych na stronie Opcje>Debugowanie>symboli. Jeśli plik symboli nie zostanie znaleziony lub nie zostanie załadowany, uruchomi Eksplorator plików, aby można było określić nową lokalizację do wyszukania.
Informacje o ładowaniu symboli Pokazuje lokalizację załadowanego pliku symboli lub lokalizacje, które zostały przeszukane, jeśli debuger nie może odnaleźć pliku.
Ustawienia symboli Otwiera stronę Opcje>Debugowanie>symboli, na której można edytować i dodawać lokalizacje symboli.
Zawsze ładuj automatycznie Dodaje wybrany plik symboli do listy plików, które są automatycznie ładowane przez debuger.

Użyj stron Bez załadowanych symboli/brak załadowanych źródeł

Istnieje kilka sposobów dzielenia debugera na kod, który nie ma dostępnych plików symboli ani źródłowych:

  • Przechodzenie do kodu.
  • Podziel się na kod z punktu przerwania lub wyjątku.
  • Przełącz się do innego wątku.
  • Zmień ramkę stosu, klikając dwukrotnie ramkę w oknie stosu wywołań .

W takim przypadku debuger wyświetla strony Brak załadowanych symboli lub Brak załadowanych źródeł, aby ułatwić znajdowanie i ładowanie niezbędnych symboli lub źródła.

No Symbols Loaded page

Aby użyć strony dokumentu Bez załadowanych symboli, aby ułatwić znajdowanie i ładowanie brakujących symboli:

  • Aby zmienić ścieżkę wyszukiwania, wybierz niezaznaną ścieżkę lub wybierz pozycję Nowa ścieżka lub Nowa ścieżka usługi VSTS i wprowadź lub wybierz nową ścieżkę. Wybierz pozycję Załaduj , aby ponownie wyszukać ścieżki i załadować plik symboli, jeśli zostanie znaleziony.
  • Aby zastąpić wszystkie opcje symboli i ponowić próbę ścieżki wyszukiwania, wybierz pozycję Przeglądaj i znajdź <nazwę> pliku wykonywalnego. Plik symboli jest ładowany, jeśli zostanie znaleziony, lub zostanie otwarty Eksplorator plików, aby można było ręcznie wybrać plik symboli.
  • Aby otworzyć stronę ustawień symboli w celu skonfigurowania zachowania, wybierz pozycję Zmień symbol Ustawienia (lub wybierz pozycję Opcje>Symbole debugowania).>
  • (Zaawansowane) Aby wyświetlić dezasemblacji w nowym oknie jednorazowo, wybierz pozycję Wyświetl dezasembler lub wybierz okno dialogowe Opcje, aby ustawić opcję zawsze pokazywania dezasemblacji, gdy nie znaleziono plików źródłowych lub symboli. Aby uzyskać więcej informacji, zobacz Wyświetlanie kodu dezasemblacji.
  • Aby wyświetlić przeszukane lokalizacje i wynik, rozwiń węzeł Informacje o ładowaniu symboli.
  • W przypadku kodu w języku C# można również dekompilować kod źródłowy ze stron Bez załadowanych symboli lub Bez załadowanych źródeł.

Jeśli debuger znajdzie plik .pdb po wykonaniu jednej z opcji i może pobrać plik źródłowy przy użyciu informacji w pliku .pdb, wyświetla źródło. W przeciwnym razie zostanie wyświetlona strona Bez załadowanego źródła, która opisuje problem, z linkami do akcji, które mogą rozwiązać problem.

Aby dodać ścieżki wyszukiwania plików źródłowych do rozwiązania:

Możesz określić lokalizacje, w których debuger wyszukuje pliki źródłowe, i wykluczyć określone pliki z wyszukiwania.

  1. Wybierz rozwiązanie w Eksplorator rozwiązań, a następnie wybierz ikonę Właściwości, naciśnij klawisze Alt+Enter lub kliknij prawym przyciskiem myszy i wybierz pozycję Właściwości.

  2. Wybierz pozycję Debuguj pliki źródłowe.

    Debug source files page

  3. W obszarze Katalogi zawierające kod źródłowy wpisz lub wybierz lokalizacje kodu źródłowego do wyszukania. Użyj ikony Nowy wiersz , aby dodać więcej lokalizacji, ikony strzałki w górę i w dół , aby zmienić ich kolejność lub ikonę X , aby je usunąć.

    Uwaga

    Debuger wyszukuje tylko określony katalog. Musisz dodać wpisy do wszystkich podkatalogów, które chcesz przeszukać.

  4. W obszarze Nie wyszukuj tych plików źródłowych wpisz nazwy plików źródłowych, które mają zostać wykluczone z wyszukiwania.

  5. Wybierz przycisk OK lub Zastosuj.