Hello Eugene, thanks for diagnosing this issue. I will commit something similar to LLDB shortly.
cheers, pl On 19 May 2015 at 19:52, Eugene Birukov <eugen...@hotmail.com> wrote: > Hello, > > I debugged signal processing a bit, and I think that the right solution > would be just to add these signals to the list of known signals. I.e. in > LinuxSignals.cpp: > > void > LinuxSignals::Reset() > { > m_signals.clear(); > AddSignal (1, "SIGHUP", "HUP", false, true , true , > "hangup"); > AddSignal (2, "SIGINT", "INT", true , true , true , > "interrupt"); > AddSignal (3, "SIGQUIT", "QUIT", false, true , true , "quit"); > AddSignal (4, "SIGILL", "ILL", false, true , true , "illegal > instruction"); > AddSignal (5, "SIGTRAP", "TRAP", true , true , true , "trace > trap (not reset when caught)"); > AddSignal (6, "SIGABRT", "ABRT", false, true , true , > "abort()"); > AddSignal (6, "SIGIOT", "IOT", false, true , true , "IOT > trap"); > AddSignal (7, "SIGBUS", "BUS", false, true , true , "bus > error"); > AddSignal (8, "SIGFPE", "FPE", false, true , true , > "floating point exception"); > AddSignal (9, "SIGKILL", "KILL", false, true , true , "kill"); > AddSignal (10, "SIGUSR1", "USR1", false, true , true , "user > defined signal 1"); > AddSignal (11, "SIGSEGV", "SEGV", false, true , true , > "segmentation violation"); > AddSignal (12, "SIGUSR2", "USR2", false, true , true , "user > defined signal 2"); > AddSignal (13, "SIGPIPE", "PIPE", false, true , true , "write > to pipe with reading end closed"); > AddSignal (14, "SIGALRM", "ALRM", false, false, false, > "alarm"); > AddSignal (15, "SIGTERM", "TERM", false, true , true , > "termination requested"); > AddSignal (16, "SIGSTKFLT", "STKFLT", false, true , true , "stack > fault"); > AddSignal (16, "SIGCLD", "CLD", false, false, true , "same as > SIGCHLD"); > AddSignal (17, "SIGCHLD", "CHLD", false, false, true , "child > status has changed"); > AddSignal (18, "SIGCONT", "CONT", false, true , true , "process > continue"); > AddSignal (19, "SIGSTOP", "STOP", true , true , true , "process > stop"); > AddSignal (20, "SIGTSTP", "TSTP", false, true , true , "tty > stop"); > AddSignal (21, "SIGTTIN", "TTIN", false, true , true , > "background tty read"); > AddSignal (22, "SIGTTOU", "TTOU", false, true , true , > "background tty write"); > AddSignal (23, "SIGURG", "URG", false, true , true , "urgent > data on socket"); > AddSignal (24, "SIGXCPU", "XCPU", false, true , true , "CPU > resource exceeded"); > AddSignal (25, "SIGXFSZ", "XFSZ", false, true , true , "file > size limit exceeded"); > AddSignal (26, "SIGVTALRM", "VTALRM", false, true , true , "virtual > time alarm"); > AddSignal (27, "SIGPROF", "PROF", false, false, false, > "profiling time alarm"); > AddSignal (28, "SIGWINCH", "WINCH", false, true , true , "window > size changes"); > AddSignal (29, "SIGPOLL", "POLL", false, true , true , > "pollable event"); > AddSignal (29, "SIGIO", "IO", false, true , true , > "input/output ready"); > AddSignal (30, "SIGPWR", "PWR", false, true , true , "power > failure"); > AddSignal (31, "SIGSYS", "SYS", false, true , true , "invalid > system call"); > > // Add real-time signals > for (int rtsig = SIGRTMIN + 1; rtsig < SIGRTMAX; ++rtsig) > { > char signame[16]; > char sigdescr[64]; > ::snprintf(signame, sizeof(signame), "SIG%d", rtsig); > ::snprintf(sigdescr, sizeof(sigdescr), "Real-time event %d", rtsig); > AddSignal (rtsig, signame, signame, false, true, true, sigdescr); > } > } > > Thanks, > Eugene > ________________________________ > From: eugen...@hotmail.com > To: lldb-dev@cs.uiuc.edu > Date: Tue, 19 May 2015 10:22:14 -0700 > Subject: [lldb-dev] LLDB 3.7 swallows real-time signals > > > Hi, > > I have a simple program that uses real-time signals on Linux Ubuntu 14.04: > > > $ cat rt.cpp > #include <iostream> > #include <sys/mman.h> > #include <signal.h> > #include <assert.h> > #include <sys/types.h> > #include <unistd.h> > > void handler(int sig, siginfo_t* info, void* context) > { > std::cout << "signal " << sig << " received with value " << > info->si_value.sival_in << "\n"; > } > int main() > { > int signo = SIGRTMIN + 1; > if (SIGRTMAX > SIGRTMIN) > { > struct sigaction action; > action.sa_sigaction = handler; > action.sa_flags = SA_SIGINFO; > sigaction(signo, &action, NULL); > for (int i = 0; i < 3; ++i) > { > sigval value; > value.sival_int = i + 10; > sigqueue(getpid(), signo, value); > } > } > else > { > std::cerr << "real-time signals not supported"; > } > } > > This program works correctly standalone. GDB is capable of intercepting this > signal and continue. LLDB-3.6 that I installed using apt-get does not > intercept the signal but the program still receives it. But LLDB 3.7 that I > built from sources from http://llvm.org/svn/llvm-project/lldb/trunk simply > swallows the signals. I think GDB behavior is the best option, but I could > live with 3.6 behavior. > > Is this a known problem? Is there a workaround or fix I can apply locally? > > Thanks, > Eugene > > $ cat rt.cpp > #include <iostream> > #include <sys/mman.h> > #include <signal.h> > #include <assert.h> > #include <sys/types.h> > #include <unistd.h> > > void handler(int sig, siginfo_t* info, void* context) > { > std::cout << "signal " << sig << " received with value " << > info->si_value.sival_in << "\n"; > } > > int main() > { > int signo = SIGRTMIN + 1; > if (SIGRTMAX > SIGRTMIN) > { > struct sigaction action; > action.sa_sigaction = handler; > action.sa_flags = SA_SIGINFO; > sigaction(signo, &action, NULL); > for (int i = 0; i < 3; ++i) > { > sigval value; > value.sival_int = i + 10; > sigqueue(getpid(), signo, value); > } > } > else > { > std::cerr << "real-time signals are not supported"; > } > } > > $ ./rt > signal 35 received with value 10 > signal 35 received with value 11 > signal 35 received with value 12 > > $ ~/llvm/bin/lldb ./rt > (lldb) target create "./rt" > Current executable set to './rt' (x86_64). > (lldb) pr lau > Process 18697 launched: './rt' (x86_64) > Process 18697 exited with status = 0 (0x00000000) > (lldb) q > > $ lldb-3.6 ./rt > (lldb) target create "./rt" > Current executable set to './rt' (x86_64). > (lldb) pr lau > Process 18674 launching > Process 18674 launched: './rt' (x86_64) > signal 35 received with value 10 > signal 35 received with value 11 > signal 35 received with value 12 > Process 18674 exited with status = 0 (0x00000000) > (lldb) q > > $ gdb --quiet ./rt > Reading symbols from ./rt...done. > (gdb) r > Starting program: /home/eugene/Z/tmp/rt > Program received signal SIG35, Real-time event 35. > 0x00007ffff722cfc4 in __sigqueue (pid=18662, sig=35, val=...) at > ../sysdeps/unix/sysv/linux/sigqueue.c:46 > 46 ../sysdeps/unix/sysv/linux/sigqueue.c: No such file or directory. > (gdb) c > Continuing. > signal 35 received with value 10 > Program received signal SIG35, Real-time event 35. > 0x00007ffff722cfc4 in __sigqueue (pid=18662, sig=35, val=...) at > ../sysdeps/unix/sysv/linux/sigqueue.c:46 > 46 in ../sysdeps/unix/sysv/linux/sigqueue.c > (gdb) c > Continuing. > signal 35 received with value 11 > Program received signal SIG35, Real-time event 35. > 0x00007ffff722cfc4 in __sigqueue (pid=18662, sig=35, val=...) at > ../sysdeps/unix/sysv/linux/sigqueue.c:46 > 46 in ../sysdeps/unix/sysv/linux/sigqueue.c > (gdb) c > Continuing. > signal 35 received with value 12 > [Inferior 1 (process 18662) exited normally] > (gdb) q > > > _______________________________________________ lldb-dev mailing list > lldb-dev@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev > > _______________________________________________ > lldb-dev mailing list > lldb-dev@cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev > _______________________________________________ lldb-dev mailing list lldb-dev@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev