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,我猜 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))位回答您的问题 - 此代码被调用两次。第一次,它if被触发,它只会打印文件描述符和逗号。第二次进入该else部分并打印其余详细信息。

于 2013-02-11T21:53:21.823 回答