Я пытаюсь отлаживать программу на Debian, построенную с помощью gcc/g ++ (DEBUG=1
и NDEBUG
undefined). Я использую стороннюю библиотеку и ее встроенную для отладки тоже (DEBUG=1
, NDEBUG
undefined, а также другие определения отладки). Библиотека представляет собой 150 тыс. Строк и содержит множество утверждений. Это хорошо.Изменить поведение assert для Debug (SIGABRT -> SIGTRAP)
В моем коде есть ошибка, и я пытаюсь отлаживать SQL-запрос сейчас. Это вызывает утверждение в сторонней библиотеке. Это нормально и его курс для курса.
Тем не менее, этот аргумент, обозначенный Posix, вызывает ошибку при запуске программы assert
в библиотеке. Это бесполезное поведение при отладке для функции «debugging and diagnostic». Это должно быть одним из самых глупых решений этого комитета, и неудивительно, что многие люди редко используют его во время разработки.
Я хочу изменить поведение таким образом, чтобы при срабатывании assert он поднимал SIGTRAP
, а не SIGABRT
. Я немного ограничен, потому что я не писал стороннюю библиотеку (мой код использует MY_ASSERT
, и он вызывает SIGTRAP
, поэтому я могу продолжить и смотреть пути отрицательного кода).
Я знаю, что я могу установить или изменить обработчики сигналов через gdb, но gdb уже останавливается на SIGABRT
перед передачей его программе и прерыванием. Я также попытался установить настраиваемый обработчик сигнала SIGABRT
, который, похоже, не помогает, поскольку прерывание все еще происходит.
Как я могу изменить поведение assert
, чтобы поднять SIGTRAP
при отладке?
Спасибо Patesh, я попробую скоро. Я думаю, что мой другой выбор - это инъекция в трюки 'LD_PRELOAD', что для меня немного экстремально. Что, черт возьми, было мышлением Posix ..... – jww
К сожалению, это не сработало, когда я протестировал, выполнив '__assert_fail' в исходном файле' main'. '__assert_fail' никогда не вызывался. – jww
Платформа? Архитектура? Варианты компиляции? функция '__assert_fail' ** отображается на глобальном уровне (если нет, то она просто не работает)? Я протестировал его простым: 'int main (int argc, char ** argv) {assert (argc! = 1); } 'как основной метод, и он отлично справился с системой i386/x64. – Petesh