私は、ptrace
トレーサの観点から、SIGTRAPが生成された最後に試行された命令(またはその前の命令)の命令ポインタ(AKAプログラムカウンタ)を取得するアーチに依存しない方法を探しています。SIGTRAPで命令ポインタを取得するアーチ・アグノスティックな方法はありますか?
アーチに依存する方法は、PTRACE_GETREGS
を使用して、 i386ではEIP
、x86_64版のRIP
、ARMなどのPC
...
私は-returned構造体PTRACE_GETSIGINFO
からsiginfo.si_addr
などsiginfo.si_ptr
を使用してみましたが、これらの値は完全に間違っている(4進数字の代わりに、8現れ、そしてません本当の住所に似ていても)、私の必要なものではないようです。
KSTK_EIP(task)
と
fs/proc/array.c:do_task_stat()
に埋め
/proc/<pid>/task/<tid>/stat
の30分野、を利用して試してみたLinuxでは
。しかし、私のARMv6 Linux 4.9.28+(Raspbian 8)では何らかの理由でプログラムカウンタとスタックポインタの両方がゼロになっています。
したがって、POSIXによって定義された、または少なくともLinuxで利用可能な現在/次のアドレスを判断するためのアーチに依存しない方法はありますか?
どのようにあなたのシグナルハンドラを設定していますか? ['sigaction()'を使用し、 'sa_flags'構造体のメンバーで' SA_SIGINFO'フラグを設定していますか?](http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html)もしそうなら、あなたはバグを発見した可能性があります。 POSIXは、 'si_addr'メンバがフォールトしている命令を参照することを要求します。 http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html#tag_13_43を参照してください。コードや、ハードウェアやOSなどのシステムの詳細などの情報を追加する必要があります。 –
@AndrewHenle私は 'PTRACE_TRACEME'で' ptrace'を呼び出す新しいプロセスを開始しています。そして、 'waidpid'を使って親プロセスの最初のデバッグイベントを待ちます。イベントは 'SIGTRAP'です。あなたのリンクは 'siigadd'が障害のある命令のアドレスだがSIGTRAPについて何も言わない' SIGILL'と 'SIGFPE'のためのものだと言います。 – Ruslan