Udostępnij za pomocą


Obsługiwane zmiany kodu (C++)

Funkcja Edytuj i kontynuuj dla projektów języka C++ obsługuje większość typów zmian kodu. Nie można jednak zastosować niektórych zmian podczas wykonywania programu. Aby zastosować te zmiany, należy zatrzymać wykonywanie i skompilować nową wersję kodu.

Aby uzyskać informacje na temat pracy z funkcją Edytowanie i kontynuowanie w języku C++ w aplikacji Visual Studio, zobacz Edytowanie i kontynuowanie (C++).

Requirements

Ustawienia kompilacji (właściwości projektu > )

  • C/C++ > Ogólny > format informacji debugowania: Program Database for Edit and Continue (/ZI)

  • Linker > Ogólne > Włącz przyrostowe łączenie: Tak (/INCREMENTAL)

    Wszelkie niezgodne ustawienia linkera (takie jak /SAFESEH, czy /OPT:...) mogą wywołać ostrzeżenie LNK4075 podczas budowania. Przykład: LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:ICF' specification

Ustawienia debugera (opcje debugowania > )

Otwórz okienko Debug (lub Narzędzia) >Opcje, i rozwiń sekcję Wszystkie ustawienia>Debugowanie>.NET/C++ Hot Reload.

Otwórz okno dialogowe Opcje (lub Narzędzia) > i rozwiń sekcję Debugowanie>.NET/C++ Hot Reload.

Wybierz jedną lub wszystkie następujące opcje, aby włączyć tę funkcję:

  • Włącz przeładowywanie na gorąco: umożliwia przeładowywanie na gorąco podczas uruchamiania z dołączonym debugerem (F5).

  • Włącz przeładowywanie na gorąco podczas uruchamiania bez debugowania: włącza funkcję Przeładowywania na gorąco podczas uruchamiania bez dołączonego debugera (Ctrl + F5).

  • Włącz przeładowywanie na gorąco podczas zapisywania pliku: włącza ponowne ładowanie na gorąco po zapisaniu pliku.

  • Szczegółowość rejestrowania: Ustaw poziom rejestrowania, gdy Hot Reload jest włączony. Wybierz opcję Minimalna (domyślna), Szczegółowa lub Diagnostyczna.

Zmiana tych ustawień ma wpływ na wszystkie projekty, nad którym pracujesz. Nie musisz ponownie kompilować aplikacji po zmianie ustawienia. Jeśli skompilujesz aplikację z poziomu wiersza polecenia lub pliku make, ale debugujesz w środowisku programu Visual Studio, nadal możesz użyć opcji Edytuj i kontynuuj, jeśli ustawisz /ZI opcję .

W oknie dialogowym Opcjedebugowania (lub >) rozwiń sekcję Debugowanie>ogólne i zaznacz pole wyboru Włącz edycję natywną i kontynuuj.

Wszystkie niezgodne ustawienia kompilatora lub konsolidatora powodują błąd podczas edycji i kontynuowania.
Przykład: Edit and Continue : error : ‘file.cpp’ in ‘MyApp.exe’ was not compiled with Edit and Continue enabled. Ensure that the file is compiled with the Program Database for Edit and Continue (/ZI) option.

Nieobsługiwane zmiany

Podczas sesji debugowania nie można zastosować następujących zmian języka C/C++. Jeśli wprowadzisz dowolną z tych zmian, a następnie spróbujesz zastosować zmiany kodu, w oknie Dane wyjściowe pojawi się komunikat o błędzie lub ostrzeżeniu.

  • Większość zmian w danych globalnych lub statycznych.

  • Zmiany w plikach wykonywalnych skopiowanych z innego komputera i nie są kompilowane lokalnie.

  • Zmiany typu danych, które mają wpływ na układ obiektu, na przykład składowe danych klasy.

  • Dodanie więcej niż 64 000 bajtów nowego kodu lub danych.

  • Dodawanie zmiennych, które wymagają konstruktora, w miejscu poprzedzającym wskaźnik instrukcji.

  • Zmiany wpływające na kod, który wymaga inicjowania w czasie wykonywania.

  • Dodawanie procedur obsługi wyjątków w niektórych przypadkach.

  • Zmiany w plikach zasobów.

  • Zmiany w kodzie w plikach tylko do odczytu.

  • Zmiany w kodzie bez odpowiedniego pliku PDB.

  • Zmiany w kodzie, który nie ma pliku obiektu.

  • Modyfikowanie wyrażeń lambda w następujących scenariuszach:

    • Gdy lambdy mają statyczny lub globalny człon.
    • Kiedy przekazujesz wyrażenia lambda do elementu std::function. Ta metoda powoduje prawdziwe naruszenie ODR i powoduje wystąpienie C1092.
  • Funkcja Edytuj i kontynuuj nie aktualizuje bibliotek statycznych. Jeśli wprowadzisz zmianę w bibliotece statycznej, wykonanie będzie kontynuowane przy użyciu starej wersji i nie zostanie wyświetlone żadne ostrzeżenie.

