Ich versuche, einen Speicherfehler zu beheben, der von clang
mit asan
, aber von valgrind
erkannt wurde. Aber ich kann meine clang
gebaute Binärdatei nicht bekommen, um mir nützliche Debugging-Informationen zu geben. Ich kann dies mit einem kurzen Testprogramm demonstrieren:
(Offensichtlich wird dieser Fehler von valgrind
übernommen, es dient lediglich dazu, das Problem mit clang
anzuzeigen.)
Ich kompiliere es mit Clang 3.4-1ubuntu1 wie folgt:
%Vor% Sicher, ./test
bricht ab und ich sehe einige Debug-Informationen:
Aber was ich wirklich wissen möchte, sind die Zeilennummern, an denen der Fehler aufgetreten ist und wo der Speicher zugewiesen wurde.
Wie bekomme ich diese Informationen von clang
+ asan
?
Wenn wir uns die clang
AdressSanitizer-Dokumentation ansehen, heißt es:
Damit AddressSanitizer seine Ausgabe symbolisiert, müssen Sie die Option ASAN_SYMBOLIZER_PATH-Umgebungsvariable, um auf die llvm-symbolizer binary (oder stellen Sie sicher, dass llvm-symbolizer in Ihrem ist $ PATH):
und zeigt das folgende Beispiel:
ASAN_SYMBOLIZER_PATH = / usr / local / bin / llvm-symbolizer ./a.out
Wie das OP festgestellt hat, kann der Installationsort variieren, aber sobald Sie wissen, wo sich llvm-symbolizer
befindet, sind die Schritte identisch.
Manchmal gibt ein Symbolizer mit einer Versionsnummer den Fehler:
%Vor% Dies kann durch Zeigen auf eine schmucklose llvm-symbolizer
binary behoben werden:
Dann hat Ihre ausführbare Datei wie gewohnt ausgeführt.
Tags und Links c clang address-sanitizer