web-dev-qa-db-ja.com

straceがsyscall =を示すのはなぜですか?

システムコールを実行してカーネルを再コンパイルしましたが、システムコールを実行すると、Killedが返されました。そこで、それをトレースするために、次のメッセージを表示するstraceを使用しました:syscall_0x224(0x7ffda7199738, 0x7ffda7199748, 0x55743750a6d0, 0x7f9f20df7d80, 0x7f9f20df7d80, 0x7ffda7199730) = ?

これはどういう意味ですか(ヘックス、疑問符ではありません)?

2
Ramsey Alsheikh

これは、システムコールが終了し、値を返さなかった(返さなかった)ことを意味します。例を 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 +++
6
muru

これは、あなたのstracesyscall_0x224について知らず(私も[1]も知らない)、どのような種類の値が返され、それをどのようにデコードするかを知らないことを意味します。

あなたはソースを見ることができます ここ

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

別のシステムコールを追加するモジュールをコンパイルした場合は、straceが魔法のようにそれを認識することを期待しないでくださいnot

[1] nr = 0x224/548のシステムコールが見つかりませんでした( x32pwritev2が最後= 547です)。

3
mosvy