Запустите приложение в GDB, пока исключение не произойдет

Возможно, эти

100
задан BЈовић 4 February 2013 в 07:37
поделиться

2 ответа

Вы можете попробовать использовать «точку перехвата» ( catch throw ), чтобы остановить отладчик в точке, где генерируется исключение.

Следующий отрывок Из руководства gdb описывается функция точки перехвата.


5.1.3 Установка точек перехвата

Вы можете использовать точки перехвата, чтобы заставить отладчик останавливаться для определенных видов программных событий, таких как исключения C ++ или загрузка общего библиотека. Используйте команду catch для установки точки перехвата.

  • catch событие

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

    • throw

      Вызов исключения C ++.

    • catch

      Перехват исключения C ++.

    • exec

      Вызов функции exec. В настоящее время это доступно только для HP-UX.

    • fork

      Вызов fork. В настоящее время это доступно только для HP-UX.

    • vfork

      Вызов vfork. В настоящее время это доступно только для HP-UX.

    • load или load libname

      Динамическая загрузка любой разделяемой библиотеки или загрузка библиотеки libname. В настоящее время это доступно только для HP-UX.

    • unload или unload libname

      Выгрузка любой динамически загружаемой разделяемой библиотеки или выгрузка имени библиотеки libname. В настоящее время это доступно только для HP-UX.

  • tcatch event

    Установите точку перехвата, которая активна только для одной остановки. Точка перехвата автоматически удаляется после первого перехвата события.

Используйте команду info break , чтобы перечислить текущие точки перехвата.

В настоящее время существуют некоторые ограничения для обработки исключений C ++ (бросок перехвата и catch catch) в GDB:

  • Если вы вызываете функцию в интерактивном режиме, GDB обычно возвращает управление вам, когда функция завершает выполнение. Однако, если вызов вызывает исключение, вызов может обойти механизм, который возвращает вам управление, и привести к тому, что ваша программа либо прервется, либо просто продолжит выполнение, пока не достигнет точки останова, не перехватит сигнал, который GDB ожидает, или завершится. Это так, даже если вы установили точку перехвата для исключения; точки перехвата исключений отключены в интерактивных вызовах.

  • Вы не можете вызвать исключение в интерактивном режиме.

  • Вы не можете установить обработчик исключений в интерактивном режиме.

Иногда перехват - не лучший способ отладки обработки исключений: если вам нужно точно знать, где возникает исключение, лучше остановиться перед вызовом обработчика исключения, так как таким образом вы можете увидеть стек до любой раскрутки происходит. Если вместо этого вы установите точку останова в обработчике исключений, может быть нелегко выяснить, где было вызвано исключение.

Чтобы остановиться непосредственно перед вызовом обработчика исключений, вам необходимо некоторое знание реализации. В случае GNU C ++ исключения вызываются вызовом библиотечной функции с именем __raise_exception, которая имеет следующий интерфейс ANSI C:

/* addr is where the exception identifier is stored.
   id is the exception identifier.  */
void __raise_exception (void **addr, void *id);

Чтобы отладчик перехватил все исключения до того, как произойдет какое-либо разворачивание стека, установите точку останова на __raise_exception (см. Раздел Точки останова, точки наблюдения и исключения).

С условной точкой останова (см. Раздел «Условия останова»), которая зависит от значения id, вы можете остановить свою программу при возникновении определенного исключения. Вы можете использовать несколько условных точек останова, чтобы остановить вашу программу при возникновении любого из ряда исключений.

может быть нелегко выяснить, где было вызвано исключение.

Чтобы остановить работу непосредственно перед вызовом обработчика исключения, вам необходимо знать реализацию. В случае GNU C ++ исключения вызываются вызовом библиотечной функции с именем __raise_exception, которая имеет следующий интерфейс ANSI C:

/* addr is where the exception identifier is stored.
   id is the exception identifier.  */
void __raise_exception (void **addr, void *id);

Чтобы отладчик перехватил все исключения до того, как произойдет какое-либо разворачивание стека, установите точку останова на __raise_exception (см. Раздел Точки останова, точки наблюдения и исключения).

С условной точкой останова (см. Раздел «Условия останова»), которая зависит от значения id, вы можете остановить свою программу при возникновении определенного исключения. Вы можете использовать несколько условных точек останова, чтобы остановить вашу программу при возникновении любого из ряда исключений.

может быть нелегко выяснить, где было вызвано исключение.

