2017-08-06 5 views
3

私は、ptraceトレーサの観点から、SIGTRAPが生成された最後に試行された命令(またはその前の命令)の命令ポインタ(AKAプログラムカウンタ)を取得するアーチに依存しない方法を探しています。SIGTRAPで命令ポインタを取得するアーチ・アグノスティックな方法はありますか?

アーチに依存する方法は、PTRACE_GETREGSを使用して、 i386ではEIP、x86_64版のRIP、ARMなどのPC ...

私は-returned構造体PTRACE_GETSIGINFOからsiginfo.si_addrなどsiginfo.si_ptrを使用してみましたが、これらの値は完全に間違っている(4進数字の代わりに、8現れ、そしてません本当の住所に似ていても)、私の必要なものではないようです。

私はまた、カーネルは(x86の中心と命名されているにもかかわらず、多くの他のアーキテクチャ用に定義されて表示され、) 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で利用可能な現在/次のアドレスを判断するためのアーチに依存しない方法はありますか?

+0

どのようにあなたのシグナルハンドラを設定していますか? ['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などのシステムの詳細などの情報を追加する必要があります。 –

+1

@AndrewHenle私は 'PTRACE_TRACEME'で' ptrace'を呼び出す新しいプロセスを開始しています。そして、 'waidpid'を使って親プロセスの最初のデバッグイベントを待ちます。イベントは 'SIGTRAP'です。あなたのリンクは 'siigadd'が障害のある命令のアドレスだがSIGTRAPについて何も言わない' SIGILL'と 'SIGFPE'のためのものだと言います。 – Ruslan

答えて

1

/proc/[pid]/syscallを使用することがあります。

[email protected]:~$ gdb python 
... 
... 
... 
Program received signal SIGINT, Interrupt. 
0x00007ffff78ed573 in __select_nocancel() at ../sysdeps/unix/syscall-template.S:84 
84 ../sysdeps/unix/syscall-template.S: No such file or directory. 
(gdb) 

[email protected]:~/$ ps aux | grep python 
mark  77858 0.2 0.7 90216 37780 pts/2 S+ 15:13 0:00 gdb python 
mark  77860 0.0 0.1 38416 6424 pts/2 t 15:13 0:00 /usr/bin/python 

77860がトレースされていることを確認 - t

[email protected]:~/$ sudo cat /proc/77860/syscall 
23 0x1 0x7fffffffd980 0x0 0x0 0x0 0x7ffff7fdb700 0x7fffffffd958 0x7ffff78ed573 

0x7fffffffd958spであり0x7ffff78ed573はプログラムカウンタです。

ptraceコールが見つかりませんでした。

http://man7.org/linux/man-pages/man5/proc.5.html

/proc/[pid]/syscall (since Linux 2.6.27) 
      This file exposes the system call number and argument regis‐ 
      ters for the system call currently being executed by the 
      process, followed by the values of the stack pointer and pro‐ 
      gram counter registers. The values of all six argument regis‐ 
      ters are exposed, although most system calls use fewer regis‐ 
      ters. 

      If the process is blocked, but not in a system call, then the 
      file displays -1 in place of the system call number, followed 
      by just the values of the stack pointer and program counter. 
      If process is not blocked, then the file contains just the 
      string "running". 
+1

確かに、私はチェックしましたが、これは少なくともx86、x68_64、およびARMでは動作するように見えます。 – Ruslan

関連する問題