0

システムコールがその引数を変更するとき、strace は変更された値、または渡された元の値を出力しますか?

たとえば、epoll_wait システム コールの strace 出力は次のとおりです。

11:30:14.602559 epoll_wait(5, {{EPOLLIN|EPOLLOUT, {u32=1210872224, u64=140506770993568}}, {EPOLLIN|EPOLLOUT, {u32=1208190976, u64=140506768312320}}}, 128, 0) = 2

epoll_wait の 2 番目の引数は、システム コールによって埋められます。構造体には 2 つのイベントがあり、戻り値は 2 であるため、呼び出しが完了した後に strace が値を出力すると推測しています。しかし、これを検証するドキュメントは見つかりません。

4

1 に答える 1

0

システムコールによって異なります。の特定の場合epoll、これはここに出力されます。

https://github.com/adetaylor/strace-android/blob/android/desc.c#L731

(これはかなり奇妙な分岐ですが、原則は引き続き適用されます)。

コードは次のとおりです。

static void
epoll_wait_common(struct tcb *tcp)
{
if (entering(tcp)) {
    printfd(tcp, tcp->u_arg[0]);
    tprints(", ");
} else {
    if (syserror(tcp))
        tprintf("%lx", tcp->u_arg[1]);
    else if (tcp->u_rval == 0)
        tprints("{}");
    else {
...

ビットはif (entering(tcp))あなたの質問に答えます-このコードは2回呼び出されます。初めて、それifがトリガーされ、ファイル記述子とコンマを出力するだけです。2回目にelseセクションに入り、残りの詳細を印刷します。

于 2013-02-11T21:53:21.823 に答える