当系统调用修改其参数时,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 :(得分: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
部分并打印其余的细节。