Как отладчикам удается сломаться на любом броске? - PullRequest
10 голосов
/ 06 марта 2019

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

По какому механизму этовозможный?Есть ли сигнал ОС, который можно использовать для подключения?Есть ли указатель на функцию monkey patch, чтобы разрешить это?Это единственный шаг, чтобы это произошло?

Доступен ли этот механизм за пределами отладчика?

1 Ответ

10 голосов
/ 06 марта 2019

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

Каким механизмом это возможно?Есть ли сигнал ОС, который можно использовать для подключения?Есть ли указатель на функцию monkey patch, чтобы разрешить это?Это один шаг, чтобы это произошло?

Ничего из этого.Это просто нормальная точка останова на __cxa_throw().GDB использует знания о реализации среды выполнения C ++ со всеми вытекающими отсюда недостатками.Исключения в C ++ находятся ниже радара операционной системы, поэтому операционная система не будет знать о них.Путаница проистекает из того факта, что некоторые сигналы (например, segfaults) называются исключения в Windows и могут обрабатываться очень похоже на исключения C ++ в Windows при отладке.Но это заставляет ОС-сигналы (например, segfault) вести себя как исключения C ++, а не наоборот.

См. Также ftp: //ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_30.html

...