strace在系统调用之前或之后打印参数值?

时间:2013-02-07 16:54:12

标签: strace

当系统调用修改其参数时,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在调用完成后打印值。但我找不到任何证明这一点的文件。

1 个答案:

答案 0 :(得分: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部分并打印其余的细节。