2017-07-24 6 views
0

Ich versuche, auf einem Server Debugging auf einem Problem, das ich vermute, ist mit einem Pufferüberlauf verbunden, so habe ich versucht, meinen Code mit -fsanitize=address zu kompilieren, um die Adressbereinigung zu ermöglichen.GCC-Adresse Sanitizer Core Dump bei Fehler

Es kompiliert, und die resultierende Software läuft. Ich versuche jedoch, einen Core-Dump zu bekommen, wenn der Adressdesinfizierer einen Fehler entdeckt, da dies die einzige Möglichkeit ist, Informationen aufgrund des Setups aus dem System zu bekommen.

Ich rufe die Software mit ASAN_OPTIONS=abort_on_error=1 vor der Befehlszeile (mit einem Shell-Skript, um dies zu tun), und haben überprüft, dass ulimit -c unbegrenzte gibt als Ergebnis, aber es wird nur nicht ein Core-Dump erzeugen.

Was fehlt mir?

Dies ist auf einem Ubuntu 14.04 Server mit gcc Version 4.8.4

EDIT: sysctl kernel.core_pattern gibt zurück kernel.core_pattern = |/usr/share/apport/apport %p %s %c %P. Dies bedeutet wahrscheinlich, dass apport aktiviert ist (zumindest in irgendeiner Form). Allerdings konnte ich auf diesem System die richtigen Kerndateien von Aneignungen und SIGFPEs in der Software erhalten (von denen der Verdacht auf Array-Überläufe herrührt).

+0

Haben Sie 'apport' aktiviert? Was ist der Wert von 'kernel.core_pattern' sysctl value? –

Antwort

1

Lass mich raten, ist das x64-Ziel? Coredumps sind dort deaktiviert, um zu vermeiden, dass 16 TB Schattenspeicher gedumpt werden (für Details siehe Dokumente für disable_coredump).

Neuere Versionen von GCC/Clang remove shadow from core by default so dass man so etwas wie

export ASAN_OPTIONS=abort_on_error=1:disable_coredump=0 

tun, aber ich habe Angst, 4,8 für dieses zu alt ist.

Als alternativen Vorschlag, warum Backtraces nicht genug für Sie sind? Sie könnten log_path oder log_to_syslog verwenden, um sie zu erhalten, wenn Sie keinen Zugriff auf Programme stderr haben.

Hinweis: I posted suggestion zum Aktivieren von Coredumps auf allen Plattformen.