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 językiem Edytuj i kontynuuj dla języka C++ w programie Visual Studio, zobacz Edytowanie i kontynuowanie (C++ ).

Wymagania

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

  1. Ogólny format informacji debugowania języka C/C++>: Program Database for Edit and Continue (/ZI)>

  2. Konsolidator > ogólny > włączanie łączenia przyrostowego: Tak (/INCREMENTAL)

    Wszelkie niezgodne ustawienia konsolidatora (takie jak /SAFESEH, lub /OPT:...) powinny powodować ostrzeżenie LNK4075 podczas kompilacji.
    Przykład: LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:ICF' specification

Ustawienia debugera (Ogólne opcje > debugowania>):

  • 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 punkcie przed wskaźnikiem 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, które:
    • Mieć statyczny lub globalny element członkowski.
    • Są przekazywane do funkcji std::. Powoduje to prawdziwe naruszenie ODR i prowadzi do C1092.
  • Edytowanie i kontynuowanie nie powoduje zaktualizowania 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 VC 120 i przełącznika C/C++ /bigobj . Opcja Edytuj i kontynuuj /bigobj jest obsługiwana tylko w zestawie narzędzi VC 140.

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

  • Debugowanie w języku JavaScript.

  • Debugowanie SQL.

  • Debugowanie pliku zrzutu.

  • Edytowanie kodu po nieobsługiwanym wyjątku, gdy opcja Cowiń stos wywołań w nieobsługiwanych wyjątkach nie jest zaznaczona.

  • 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 VC. W zestawie narzędzi VC 140 domyślny debuger obsługuje edytowanie i kontynuowanie zarówno z aplikacjami X86, jak i X64. Starsze zestawy narzędzi obsługują tylko aplikacje X86. Zestawy narzędzi starsze niż VC 120 powinny używać starszego debugera, zaznaczając pozycję "Opcje > debugowania > Ogólne > używanie trybu zgodności natywnej", aby użyć opcji edycji i kontynuowania.

Ograniczenia dotyczące łączenia

Opcje konsolidatora, które wyłączają edytowanie i kontynuuj

Następujące opcje konsolidatora wyłączają opcję 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 łączenia

Domyślnie edytuj i kontynuuj ponownie łączy program na końcu sesji debugowania, aby utworzyć aktualny plik wykonywalny.

Edytowanie i kontynuowanie nie może ponownie linkować 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 ponownie 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.

Edytuj i kontynuuj nie wywołuje niestandardowych kroków kompilacji. Jeśli program używa niestandardowych kroków kompilacji, można ponownie skompilować ręcznie, aby można było wywołać niestandardowe kroki kompilacji. W takim przypadku, można wyłączyć ponowne połączenie po wykonaniu Edytuj i kontynuuj, aby zapewnić, że zostaniesz poproszony o ponowną kompilację ręczną.

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 liczba jest większa niż rozmiar prekompilowanych nagłówków, nie powinny wystąpić problemy w trybie Edytuj i kontynuuj. Jeśli ilość jest mniejsza niż rozmiar prekompilowanych nagłówków, możesz uniemożliwić edytowanie i kontynuowanie ładowania 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

Edytowanie i kontynuowanie nie powoduje ponownego generowania plików języka definicji interfejsu (IDL). W związku z tym zmiany atrybutów IDL nie zostaną odzwierciedlone podczas debugowania. Aby zobaczyć wynik zmian atrybutów IDL, należy zatrzymać debugowanie i ponownie skompilować aplikację. Edytowanie i kontynuowanie 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 wiersz polecenia dla deweloperó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

Ustawienie tej wartości na początku sesji debugowania powoduje, że różne składniki funkcji Edytuj i Kontynuuj wyświetlają pełne rejestrowanie w okienku Debugowanie okna>danych wyjściowych.