LeakSanitizer は Ubuntu 18.04 の gdb で動作しませんか? 質問する

LeakSanitizer は Ubuntu 18.04 の gdb で動作しませんか? 質問する

最近、Linux 開発 VM を Ubuntu 16.04 から 18.04 にアップグレードしましたが、1 つ変更点がありました。これは x86-64 の場合です。16.04 では、作業中のプロジェクトを gcc (5.4、16.04 の標準バージョン) と でビルドし-fsanitize=address-O0 -g実行ファイルを gdb (7.11.1、これも Ubuntu に付属のバージョン) で実行するというワークフローを常に採用していました。これは問題なく機能し、最後に、メモリ リークが検出されると、LeakSanitizer がリーク レポートを生成しました。

18.04 では、これはもう機能しないようです。LeakSanitizer は ptrace での実行についてエラーを出します。

==5820==LeakSanitizer has encountered a fatal error.
==5820==HINT: For debugging, try setting environment variable LSAN_OPTIONS=verbosity=1:log_threads=1
==5820==HINT: LeakSanitizer does not work under ptrace (strace, gdb, etc)

その後、プログラムはクラッシュします。

Thread 1 "spyglass" received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51

新しい動作の原因がわかりません。18.04 では、同梱のデフォルトの gcc (7.3.0) でビルドし、-fsanitize=address -O0 -gデフォルトの gdb (8.1.0) を使用してデバッグしています。古い動作を何らかの方法で再度有効にすることはできますか? または、リーク レポートを取得するには、ワークフローを変更して、プログラムを強制終了する前にプログラムから切り離す必要がありますか?

ベストアンサー1

LeakSanitizerは内部的にptraceを使用しており、おそらくすべてのスレッドを一時停止して、誤検知なしでリークをスキャンできるようにするためです(第9号)。ptrace を使用できるアプリケーションは 1 つだけなので、アプリケーションを gdb または strace で実行すると、LeakSanitizer は ptrace 経由で接続できなくなります。

リークデバッグに興味がない場合は、無効にします。

export ASAN_OPTIONS=detect_leaks=0

リークのデバッグを有効にする場合は、LeakSanitizer がスキャンを開始する前にデバッガーをデタッチする必要があります。その後すぐにデバッガーをアタッチできるようにするには、少しスリープします (たとえば、10 秒)。

export ASAN_OPTIONS=sleep_before_dying=10
./program

次に、別のシェルで、アプリケーションに再度アタッチします。

gdb -q -p $(pidof program)

上記(およびその他の)オプションの詳細については、https://github.com/google/sanitizers/wiki/AddressSanitizerFlags

おすすめ記事