Что эффективные пути состоят в том, чтобы отладить оптимизированную программу C/C++?

После создания новой версии библиотеки OpenCV (opencv4), я нашел, что было немного изменений реализации, внесенных в highgui модуль, где немногие из подарка реализаций на highgui модуле были смещены к imgcodecs (главным образом imread и imwrite).

Установка CMAKE_CXX_FLAGS более конкретно для включения всех библиотек или конкретно-lopencv_imgcodecs был бы достаточен.

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -lopencv_imgcodecs")

Это, оказалось, решало проблему, с которой я сталкивался. Pkg-конфигурация - освобождает opencv списки все модули библиотеки, которые были созданы в opencv4.

14
задан Jonathan Leffler 7 September 2009 в 02:55
поделиться

4 ответа

Всегда труднее отлаживать оптимизированные программы, но всегда есть способы. Несколько дополнительных советов:

  • Создайте отладочную сборку и посмотрите, возникнет ли та же ошибка в отладочной сборке. Нет смысла отлаживать оптимизированную версию, если вам это не нужно.
  • Используйте valgrind, если на платформе, которая его поддерживает. Ошибки, которые вы видите, может быть труднее понять, но раннее выявление проблемы часто упрощает отладку.
  • Отладка printf является примитивной, но иногда это самый простой способ, если у вас есть сложная проблема, которая проявляется только в оптимизированных сборках.
  • ] Если вы подозреваете проблему с синхронизацией (особенно в многопоточной программе), создайте свою собственную версию assert, которая прерывается или печатает, если условие нарушается, и используйте ее в нескольких избранных местах, чтобы исключить возможные проблемы.
  • Посмотрите, сможете ли вы воспроизвести проблему без использования -fomit-frame-pointer, так как это затрудняет отладку кода и с включенными -O2 или -O3. Это может дать вам достаточно информации, чтобы найти причину вашей проблемы.
  • Изолируйте части вашего кода, создайте набор тестов и посмотрите, сможете ли вы определить какие-либо тестовые примеры, которые не работают. Гораздо проще отлаживать одну функцию, чем всю программу.
  • Попробуйте отключить оптимизацию одну за другой с помощью параметров -fno-X. Это может помочь вам найти распространенные проблемы, такие как проблемы со строгим псевдонимом.
  • Включите больше предупреждений компилятора. Некоторые вещи, например проблемы строгого псевдонима, могут генерировать предупреждения компилятора, если они создают разницу в поведении между разными уровнями оптимизации.
19
ответ дан 1 December 2019 в 10:03
поделиться

Конечно, отладить неоптимизированную версию всегда проще. В противном случае может помочь дизассемблирование кода. Другие технические приемы, которые я использовал, включают частичную деоптимизацию кода путем принудительной печати или регистрации промежуточных результатов или изменение критической переменной на «изменчивую», чтобы я мог хотя бы посмотреть на , что значение в отладчике .

1
ответ дан 1 December 2019 в 10:03
поделиться

При отладке релизных сборок вы можете использовать __asm ​​nops; как заполнитель для точек останова (int 3). Это хорошо, так как вы можете гарантировать расположение точек останова без нарушения оптимизации компилятора или написания операторов printf / cout.

7
ответ дан 1 December 2019 в 10:03
поделиться

Скорее всего, то, что вы называете оптимизированным кодом, зашифровано для сокращения циклов (что затрудняет отладку), но на самом деле не очень оптимизировано. Вот пример того, что я имею в виду.

Я бы отключил оптимизацию компилятора, отладил и настроил ее самостоятельно, а затем снова включил бы оптимизацию компилятора, если в коде есть горячие точки, которые действительно присутствуют в коде, который компилятор видит ( не в сторонних библиотеках). (Я определяю точку доступа как часть кода, в которой часто встречается ПК. Это автоматически исключает циклы, содержащие вызовы функций, поскольку они крадут ПК.)

0
ответ дан 1 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: