Jakie są konsekwencje wykorzystania /Zi vs / Z7 dla projektów Visual Studio C++?

Tło

Istnieje kilka różnych znaczników debugowania , których możesz użyć w kompilatorze Visual Studio C++. Są to:

  • (brak)
    • nie tworzy żadnych informacji debugujących
    • szybszy czas kompilacji
  • / Z7
    • generuje pełne symboliczne informacje o debugowaniu wpliki obj w formacie CodeView
  • / Zi
    • generuje pełne symboliczne informacje debugujące w .plik pdb dla celu za pomocą formatu bazy danych programu.
    • umożliwia obsługę minimalnych przebudów (/Gm), które mogą skrócić czas potrzebny na rekompilację.
  • / ZI
    • generuje informacje o debugowaniu, takie jak /Zi, z wyjątkiem obsługi Edit-and-Continue

Problemy

  • Flaga / Gm jest niezgodna z flagą /MP dla wielu kompilacji procesów (Visual Studio 2005/2008)

  • Jeśli aby włączyć Minimalne przebudowy, konieczne jest użycie flagi /Zi zamiast flagi /Z7.

  • Jeśli zamierzasz użyć flagi /MP, nie ma widocznej różnicy między /Z7 i / Zi patrząc na MSDN. Jednak dokumentacja SCons stwierdza, że musisz użyć /Z7 do obsługi równoległych kompilacji.

Pytania

  • Jakie są konsekwencje użycia /Zi vs / Z7 w projekcie Visual Studio C++?

  • Czy są inne plusy lub minusy dla jednej z tych opcji, które przegapiłem?

  • W szczególności, jakie są korzyści z pliku formatu bazy danych pojedynczego programu (PDB)dla formatu docelowego vs wielu CodeView (.obj) pliki dla każdego źródła?

Referencje

MDSN /Z7, /Zi, / ZI (debug Information Format)

MSDN /MP (Build with Multiple Processes)

Zmienne konstrukcyjne SCons CCPDBFLAG

Debug Info

Author: Akhil Jain, 2008-11-12

4 answers

Codeview jest znacznie starszym formatem debugowania, który został wprowadzony ze starym samodzielnym debuggerem Microsoftu w czasach" kompilatora Microsoft C " w połowie lat 80. zajmuje więcej miejsca na dysku i zajmuje więcej czasu na debugger do parsowania, i to jest poważny ból do przetwarzania podczas łączenia. Wygenerowaliśmy go z naszego kompilatora, kiedy pracowałem nad CodeWarrior Dla Windows w latach 1998-2000.

Jedyną zaletą jest to, że Codeview jest udokumentowanym formatem, a inne narzędzia mogą często przetwarzać, gdy nie mogli poradzić sobie z bazami debugowania w formacie PDB. Ponadto, jeśli budujesz wiele plików na raz, nie ma zastrzeżeń do zapisu do bazy danych debugowania dla projektu. Jednak dla większości zastosowań w dzisiejszych czasach korzystanie z formatu PDB jest dużą wygraną, zarówno w czasie kompilacji, jak i szczególnie w czasie uruchamiania debuggera.

 8
Author: Ben Combee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-13 23:19:42

Jedną z zalet starego formatu C7 jest to, że jest on all-in-one, przechowywany w EXE, zamiast oddzielnego PDB i EXE. Oznacza to, że nigdy nie można mieć niedopasowania. Narzędzia VS dev upewnią się, że PDB pasuje do swojego EXE, zanim go użyje, ale zdecydowanie łatwiej jest mieć pojedynczy EXE ze wszystkim, czego potrzebujesz.

Dodaje to nowe problemy z koniecznością usunięcia informacji o debugowaniu po wydaniu, oraz gigantycznego pliku EXE, nie wspominając o starożytnym formacie i braku wsparcia dla inne nowoczesne funkcje, takie jak minrebuild, ale nadal mogą być pomocne, gdy próbujesz utrzymać rzeczy tak proste, jak to możliwe. Jeden plik jest łatwiejszy niż dwa.

Nie żebym kiedykolwiek korzystał z formatu C7, po prostu umieszczam to tam jako możliwą zaletę, skoro pytasz.

Nawiasem mówiąc, tak GCC robi rzeczy na kilku platformach, których używam. Format DWARF2 zakopany w wyjściowym ELFIE. ludzie Uniksa myślą, że są tacy komiczni. :)

BTW format PDB można parsować za pomocą DIA SDK .

 7
Author: scobi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-14 00:44:12

Jest jeszcze jedna wada dla /Z7: Nie jest kompatybilny z przyrostowym linkowaniem, co może być powodem, aby go uniknąć. Link: http://msdn.microsoft.com/en-us/library/4khtbfyf%28v=vs.100%29.aspx

Przy okazji: nawet jeśli Microsoft mówi, że pełne łącze (zamiast przyrostowego) jest wykonywane, gdy "obiekt skompilowany z opcją /Yu /Z7 jest zmieniony.", wydaje się, że dotyczy to tylko bibliotek statycznych zbudowanych z /Z7, a nie plików obiektowych.

 3
Author: ElektroKraut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-12 06:09:04

Kolejną wadą /Z7 jest duży rozmiar plików obiektowych. Zostało to już tutaj wspomniane, jednak może to nasilić się do punktu, w którym linker nie jest w stanie połączyć pliku wykonywalnego, ponieważ łamie limit rozmiaru linkera lub formatu PE (daje błąd linkera LNK1248). Wydaje się, że Visual Studio lub format PE ma twardy limit 2GB (również na maszynach x64). Podczas tworzenia wersji debugowania możesz uruchomić ten limit. Wydaje się, że wpływa to nie tylko na wielkość ostateczny skompilowany plik wykonywalny, ale także dane tymczasowe. Tylko Microsoft wie o wewnętrznych linkerach, ale natknęliśmy się na ten problem tutaj (choć plik wykonywalny nie był oczywiście duży o 2gigs, nawet w debugowaniu). Problem w cudowny sposób zniknął i nigdy nie wrócił, gdy zmieniliśmy projekt na /ZI.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-26 12:44:16