최근 누군가와 strace에 대해 논의하고 있었는데 그들은 네트워크 소켓이나 그와 유사한 것을 생성하는 동안 실행 중인 프로세스를 추적하면 어떻게 되는지 물었습니다. 이로 인해 프로그램이 예상치 못한 방식으로 충돌하게 됩니까?
ptrace(strace에서 사용하는 시스템 호출)에 대해 읽은 내용에 따르면 단지 스레드를 디버깅하는 경우 유사한 상황이 발생해서는 안 됩니다. 시스템 호출이 호출될 때마다 프로세스가 중지되지만 나중에 다시 시작해야 하며 더 이상 현명해지지 않습니다. 신호는 실행되지 않을 때 대기열에 추가되므로 시스템 호출/소켓/리스너에서도 비슷한 일이 발생한다고 가정합니다.
strace 컨텍스트에서 ptrace를 사용하면 이상한 프로세스 충돌이 발생합니까?
답변1
아니요, strace
프로그램 충돌을 유발해서는 안 됩니다. -
와는 별개로다소 특이한 경우:
의존성이 있는 경우실행 시간또는 런타임메모리 위치.
이 문제가 발생할 수 있습니다 "하이젠베르크" - 하지만 극히 드뭅니다. 이 버그는 매우 드물기 때문에 strace나 다른 도구에서만 트리거하면 됩니다. 일반적으로 heisenbug를 발견하면 좋은 일입니다.
ptrace()
시스템콜 에 관해서는 strace
제가 생각했던 것과 똑같아서 비슷합니다. strace
직접 사용하는 것보다 더 많은 일을 할 수 있습니다 ptrace()
.
귀하의 예에서 오류는 다음과 같습니다.
이 예에서는 strace
네트워크 연결을 생성하는 단계의 타이밍을 변경합니다. 이로 인해 문제가 발생하면 "발생을 기다리는 문제"입니다. 실행 시점이 계속 변경됩니다. 네 strace
, 조금만 더 하면 됩니다. 그러나 런처와 같은 다른 응용 프로그램에서는 시간을 더 많이 변경할 수 있습니다.
답변2
웹 소켓 등을 생성하는 동안 실행 중인 프로세스를 추적하면 어떻게 될까요?
비슷한 작업이 다음을 통해 수행됩니다.시스템 호출는 프로세스가 커널에 요청을 하고 커널이 이를 만족시킨다는 것을 의미합니다. 커널에는 ptrace()
일을 작동시키는 마법도 있습니다. 이것이 자체적으로 넘어갈 수 없다는 것을 의미하지는 않지만(버그일 수 있음) 멀티태스킹 시스템에서 프로세스를 조정하는 것이 분명히 그 목적 중 하나이기 때문에 그럴 것 같지 않습니다.
답변3
GUI 프로세스를 추적하면 최신 운영 체제에서도 종종 충돌이 발생한다는 것을 발견했습니다(적어도 OpenSuse 12.3, GUI 프로세스 추적을 거의 포기했기 때문에 특별히 13.1을 시도하지 않았습니다).
최근 운영 체제에서 충돌을 일으키는 GUI가 아닌 프로세스의 흔적을 본 기억이 없습니다.
답변4
예. 이런 일은 드물고 이유는 모르겠지만 확실히 발생합니다. 최근에 오랫동안 실행되는 "swapoff" 명령을 추적하는 동안 이 문제가 발생했는데 네트워크에 액세스할 수 없거나 문제를 일으킬 것으로 보이는 다른 어떤 것도 없었습니다. 그럼에도 불구하고 프로세스는 strace를 연결한 직후 종료되었습니다.
>strace -p 73358
strace: Process 73358 attached
getuid() = 0
geteuid() = 0
getgid() = 0
getegid() = 0
prctl(PR_GET_DUMPABLE) = 1
stat("/etc/fstab", {st_mode=S_IFREG|0644, st_size=2168, ...}) = 0
open("/etc/fstab", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2168, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f24e5cd8000
read(3, "\n#\n# /etc/fstab\n# Created by ana"..., 4096) = 2168
read(3, "", 4096) = 0
close(3) = 0
munmap(0x7f24e5cd8000, 4096) = 0
close(1) = 0
close(2) = 0
exit_group(-1) = ?
+++ exited with 255 +++
프로세스가 자동으로 종료되기로 결정된 것처럼 보이지만 strace가 시작되기 몇 시간 동안 실행되었다는 점을 고려하면 이 종료가 우연의 일치인지 의심됩니다.
그렇습니다. strace는 때때로 프로세스를 중단시킬 수 있지만, 좋은 정보를 얻는 것의 이점이 위험보다 더 큰 경우는 매우 드뭅니다.
/proc/<PID>/stack
Linux의 또 다른 옵션은 프로세스가 현재 차단된 위치를 확인하는 것입니다 . 이는 더 안전하지만 덜 동적인 정보를 제공합니다.