2013-02-07 42 views
0

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

回答

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部分并打印其余细节。

相关问题