Messages in this thread | | | From | Paul Hilfinger <> | Subject | PROBLEM: sigwait in inferior process interacts badly with ptrace | Date | Fri, 14 May 2004 05:21:41 -0400 (EDT) |
| |
[Apologies in advance for clumsiness in this report. I have not submitted a Linux kernel bug report before].
[1.] One line summary of the problem:
sigwait in inferior process interacts badly with ptrace
[2.] Full description of the problem/report:
As of kernel version 2.4.21, the interaction of sigwait in the inferior with ptrace (at least as used by GDB) has changed. (A) We observed that in a non-threaded program, when the inferior was waiting at a sigwait, GDB would NOT notice signals sent to the inferior (although the inferior would correctly respond to them). (B) We observed that in a pthreaded program, an inferior waiting on sigwait would incorrectly continue from that sigwait with an EINTR error code (which sigwait is not supposed to return) even in response to the 'run' command in GDB.
[3.] Keywords (i.e., modules, networking, kernel):
Kernel, signals, ptrace, sigwait
[4.] Kernel version (from /proc/version):
Linux version 2.4.21-9.ELsmp (bhcompile@stripples.devel.redhat.com) (gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-26)) #1 SMP Thu Jan 8 17:08:56 EST 2004
[6.] A small shell script or sample program which triggers the problem (if possible)
For problem (A) under 2 above, compile the following with
gcc -o foo -g ...
Then run under a recent GDB (precise version seems to be irrelevant), and send the inferior process a SIGUSR1 from another shell. The inferior responds, but GDB (which has ptraced the inferior and is waitpid'ing on it) does not notice the signal.
#include <stdio.h> #include <signal.h>
int main (void) { sigset_t blocked; sigset_t waitFor;
sigfillset (&blocked); sigprocmask (SIG_BLOCK, &blocked, NULL);
sigemptyset (&waitFor); sigaddset (&waitFor, SIGUSR1); sigaddset (&waitFor, SIGINT);
while (1) { int rsig, status; rsig = 0; status = sigwait (&waitFor, &rsig); fprintf (stderr, "Waiting for %d, received %d, status %d\n", SIGUSR1, rsig, status); if (rsig == SIGINT) exit (0); }
}
---------------
For problem (B) under 2 above, compile the following with
gcc -o foo -g ... -lpthread
and try to run the program under GDB. foo's call to sigwait will return with EINTR (which it does not do otherwise). Presumably, this is in response to ptrace calls issued from within GDB.
#include <stdio.h> #include <signal.h> #include <unistd.h> #include <pthread.h>
void* signal_wait (void *sig0) { int sig = (int) sig0; sigset_t waitFor; sigemptyset (&waitFor); sigaddset (&waitFor, sig); while (1) { int rsig, status; rsig = 0; status = sigwait (&waitFor, &rsig); fprintf (stderr, "Waiting for %d, received %d, status %d\n", sig, rsig, status); } return NULL; }
int main (void) { pthread_t thr1, thr2; sigset_t blocked;
sigemptyset (&blocked); sigaddset (&blocked, SIGUSR1); sigaddset (&blocked, SIGUSR2);
sigprocmask (SIG_BLOCK, &blocked, NULL);
pthread_create (&thr1, NULL, signal_wait, (void*) SIGUSR1); pthread_create (&thr2, NULL, signal_wait, (void*) SIGUSR2);
while (1) sleep (10);
return 0; }
[7.] Environment [7.1.] Software (add the output of the ver_linux script here)
Gnu C 3.2.3 Gnu make 3.79.1 binutils 2.14.90.0.4 util-linux 2.11y mount 2.11y module-init-tools writing e2fsprogs 1.32 jfsutils 1.1.2 pcmcia-cs 3.1.31 quota-tools 3.09. PPP 2.4.1 isdn4k-utils 3.1pre4 nfs-utils 1.0.5 Linux C Library 2.3.2 Dynamic linker (ldd) 2.3.2 Procps 2.0.13 Net-tools 1.60 Kbd 1.08 Sh-utils 4.5.3 Modules Loaded i810_audio ac97_codec soundcore ide-cd cdrom nfsd parport_pc lp parport nfs lockd sunrpc e1000 ipt_REJECT iptable_filter ip_tables sg microcode loop keybdev mousedev hid input ehci-hcd usb-uhci usbcore ext3 jbd lvm-mod ata_piix libata sd_mod scsi_mod
[7.2.] Processor information (from /proc/cpuinfo): processor : 0 vendor_id : GenuineIntel cpu family : 15 model : 2 model name : Intel(R) Pentium(R) 4 CPU 3.20GHz stepping : 9 cpu MHz : 3192.064 cache size : 512 KB physical id : 0 siblings : 2 runqueue : 0 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm bogomips : 6370.09
processor : 1 vendor_id : GenuineIntel cpu family : 15 model : 2 model name : Intel(R) Pentium(R) 4 CPU 3.20GHz stepping : 9 cpu MHz : 3192.064 cache size : 512 KB physical id : 0 siblings : 2 runqueue : 0 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm bogomips : 6383.20
[X.] Other notes, patches, fixes, workarounds:
I have received a report, which I have not personally confirmed, that a 2.6.0-pre kernel has the same behavior.
Paul Hilfinger Ada Core Technologies, Inc. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |