1

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) で再現できませんでした。

4

0 に答える 0