Чтобы остановить работу непосредственно перед вызовом обработчика исключения, вам необходимо знать реализацию. В случае GNU C ++ исключения вызываются вызовом библиотечной функции с именем __raise_exception, которая имеет следующий интерфейс ANSI C:

/* addr is where the exception identifier is stored.
   id is the exception identifier.  */
void __raise_exception (void **addr, void *id);

Чтобы отладчик перехватил все исключения до того, как произойдет какое-либо разворачивание стека, установите точку останова на __raise_exception (см. Раздел Точки останова, точки наблюдения и исключения).

С условной точкой останова (см. Раздел «Условия останова»), которая зависит от значения id, вы можете остановить свою программу при возникновении определенного исключения. Вы можете использовать несколько условных точек останова, чтобы остановить вашу программу при возникновении любого из ряда исключений.

Чтобы остановиться непосредственно перед вызовом обработчика исключений, вам нужно знать реализацию. В случае GNU C ++ исключения вызываются вызовом библиотечной функции с именем __raise_exception, которая имеет следующий интерфейс ANSI C:

/* addr is where the exception identifier is stored.
   id is the exception identifier.  */
void __raise_exception (void **addr, void *id);

Чтобы отладчик перехватил все исключения до того, как произойдет какое-либо разворачивание стека, установите точку останова на __raise_exception (см. Раздел Точки останова, точки наблюдения и исключения).

С условной точкой останова (см. Раздел «Условия останова»), которая зависит от значения id, вы можете остановить свою программу при возникновении определенного исключения. Вы можете использовать несколько условных точек останова, чтобы остановить вашу программу при возникновении любого из ряда исключений.

Чтобы остановиться непосредственно перед вызовом обработчика исключений, вам необходимо знать реализацию. В случае GNU C ++ исключения вызываются вызовом библиотечной функции с именем __raise_exception, которая имеет следующий интерфейс ANSI C:

/* addr is where the exception identifier is stored.
   id is the exception identifier.  */
void __raise_exception (void **addr, void *id);

Чтобы отладчик перехватил все исключения до того, как произойдет какое-либо разворачивание стека, установите точку останова на __raise_exception (см. Раздел Точки останова, точки наблюдения и исключения).

С условной точкой останова (см. Раздел «Условия останова»), которая зависит от значения id, вы можете остановить свою программу при возникновении определенного исключения. Вы можете использовать несколько условных точек останова, чтобы остановить вашу программу при возникновении любого из ряда исключений.

исключения вызываются вызовом библиотечной функции с именем __raise_exception, которая имеет следующий интерфейс ANSI C:

/* addr is where the exception identifier is stored.
   id is the exception identifier.  */
void __raise_exception (void **addr, void *id);

Чтобы отладчик перехватил все исключения до того, как произойдет какое-либо разворачивание стека, установите точку останова на __raise_exception (см. раздел Точки останова; точки наблюдения; и исключения) .

С условной точкой останова (see section Условия останова), которая зависит от значения id, вы можете остановить свою программу при возникновении определенного исключения. Вы можете использовать несколько условных точек останова, чтобы остановить вашу программу при возникновении любого из ряда исключений.

исключения вызываются вызовом библиотечной функции с именем __raise_exception, которая имеет следующий интерфейс ANSI C:

/* addr is where the exception identifier is stored.
   id is the exception identifier.  */
void __raise_exception (void **addr, void *id);

Чтобы отладчик перехватил все исключения до того, как произойдет какое-либо разворачивание стека, установите точку останова на __raise_exception (см. раздел Точки останова; точки наблюдения; и исключения) .

С условной точкой останова (see section Условия останова), которая зависит от значения id, вы можете остановить свою программу при возникновении определенного исключения. Вы можете использовать несколько условных точек останова, чтобы остановить вашу программу при возникновении любого из ряда исключений.

С условной точкой останова (см. Раздел «Условия останова»), которая зависит от значения id, вы можете остановить свою программу при возникновении определенного исключения. Вы можете использовать несколько условных точек останова, чтобы остановить вашу программу при возникновении любого из ряда исключений.

С условной точкой останова (см. Раздел «Условия останова»), которая зависит от значения id, вы можете остановить свою программу при возникновении определенного исключения. Вы можете использовать несколько условных точек останова, чтобы остановить вашу программу при возникновении любого из ряда исключений.

143
ответ дан 24 November 2019 в 04:54
поделиться

Установить точку останова на __pure_virtual

5
ответ дан 24 November 2019 в 04:54
поделиться
Другие вопросы по тегам:

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