Я пытаюсь отладить программу, которая часто заставляет GDB останавливаться и отображать SIGTRAP, когда она не находится в точке останова. Это происходит при загрузке динамических библиотек и других обычных вещей. Есть около 1000 таких событий, прежде чем моя точка останова окончательно ударит, поэтому мне не удалось вручную «продолжить» все эти нерелевантные SIGTRAP. Но если я использую команду handle SIGTRAP nostop noprint
, то GDB не остановится в моей точке останова.Как заставить GDB останавливаться на SIGTRAP только на контрольных точках?
Похоже, что должен быть способ обучения GDB, чтобы он понимал, какой SIGTRAP хорош для остановки, и который не подходит для остановки. Ясно, что GDB знает, находится ли он в точке останова, потому что вывод очень надежно отличается: в точке останова он упоминает «точку останова» и показывает номер точки останова, но в любом другом SIGTRAP он просто говорит «SIGTRAP». Поэтому вместо того, чтобы печатать сообщение о SIGTRAP, мне бы очень хотелось, чтобы GDB просто сказал себе: «Вау, это SIGTRAP, и здесь нет точки останова. Посмотрите на меня, я собираюсь остановиться и распечатать бесполезное сообщение SIGTRAP, которое полностью разрушает сессию отладки! Как насчет того, что я просто продолжаю спокойно? " Пожалуйста, дайте мне знать, если у кого-то есть способ сделать это.
Кстати, это зависит от архитектуры, но идея в целом применима. Возможно, вам нужно «установить $ pc + = ...» или изменить номера 'si_code'. – Lekensteyn
'silent' не работает в моем gdb. Что я могу использовать вместо этого? – Alex
@Alex Define «не работает», это предотвращает печать сообщения, но оно не будет автоматически продолжено после того, как точка catch будет удалена. – Lekensteyn