ptrace の制御下で、clang のアドレス サニタイザーでビルドされたバイナリを実行しようとしていますが、偽の SIGTRAP に問題があります。
私のプログラムは、標準的な方法で ptrace を使用しptrace(PT_TRACE_ME,...)
ますexec
。親は、呼び出しが行われたSIGTRAP
ことを示す in child を待機します。exec
親はptrace(PT_CONTINUE,...)
、子を実行するように設定します。
これはすべて、通常のバイナリでは問題なく機能します。一方、アドレスサニタイザーでビルドされたバイナリを実行するとPT_CONTINUE
、プロセスを再開するために を実行した後、子プロセスは予期しない SIGTRAP をすぐに受け取ります。
これは、同様の方法で ptrace と対話する gdb を使用して実証できます。
簡単なテスト プログラムを作成します。
$ echo 'int main(){return 50;}' | clang -fsanitize=address -o test -xc -
$ ./test
$ echo $?
50
gdb で実行します。
$ ggdb ./test
<<snip>>
(gdb) run
(記号に関するメッセージは無視してください。)
プロセスはコード 062 で終了せず、SIGTRAP で停止したことに注意してください。
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00007fff5fc01000 in ?? ()
プロセスを実行するには、手動で続行します。
(gdb) continue
Continuing.
[Inferior 1 (process 14536) exited with code 062]
これはすべて対話型の使用には非常に適していますが、アドレス サニタイザーのビルドには特別な処理が必要になるため、自動テストには少し面倒です。可能であれば、すべてのビルド タイプで同じテスト プロセスを維持したいと考えています。
ここで何が起こっているか知っている人はいますか?
私はclang-700.1.76(Xcodeから)を使用しています。(そして gdb 7.9.1 (MacPorts から) - しかし、これは私自身のコードも影響を受けているため、より一般的な問題のように見えます。)
これを Linux (gcc 4.8.4/clang 3.8.0、gdb 7.7.1) で再現できませんでした。