Выводит ли strace значения аргументов до или после системного вызова?

Когда системный вызов изменяет свои аргументы, печатает ли strace измененные значения или исходные значения, которые были переданы?

Например, вот некоторый вывод strace для системного вызова epoll_wait:

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, я предполагаю, что strace печатает значения ПОСЛЕ завершения вызова. Но я не могу найти никаких документов, подтверждающих это.


person Anne    schedule 07.02.2013    source источник


Ответы (1)


Это зависит от системных вызовов. В конкретном случае 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)) отвечает на ваш вопрос - этот код вызывается дважды. В первый раз срабатывает if, и он просто напечатает дескриптор файла и запятую. Во второй раз он входит в раздел else и печатает остальные реквизиты.

person Adrian Taylor    schedule 11.02.2013