Nieobsługiwane scenariusze

Edytowanie i kontynuowanie dla języka C/C++ jest niedostępne w następujących scenariuszach debugowania:

  • Debugowanie aplikacji natywnych skompilowanych przy użyciu /Zo (Ulepszone zoptymalizowane debugowanie)

  • Projekty korzystające z zestawu narzędzi MSVC w wersji 120 i przełącznika C/C++ /bigobj . Obsługa funkcji Edytowanie i Kontynuowanie /bigobj występuje tylko w narzędziach do budowania Microsoft Visual C++ od wersji 140 wzwyż.

  • Debugowanie w trybie mieszanym (natywnym/zarządzanym).

  • Debugowanie w języku JavaScript.

  • Debugowanie SQL.

  • Debugowanie pliku zrzutu.

  • Edytowanie kodu po wystąpieniu nieobsługiwanego wyjątku, gdy opcja Rozwijanie stosu wywołań przy nieobsługiwanych wyjątkach nie jest wybrana.

  • Debugowanie aplikacji przy użyciu polecenia Dołącz do zamiast uruchamiania aplikacji, wybierając pozycję Start w menu Debugowanie .

  • Debugowanie zoptymalizowanego kodu.

  • Debugowanie starej wersji kodu po tym, jak nie można skompilować nowej wersji z powodu błędów kompilacji.

  • Używanie niestandardowej ścieżki kompilatora (cl.exe). Ze względów bezpieczeństwa w celu ponownego skompilowania pliku podczas edycji i kontynuowania program Visual Studio zawsze używa zainstalowanego kompilatora. Jeśli używasz niestandardowej ścieżki kompilatora (na przykład za pośrednictwem zmiennej niestandardowej $(ExecutablePath) w *.props pliku), zostanie wyświetlone ostrzeżenie i program Visual Studio powróci do używania zainstalowanego kompilatora tej samej wersji/architektury.

  • Starsze architektury/zestawy narzędzi MSVC. W zestawie narzędzi MSVC w wersji 140 domyślny debuger obsługuje funkcję Edytuj i kontynuuj zarówno w aplikacjach X86, jak i X64. Starsze zestawy narzędzi obsługują tylko aplikacje X86. Zestawy narzędzi starsze niż MSVC w wersji 120 powinny używać starszego debugera, sprawdzając pozycję "Debugowanie > Opcje > Ogólne > Użyj Trybu Zgodności Natywnej", aby korzystać z funkcji Edytuj i Kontynuuj.

Ograniczenia dotyczące łączenia

Opcje linkera, które wyłączają Edit and Continue

Następujące opcje linkera wyłączają funkcję Edytuj i Kontynuuj:

  • Ustawienie /OPT:REF, /OPT:ICF lub /INCREMENTAL:NO wyłącza opcję Edytuj i kontynuuj z następującym ostrzeżeniem:
    LINK : warning LNK4075: ignoring /EDITANDCONTINUE due to /OPT specification

  • Ustawienie /ORDER, /RELEASE lub /FORCE wyłącza opcję Edytuj i kontynuuj z następującym ostrzeżeniem:
    LINK : warning LNK4075: ignoring /INCREMENTAL due to /option specification

  • Ustawienie dowolnej opcji uniemożliwiającej utworzenie pliku bazy danych programu (.pdb) powoduje wyłączenie opcji Edytuj i Kontynuuj bez określonego ostrzeżenia.

Ograniczenia automatycznego ponownego łączenia

Domyślnie, funkcja Edit and Continue ponownie łączy Twój program na końcu sesji debugowania, aby utworzyć aktualny plik wykonywalny.

