在 SIGTRAP 上是否有任何获取指令指针的不可知方法?
Is there any arch-agnostic way of obtaining instruction pointer on SIGTRAP?
我正在寻找一种与架构无关的方法,从 ptrace
示踪剂。
一种依赖架构的方法是使用 PTRACE_GETREGS
并选择例如EIP
在 i386 上,RIP
在 x86_64 上,PC
在 ARM 等上
我尝试使用 siginfo.si_addr
以及 PTRACE_GETSIGINFO
返回的结构中的 siginfo.si_ptr
,但这些值看起来完全错误(4 个十六进制数字而不是 8 个,甚至与真实地址相似),所以它们似乎不是我需要的。
在 Linux 中,我还尝试使用 /proc/<pid>/task/<tid>/stat
的第 30 个字段,内核用 KSTK_EIP(task)
填充 fs/proc/array.c:do_task_stat()
(尽管被命名为以 x86 为中心,似乎是为许多其他架构定义的)。但是出于某种原因,在我的 ARMv6 Linux 4.9.28+ (Raspbian 8) 上,我的程序计数器和堆栈指针都为零。
那么,是否有任何独立于架构的方法来确定 POSIX 定义的 current/next 地址或至少在 Linux 中可用?
您可以使用 /proc/[pid]/syscall
.
mark@ubuntu:~$ 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)
mark@ubuntu:~/$ 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
)
mark@ubuntu:~/$ sudo cat /proc/77860/syscall
23 0x1 0x7fffffffd980 0x0 0x0 0x0 0x7ffff7fdb700 0x7fffffffd958 0x7ffff78ed573
0x7fffffffd958
是sp
,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".
我正在寻找一种与架构无关的方法,从 ptrace
示踪剂。
一种依赖架构的方法是使用 PTRACE_GETREGS
并选择例如EIP
在 i386 上,RIP
在 x86_64 上,PC
在 ARM 等上
我尝试使用 siginfo.si_addr
以及 PTRACE_GETSIGINFO
返回的结构中的 siginfo.si_ptr
,但这些值看起来完全错误(4 个十六进制数字而不是 8 个,甚至与真实地址相似),所以它们似乎不是我需要的。
在 Linux 中,我还尝试使用 /proc/<pid>/task/<tid>/stat
的第 30 个字段,内核用 KSTK_EIP(task)
填充 fs/proc/array.c:do_task_stat()
(尽管被命名为以 x86 为中心,似乎是为许多其他架构定义的)。但是出于某种原因,在我的 ARMv6 Linux 4.9.28+ (Raspbian 8) 上,我的程序计数器和堆栈指针都为零。
那么,是否有任何独立于架构的方法来确定 POSIX 定义的 current/next 地址或至少在 Linux 中可用?
您可以使用 /proc/[pid]/syscall
.
mark@ubuntu:~$ 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)
mark@ubuntu:~/$ 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
)
mark@ubuntu:~/$ sudo cat /proc/77860/syscall
23 0x1 0x7fffffffd980 0x0 0x0 0x0 0x7ffff7fdb700 0x7fffffffd958 0x7ffff78ed573
0x7fffffffd958
是sp
,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".