为什么 strace 显示 syscall =?

为什么 strace 显示 syscall =?

我进行了系统调用并重新编译了内核,但是在运行系统调用时它返回了 Killed。因此,为了跟踪它,我使用了 strace,它显示了以下消息: syscall_0x224(0x7ffda7199738, 0x7ffda7199748, 0x55743750a6d0, 0x7f9f20df7d80, 0x7f9f20df7d80, 0x7ffda7199730) = ?

这是什么意思(不是十六进制,问号)?

答案1

这意味着系统调用已终止,并且没有(无法)返回值。给出了一个例子手册strace:

Interruption of a (restartable) system call by a signal delivery is
processed differently as kernel terminates the system call and also
arranges its immediate reexecution after the signal handler
completes.

   read(0, 0x7ffff72cf5cf, 1)     = ? ERESTARTSYS (To be restarted)

看来,就像你的系统调用一样,read这里被终止了,并且没有返回值。 (与您的系统调用不同,read这里被安排重新执行。)

其他不返回的系统调用(例如exit_group)也显示?

~ strace -e exit_group /bin/true
exit_group(0)                           = ?
+++ exited with 0 +++

答案2

这意味着您strace不知道syscall_0x224(我也不知道[1]),也不知道返回什么样的值以及如何解码它。

你可以看一下源码这里:

        if (sys_res & RVAL_NONE)
                tprints("= ?");

如果您编译了一些添加另一个系统调用的模块,请执行以下操作不是期望 strace 神奇地知道它。

[1] 我无法找到任何 nr = 0x224 / 548 的系统调用(x32 pwritev2是最后一个 = 547)。

相关内容