Информация в EXE-файле

Написал программу на C в visual studio. Скомпилировал в режиме Release (/MD). Если открыть получившийся екзешник в HEX-редакторе, можно обнаружить это:

Откуда там ссылка на этот файл? Зачем он в релизе? Программа ведь нормально работает и на другом компьютере, где нет этого файла.

Чтоб было проще дебажить крэши на компе разработчика (не указывать путь к файлу каждый раз).

В релизе же нельзя дебажить :thinking: Брейкпоинты не работают

Можно, должны работать.

Еще при краше винда создает файл дамп и его тоже можно немного дебажить, увидеть стектрейс и т.д. если есть pdb.

В релизе брейкпоинты никогда не работали. Пробовал в Delphi / C / C++ / C# много раз. Возможно, в консольных дебаггерах и работает (не проверял), но в среде разработки точно нет.

Ну это видимо что-то не так с настройками проекта, не видит pdb и т.д.
По-моему в студии работает по умолчанию, ну или How to: Debug a Release Build | Microsoft Learn

Первый раз слышу, что релиз можно дебажить :thinking:

А чем тогда релиз будет отличаться от дебага? Почему нельзя дебажить в дебаге?

Оптимизациями.

:thinking: Я думал, смысл релиза, кроме оптимизации, в том, чтобы выкинуть из ЕХЕ-файла всё лишнее (в том числе информацию о дебаге).

Так ее и выкинули почти всю в pdb.

Снимок экрана 2024-01-06 130311
И что, получается, такие пасхалки есть во всех программах на C / C++? :thinking: И не только собранных в вижуалке?

Можно собрать вообще без отладочной информации, если очень хочется.
Соберись и прочти документацию:

Потом отключи отладочную информацию совсем, включая .pdb

«For C++ projects under C/C++/General select ‘None’ for ‘Debug Information Format’»

A PDB file is the key to evaluating crash dumps. If your app crashes anywhere, on any persons machine, given that PDB file you can zero in on the offending code easily when using a good debugger.

Я чёт не понял. Разве при краше генерируется PDB-файл? :thinking: Или его надо отдельно хранить для каждой сборки (который был сгенерирован при сборке)?

У меня эта фигня находится не в C/C++/General, а в Linker/Debug.
Почему не там, где написано?

Да.

А как потом дебажить? Ситуация, при которой релиз упал, скорее всего, будет такая, повторить которую не получится. А простые ошибки и так можно отследить в обычном дебаге.

При падении файл дампа создается, там можно увидеть что-нибудь полезное (стектрейс, значения переменных, …).