strace가 syscall=을 표시하는 이유는 무엇입니까?

strace가 syscall=을 표시하는 이유는 무엇입니까?

시스템 호출을 하고 커널을 다시 컴파일했지만 시스템 호출을 실행하면 Killed가 반환되었습니다. 그래서 이를 추적하기 위해 strace를 사용했는데 다음 메시지가 표시되었습니다. syscall_0x224(0x7ffda7199738, 0x7ffda7199748, 0x55743750a6d0, 0x7f9f20df7d80, 0x7f9f20df7d80, 0x7ffda7199730) = ?

이것은 무엇을 의미합니까(16진수, 물음표 아님)?

답변1

이는 시스템 호출이 종료되었으며 반환 값이 없음(할 수 없음)을 의미합니다. 예가 제공됩니다strace수동:

Interruption of a (restartable) system call by a signal delivery is
processed differently as kernel terminates the system call and also
arranges its immediate reexecution after the signal handler
completes.

   read(0, 0x7ffff72cf5cf, 1)     = ? ERESTARTSYS (To be restarted)

시스템 호출과 마찬가지로 read반환 값 없이 종료되는 것 같습니다. (시스템 호출과 달리 read이 호출은 재실행되도록 예약되어 있습니다.)

반환되지 않는 다른 시스템 호출(예 exit_group: )도 표시됩니다 ?.

~ strace -e exit_group /bin/true
exit_group(0)                           = ?
+++ exited with 0 +++

답변2

이는 사용자가 (나도 [1]도 마찬가지) 반환되는 값과 이를 디코딩하는 방법을 모른다는 strace것을 의미합니다.syscall_0x224

소스코드를 보시면 됩니다여기:

        if (sys_res & RVAL_NONE)
                tprints("= ?");

다른 시스템 호출을 추가하는 일부 모듈을 컴파일한 경우 다음을 수행하십시오.아니요strace가 그것을 마술처럼 알 것이라고 기대하세요.

[1] nr = 0x224 / 548(x32 pwritev2마지막 것 = 547).

관련 정보