Wie kann ich die Pause auf UBSan Berichte in gdb, und weiter?

Neueren Versionen von GCC und Clang-Funktion Undefined Behavior Sanitizer (UBSan) das ist ein compile-flag (-fsanitize=undefined) fügt hinzu, dass Laufzeit-Instrumentierung von code. Auf Fehler, eine Warnung wie diese angezeigt:

packet-ber.c:1917:23: runtime error: Links-shift von 54645397829836991 von 8 stellen dargestellt werden können Typ 'long int'

Nun würde ich gerne Debuggen und erhalten Sie einen debug-break auf der besagten Linie. Für Address Sanitizer (ASAN) es ist ASAN_OPTIONS=abort_on_error=1 die Ergebnisse in ein fataler Fehler, abfangbar. Den nur UBSan option, die scheint brauchbar ist UBSAN_OPTIONS=print_stacktrace=1 die Ergebnisse in einem call-trace-dump für die Berichte. Dies ist jedoch nicht erlauben, mich zu inspizieren die lokalen Variablen und dann das Programm fortzusetzen. Verwendung von -fsanitize-undefined-trap-on-error daher nicht möglich.

Wie soll ich eine Pause in gdb auf UBSan berichten? Während break __sanitizer::SharedPrintfCode scheint zu funktionieren, der name sieht ganz interne.

  • Ich denke, dass, bis eine API implementiert und dokumentiert sind, ein guter Weg, um zu fangen, einen Aufruf an die UBSan runtime-Bibliothek, mit der Absicht, weiterhin Ihr Programm zu tun rbreak ^__ubsan_handle_, die Stoppt die Ausführung vor der Bibliothek ventures in C++ Gebiet, wobei es ordnet Instanzen der Diag-Klasse. Sie kramen alles, was Sie wollen, dann geben Sie return weiterhin Ihr Programm.
  • Für die Zukunft, abort_on_error scheint implementierte für UBSAN. Verwenden Sie dieses anstatt: UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=1
  • Siehe auch How to break im debugger, wenn -fsanitize=undefined druckt so etwas? auf der Clang-Dev-mailing-Liste.
  • Welche GCC/Clang version verwenden Sie genau?
  • Sehr aktuelle Versionen auf Arch Linux, GCC 5.1.0, Klammerten sich 3.6.1.
InformationsquelleAutor Lekensteyn | 2015-06-12
Schreibe einen Kommentar