Последние версии функций GCC и Clang Undefined Behavior Sanitizer (UBSan), который является флагом компиляции (-fsanitize=undefined
), который добавляет код инструментария во время выполнения. При ошибках отображается предупреждение, такое как этот:
packet-ber.c: 1917: 23: ошибка времени выполнения: сдвиг влево 54645397829836991 на 8 мест не может быть представлен в типе 'long int'
Теперь я хотел бы отладить это и получить отладочную паузу на указанной строке. Для Address Sanitizer (ASAN) существует ASAN_OPTIONS=abort_on_error=1
, что приводит к фатальной ошибке, которая является захватывающей. Единственная опция UBSan, которая кажется пригодной для использования, - UBSAN_OPTIONS=print_stacktrace=1
, что приводит к дампу трассировки вызовов для отчетов. Однако это не позволяет мне проверять локальные переменные, а затем продолжить программу. Поэтому использование -fsanitize-undefined-trap-on-error
невозможно.
Как мне разбить gdb на отчеты UBSan? Пока break __sanitizer::SharedPrintfCode
работает, имя выглядит довольно внутренним.