Linux x86_64 システム (少なくとも 2.6.32 を実行する RHEL 6.4) では、/proc/pid/syscall
32 ビット プロセスに対して によって報告される最初の syscall 引数は偽物のようです ... その理由を突き止めたいと思います。
たとえば、openat(AT_FDCWD, ...) を実行しているプロセスがブロックされている場合、次のように表示され/proc/pid/syscall
ます ...
64 ビット:
257 0xffffffffffffff9c ...
32 ビット:
295 0xffffffff810495c0 ...
AT_FD_CWD == -100 == 0xffffffffffffff9c
であるため、64 ビットの場合は正しく見えますが、32 ビットの値は上書きされているようです (他の引数は正しく見えます)。
スタックの一番上に struct pt_regs を見つけることができることを知っており、それを経由して見つけることができます...
#define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.sp0 - 1)
そこに偽の値が表示されます。
しかし…straceは32ビットの場合でも第一引数の正しい値を見つけられるようです。これは ptrace(PTRACE_PEEKUSER) を実行しますが、これは私の知る限り、同じ構造体 pt_regs を見るだけです。
私は何かが欠けているに違いありません... PTRACE_PEEKUSER を介して有効なレジスタ値を表示できるようにする strace の魔法は何ですか? 経由で見られるように、最初の引数を上書きするとどうなり/proc/pid/syscall
ますか?