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 > ):
Ogólny format informacji debugowania języka C/C++>: Program Database for Edit and Continue (
/ZI
)>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
W menu Debuguj wybierz pozycję Opcje i Ustawienia.
W oknie dialogowym Opcje w węźle Debugowanie wybierz węzeł Edytuj i kontynuuj.
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
W menu Debuguj wybierz pozycję Opcje i Ustawienia.
W oknie dialogowym Opcje w węźle Debugowanie wybierz węzeł Edytuj i kontynuuj.
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:
- Otwórz wiersz polecenia dla deweloperów.
- 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.