GDB (DDD), вопросы отладки - PullRequest
0 голосов
/ 23 июля 2010

Некоторые вещи в GDB (на самом деле использующие DDD GUI) смущают меня при отладке моих собственных кодов C ++:

1) Почему после сбоя HEAP ERROR нет обратной трассировки? 2) Почему GDB иногда останавливается ПОСЛЕ точки останова, а не по точке останова? 3) Иногда переход по прокомментированным строкам приводит к выполнению некоторых инструкций (gdb busy) ??

Любые объяснения с благодарностью,

Petr

Ответы [ 5 ]

1 голос
/ 23 июля 2010

Несколько возможных объяснений:

1) Почему после сбоя HEAP ERROR недоступна обратная трассировка?

Если программа генерирует файл дампа памяти, вы можете запустить GDB следующим образом: «gdb program -c corefile» и получить обратную трассировку.

2) ПочемуGDB иногда останавливается ПОСЛЕ точки останова, а не в точке останова?

Точки останова обычно устанавливаются в выражениях, так что следите за этим.Проблема здесь также может быть вызвана несоответствием между двоичным кодом и кодом, который вы используете.

3) Иногда переход по прокомментированным строкам вызывает выполнение некоторых инструкций (gdb занят) ??

Снова, см. # 2.

1 голос
/ 23 июля 2010

1) Я не уверен в ошибке кучи, но, например, если вам не хватило памяти, она не сможет правильно обработать трассировку.Также, если повреждение кучи привело к тому, что указатель взорвал часть стека вашего приложения, из-за чего обратная трассировка была бы недоступна.

2) Если у вас включена оптимизация, это вполне возможно.Компилятор может переупорядочивать операторы, и базовая сборка, на которой была размещена точка останова, может соответствовать более поздней строке кода.Не используйте оптимизацию при попытке отладки таких вещей.

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

0 голосов
/ 23 июля 2010
  1. Проверка кучи, вероятно, выполняется после возврата main, попробуйте set backtrace past-main в GDB. Если происходит сбой - процесс завершен - вам нужно загрузить файл ядра в отладчик (gdb prog core).
  2. Оптимизированный код, см. Ответ @ dmckee
  3. То же, что и 2.
0 голосов
/ 23 июля 2010

Что касается точки останова и поведения комментариев / инструкций, компилируете ли вы с включенной оптимизацией (например, -O3 и т. Д.)?GDB может справиться с этим, но поведение, которое вы видите, иногда возникает при отладке оптимизированного кода, особенно с кодом, скомпилированным с агрессивной оптимизацией.

0 голосов
/ 23 июля 2010

2) Почему GDB иногда останавливается ПОСЛЕ точки останова, а не по точке останова?

Включена ли оптимизация во время компиляции?Если это так, то компилятор может выполнять нетривиальные перестановки вашего кода ... Это также возможно для вашего номера 3.

С g++ используйте -O0 или вообще не -O, чтобы включитьоптимизация отключена.

Мне неясно, о чем спрашивает ваш номер 1.

...