Edit and Continue nie może ponownie połączyć programu, jeśli debugujesz go z lokalizacji innej niż oryginalna lokalizacja kompilacji. Komunikat informuje o konieczności ręcznego ponownego kompilowania.

Funkcja Edytuj i kontynuuj nie kompiluje bibliotek statycznych. Jeśli wprowadzisz zmiany w bibliotece statycznej przy użyciu opcji Edytuj i kontynuuj, musisz ręcznie ponownie skompilować bibliotekę i ponownie połączyć aplikacje przy użyciu tej biblioteki.

Edytowanie i kontynuowanie nie wywołuje niestandardowych kroków kompilacji. Jeśli program korzysta z niestandardowych kroków kompilacji, warto ponownie skompilować ręcznie, aby można było wywołać niestandardowe kroki kompilacji. W takim przypadku możesz wyłączyć ponowne łączenie po edycji i kontynuuj, aby upewnić się, że zostanie wyświetlony monit o ręczne ponowne skompilowanie.

Aby wyłączyć ponowne łączenie po edycji i kontynuowaniu:

  1. W menu Debuguj wybierz pozycję Opcje i ustawienia.

  2. W oknie dialogowym Opcje w węźle Debugowanie wybierz węzeł Edytuj i kontynuuj .

  3. Wyczyść pole wyboru Połącz ponownie kod po debugowaniu .

Ograniczenia prekompilowanego nagłówka

Domyślnie funkcja Edytuj i kontynuuj ładuje i przetwarza wstępnie skompilowane nagłówki w tle, aby przyspieszyć przetwarzanie zmian kodu. Ładowanie wstępnie skompilowanych nagłówków wymaga alokacji pamięci fizycznej, co może być problemem w przypadku kompilowania na maszynie z ograniczoną ilością pamięci RAM. Możesz określić, czy może to być problem, korzystając z Menedżera zadań systemu Windows, aby określić ilość dostępnej pamięci fizycznej podczas debugowania. Jeśli ta ilość jest większa niż rozmiar prekompilowanych nagłówków, opcja Edytuj i kontynuuj nie powinna mieć problemu. Jeśli kwota jest mniejsza niż rozmiar wstępnie skompilowanych nagłówków, możesz uniemożliwić funkcji Edit and Continue ładowanie wstępnie skompilowanych nagłówków w tle.

Aby wyłączyć ładowanie w tle wstępnie skompilowanych nagłówków dla opcji Edytuj i Kontynuuj:

  1. W menu Debuguj wybierz pozycję Opcje i ustawienia.

  2. W oknie dialogowym Opcje w węźle Debugowanie wybierz węzeł Edytuj i kontynuuj .

  3. Wyczyść pole wyboru Zezwalaj na wstępne komkompilowanie .

Ograniczenia atrybutów IDL

Funkcja Edytuj i kontynuuj nie generuje ponownie plików języka definicji interfejsu (IDL). W związku z tym zmiany atrybutów IDL nie są odzwierciedlane podczas debugowania. Aby zobaczyć wynik zmian atrybutów IDL, należy zatrzymać debugowanie i ponownie skompilować aplikację. Opcja Edytuj i kontynuuj nie generuje błędu ani ostrzeżenia, jeśli atrybuty IDL uległy zmianie. Aby uzyskać więcej informacji, zobacz Atrybuty IDL.

Diagnozowanie problemów

Jeśli twój scenariusz nie pasuje do żadnego z warunków wymienionych powyżej, możesz zebrać dalsze szczegóły, ustawiając następującą wartość rejestru DWORD:

  1. Otwórz okno polecenia dla programistów.

  2. Uruchom następujące polecenie:

    VsRegEdit.exe set “C:\Program Files\Microsoft Visual Studio\[Version]\[YOUR EDITION]” HKCU Debugger NativeEncDiagnosticLoggingLevel DWORD 1

    VsRegEdit.exe set “C:\Program Files (x86)\Microsoft Visual Studio\[Version]\[YOUR EDITION]” HKCU Debugger NativeEncDiagnosticLoggingLevel DWORD 1

pl-PL: Ustawienie tej wartości na początku sesji debugowania powoduje, że różne składniki funkcji Edytuj i Kontynuuj wyświetlają szczegółowe logowanie w oknie danych wyjściowych w zakładce >.