sockets linux-kernel gdb strace ptrace

sockets - Los procesos colgados se reanudan si están conectados a strace



linux-kernel gdb (1)

Tengo un programa de red escrito en C usando sockets TCP. A veces, el programa cliente se cuelga para siempre esperando la entrada del servidor. Específicamente, el cliente se cuelga en el conjunto de llamadas select () en un archivo fd destinado a leer caracteres enviados por el servidor.

Estoy usando strace para saber dónde se estancó el proceso. Sin embargo, a veces, cuando adjunto el proceso del cliente colgado al strace, inmediatamente se reanuda su ejecución y sale correctamente. No todos los procesos bloqueados muestran este comportamiento, algunos procesos se quedan encerrados en select () incluso si los adjunto a strace. Pero la mayoría de los procesos reanudan su ejecución cuando están conectados a strace.

Tengo curiosidad por saber qué causa los procesos que se reanudan cuando se adjuntan a strace. Puede darme pistas para saber por qué los procesos de los clientes se bloquean.

¿Algunas ideas? ¿Qué causa que un proceso suspendido reanude su ejecución cuando se adjunta a strace?

Actualizar:

Aquí está la salida de strace on hung procesos.

> sudo strace -p 25645 Process 25645 attached - interrupt to quit --- SIGSTOP (Stopped (signal)) @ 0 (0) --- --- SIGSTOP (Stopped (signal)) @ 0 (0) --- [ Process PID=25645 runs in 32 bit mode. ] select(6, [3 5], NULL, NULL, NULL) = 2 (in [3 5]) read(5, "/0", 8192) = 1 write(2, "", 0) = 0 read(3, "====Setup set_oldtempbehaio"..., 8192) = 555 write(1, "====Setup set_oldtempbehaio"..., 555) = 555 select(6, [3 5], NULL, NULL, NULL) = 2 (in [3 5]) read(5, "", 8192) = 0 read(3, "", 8192) = 0 close(5) = 0 kill(25652, SIGKILL) = 0 exit_group(0) = ? Process 25645 detached

_

> sudo strace -p 14462 Process 14462 attached - interrupt to quit [ Process PID=14462 runs in 32 bit mode. ] read(0, 0xff85fdbc, 8192) = -1 EIO (Input/output error) shutdown(3, 1 /* send */) = 0 exit_group(0) = ?

_

> sudo strace -p 7517 Process 7517 attached - interrupt to quit --- SIGSTOP (Stopped (signal)) @ 0 (0) --- --- SIGSTOP (Stopped (signal)) @ 0 (0) --- [ Process PID=7517 runs in 32 bit mode. ] connect(3, {sa_family=AF_INET, sin_port=htons(300), sin_addr=inet_addr("100.64.220.98")}, 16) = -1 ETIMEDOUT (Connection timed out) close(3) = 0 dup(2) = 3 fcntl64(3, F_GETFL) = 0x1 (flags O_WRONLY) close(3) = 0 write(2, "dsd13: Connection timed out/n", 30) = 30 write(2, "Error code : 110/n", 17) = 17 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 exit_group(1) = ? Process 7517 detached

No solo seleccione (), pero los procesos (del mismo programa) están bloqueados en varias llamadas al sistema antes de adjuntarlos a strace. De repente se reanudan después de unirse a strace. Si no los adjunto a strace, simplemente se quedan allí para siempre.

Actualización 2:

Aprendí que strace podría iniciar un proceso que se detuvo previamente (proceso en T iesta). Ahora trato de entender por qué estos procesos pasan al estado ''T'', cuál es la causa. Aquí está la información de estado / proc //:

> cat /proc/12554/status Name: someone State: T (stopped) SleepAVG: 88% Tgid: 12554 Pid: 12554 PPid: 9754 TracerPid: 0 Uid: 5000 5000 5000 5000 Gid: 48986 48986 48986 48986 FDSize: 256 Groups: 9149 48986 VmPeak: 1992 kB VmSize: 1964 kB VmLck: 0 kB VmHWM: 608 kB VmRSS: 608 kB VmData: 156 kB VmStk: 20 kB VmExe: 16 kB VmLib: 1744 kB VmPTE: 20 kB Threads: 1 SigQ: 54/73728 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000000000006 SigCgt: 0000000000004000 CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 Cpus_allowed: 00000000,00000000,00000000,0000000f Mems_allowed: 00000000,00000001


strace usa ptrace . La página man de ptrace tiene esto:

Since attaching sends SIGSTOP and the tracer usually suppresses it, this may cause a stray EINTR return from the currently executing system call in the tracee, as described in the "Signal injection and suppression" section.

¿Estás viendo select devolver EINTR ?