Подтвердить что ты не робот

Каковы последствия использования /Zi vs/Z7 для проектов Visual Studio С++?

Фон

Существует несколько различных отладочных флагов, которые вы можете использовать с компилятором Visual Studio С++. Это:

  • (нет)
    • Не создавать отладочную информацию
    • Более быстрое время компиляции
  • /Z7
    • Произвести полносимвольную отладочную информацию в файлах .obj с использованием формата CodeView
  • /Zi
    • Произвести полносимвольную отладочную информацию в файле .pdb для цели с использованием формата базы данных программы.
    • Включает поддержку минимальных перестроек (/Gm), которые могут сократить время, необходимое для перекомпиляции.
  • /ZI
    • Производить отладочную информацию, такую ​​как/Zi, за исключением поддержки Edit-and-Continue

Вопросы

  • Флаг/Gm несовместим с флагом /MP для сборки нескольких процессов (Visual Studio 2005/2008)

  • Если вы хотите включить минимальные перестроения, то флаг /Zi необходим над флагом /Z 7.

  • Если вы собираетесь использовать флаг /MP, по-видимому, нет никакой разницы между /Z 7 и/Zi, смотрящими на MSDN. Тем не менее, Документация SCons утверждает, что вы должны использовать /Z 7 для поддержки параллельных сборок.

Вопросы

  • Каковы последствия использования /Zi vs/Z7 в проекте Visual Studio С++?

  • Есть ли другие плюсы или минусы для любого из этих вариантов, которые я пропустил?

  • В частности, в чем преимущество одного файла формата базы данных программы (PDB) для целевых и нескольких файлов формата CodeView (.obj) для каждого источника?

Ссылки

MDSN/Z7,/Zi,/ZI (формат отладочной информации)

MSDN/MP (сборка с несколькими процессами)

SCons Construction Variables CCPDBFLAG

Отладочная информация

4b9b3361

Ответ 1

Codeview - это гораздо более старый формат отладки, который был представлен старым автономным отладчиком Microsoft в "Microsoft C Compiler" в середине 1980-х годов. Он занимает больше места на диске, и отладчику требуется больше времени для синтаксического анализа, и это большая проблема для процесса во время компоновки. Мы сгенерировали его из нашего компилятора, когда я работал над CodeWarrior для Windows в 1998-2000 годах.

Единственное преимущество заключается в том, что Codeview является документированным форматом, а другие инструменты могут обрабатывать его, когда они не могут работать с базами данных отладки в формате PDB. Кроме того, если вы создаете несколько файлов за раз, нет никаких претензий к записи в базу данных отладки для проекта. Тем не менее, для большинства применений в наши дни использование формата PDB является большой победой, как во время сборки, так и, в частности, во время запуска отладчика.

Ответ 2

Одним из преимуществ старого формата C7 является то, что он все-в-одном, хранящийся в EXE, а не отдельный PDB и EXE. Это означает, что у вас никогда не будет несоответствия. Инструменты VS dev будут обеспечивать, чтобы PDB соответствовал EXE, прежде чем он будет использовать его, но определенно проще иметь один EXE со всем, что вам нужно.

Это добавляет новые проблемы, связанные с необходимостью отбрасывать информацию об отладке при выпуске и гигантский EXE файл, не говоря уже о древнем формате и отсутствии поддержки других современных функций, таких как minrebuild, но это может быть полезно, когда вы пытаетесь сохранить все как можно проще. Один файл проще, чем два.

Не то, чтобы я когда-либо пользовался C7-форматом, я просто помещаю его в качестве возможного преимущества, поскольку вы спрашиваете.

Кстати, именно так GCC делает вещи на нескольких платформах, которые я использую. Формат DWARF2 похож на выходные ELF. Люди Unix думают, что они такие веселые.:)

BTW формат PDB может быть проанализирован с помощью DIA SDK.

Ответ 3

Есть еще один недостаток для /Z 7: Это несовместимо с инкрементным связыванием, которое может быть только причиной его предотвращения. Ссылка: http://msdn.microsoft.com/en-us/library/4khtbfyf%28v=vs.100%29.aspx

Кстати, хотя Microsoft говорит, что полная ссылка (вместо инкрементальной) выполняется, когда "Объект, который был скомпилирован с параметром /Yu/Z 7 изменен.", похоже, это справедливо только для статических библиотек build с /Z 7, а не для объектных файлов.

Ответ 4

Другим недостатком /Z 7 является большой размер объектных файлов. Это уже упоминалось здесь, однако это может возрасти до того момента, когда компоновщик не сможет связать исполняемый файл, потому что он нарушает ограничение размера компоновщика или формата PE (он дает вам ошибку компоновщика LNK1248). Кажется, что Visual Studio или формат PE имеют жесткий предел в 2 ГБ (также на x64 машинах). При создании отладочной версии вы можете столкнуться с этим ограничением. Похоже, что это не только влияет на размер окончательного скомпилированного исполняемого файла, но также и на временные данные. Только Microsoft знает о внутренних функциях компоновщика, но мы столкнулись с этой проблемой здесь (хотя исполняемый файл, конечно, не был большим, даже при отладке). Проблема чудесным образом исчезла и не вернулась, когда мы переключили проект на/ZI.

Ответ 5

/Z7 сохраняет отладочную информацию в файлах .obj в формате CodeView и позволяет компоновщику извлекать их и превращать в .pdb, а /Zi объединяет их в общий файл .pdb, синхронизирующийся с mspdbsrv.exe во время компиляции.

Таким образом, /Z7 означает больше файлового ввода-вывода, используемого дискового пространства и больше работы для компоновщика, поскольку в этих файлах obj имеется много дублирующейся отладочной информации. Но это также означает, что каждая компиляция независима и, таким образом, все еще может быть быстрее, чем /Zi при достаточном распараллеливании.

К настоящему времени они улучшили ситуацию с /Zi, уменьшив межпроцессное взаимодействие с mspdbsrv.exe: https://docs.microsoft.com/en-us/cpp/build/reference/zf

Другой вариант использования /Z7 предназначен для "автономных" статических библиотек, которые не требуют доставки отдельного .pdb если вы этого хотите. Это также предотвращает раздражающие проблемы, возникающие из-за ужасного использования по умолчанию имени vcxxx.pdb cl, если вы не исправите его с помощью правильного https://docs.microsoft.com/en-us/cpp/build/reference/fd -program-database-file-name, о котором большинство людей забывают.

/ZI похож на /Zi но добавляет дополнительные данные и т.д. Для работы функции "Редактировать и продолжить".