Компилировать без опции -g, но я хочу получить более подробную информацию об отладке - PullRequest
2 голосов
/ 18 июня 2019

Для моего проекта версия выпуска (скомпилированная с флагом -O2) имеет более высокую производительность, чем отладочная версия (скомпилированная с флагом -g -O0).

Так что я должен использовать версию выпуска.

Однако в производственной среде программа выпуска иногда создает дампы ядра.

Затем я использую gdb xxx core для отладки файла дампа ядра, но для меня недостаточно информации.

Меня не волнует размер программы или любого другого файла. Я хочу наилучшей производительности и максимально подробной отладочной информации.

Что мне делать?

Ответы [ 4 ]

3 голосов
/ 18 июня 2019

-g не не изменяет сгенерированный код. Это только добавляет отладочную информацию. Поэтому не должно влиять на производительность.

Вам следует выяснить, почему вы видите разницу в производительности - это может раскрыть некоторую полезную информацию.

Настройки оптимизации влияют на производительность. Если вам нужно включить их, попробуйте -Og параметр оптимизации . Это позволит оптимизировать, не мешая отладке.

Наконец, Production, как правило, не является отличным местом для отладки. Ваши другие среды должны быть спроектированы так, чтобы воспроизводить все ошибки, которые могут возникнуть в Production. Цель состоит в том, чтобы вы никогда не сталкивались с новой ошибкой на Производстве. Конечно, на практике это очень сложно, но подумайте о том, чтобы тратить меньше времени на отладку для работы над производством и больше времени на то, чтобы другие среды соответствовали друг другу так близко, чтобы вы могли идентифицировать (возможно, сравнивая журналы), а затем воспроизвести ошибку там. В качестве преимущества вы обнаружите больше ошибок, прежде чем они достигнут производства.

2 голосов
/ 18 июня 2019

Вы должны скомпилировать с -g -O2, и (если вы уверены, что это необходимо), раздеть символы отладки в отдельный файл символов . Я не могу вспомнить точные шаги, поскольку я обычно позволяю dh-strip сделать это для меня при сборке пакетов, но идея в том, что символы не занимают память в процессе программы - вы загружаете их в отладчик.

0 голосов
/ 18 июня 2019

Вы также хотите установить -fno-omit-frame-pointer, чтобы вы знали, где находитесь во время отладки. Это замедлит выполнение, поскольку существует один менее пригодный для использования регистр, но отладка - это компромисс между производительностью и информацией (и иногда вам это нужно, чтобы выяснить, что компилятор предполагал что-то в режиме выпуска!).

CMake использует по умолчанию -O3 для выпуска и -O2 -g для выпуска с отладочной информацией (полезно для отладки и профилирования), поэтому у вас есть хорошее начало, просто добавьте указатель кадра, чтобы иметь лучший контекст.

И да, отладка в производстве? Страшно. Найдите репродуктора.

0 голосов
/ 18 июня 2019

Я хочу лучшее выступление

Что мне делать?

Включить оптимизацию.

Я хочу ... самую подробную информацию об отладке.

Что мне делать?

Отключить оптимизацию (или если ваш компилятор поддерживает такую ​​опцию: включить только оптимизацию, которая не мешает отладке; -Og в случае g ++) и включить символы отладки.

Как вы можете заметить, эти требования находятся в конфликте.

Достойным компромиссом для отладки дампа из выпуска является включение как оптимизации, так и включения информации отладки для сборки, особенно с учетом ...

Мне не важен размер программы или любого другого файла.

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

...