2013-02-07 2 views
0

시스템 호출이 인수를 수정하면 strace가 수정 된 값이나 전달 된 원래 값을 인쇄합니까?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하는 두 번째 인자는 시스템 콜에 의해 충전된다

예를 들어, 여기에 epoll_wait 시스템 호출 일부 strace를 출력한다. 구조체에는 두 개의 이벤트가 있고 반환 값은 2이므로 strace는 호출이 완료된 후 값을 출력한다고 추측합니다. 그러나 이것을 입증하는 문서를 찾을 수는 없습니다.

답변

0

시스템 호출마다 다릅니다.

https://github.com/adetaylor/strace-android/blob/android/desc.c#L731

(오히려 이상한 지점의 사과를하지만 원칙은 여전히 ​​적용) : epoll의 특정 경우이 여기에 인쇄됩니다.

코드는 다음과 같습니다

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 섹션에 들어가고 나머지 세부 정보를 인쇄합니다.