mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-22 04:55:50 -04:00

In NativeProcessLinux::MonitorSIGTRAP we were asserting that the si_code value is one of the codes we know about. However, that list was very incomplete -- for example, we were not handling SI_TKILL/SI_USER, generated by raise(SIGTRAP). A cursory examination show there are at least a dozen codes like these that an app can generate, and more can be added at any point. So, instead of trying to play catchup, I change the default behavior to treat an unknown si_code like an ordinary signal. The only reason we needed to inspect si_code in the first place is because watchpoint/breakpoints are notified as SIGTRAP, but we already know about those, and us starting to use a new debug event is far less likely than somebody introducing a new non-debug event. I add a test case to TestRaise to verify we are handling raise(SIGTRAP) in an application properly. llvm-svn: 307644
50 lines
907 B
C
50 lines
907 B
C
#include <signal.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
void handler(int signo)
|
|
{
|
|
_exit(signo);
|
|
}
|
|
|
|
int main (int argc, char *argv[])
|
|
{
|
|
if (signal(SIGTRAP, handler) == SIG_ERR)
|
|
{
|
|
perror("signal(SIGTRAP)");
|
|
return 1;
|
|
}
|
|
#ifndef __APPLE__
|
|
// Real time signals not supported on apple platforms.
|
|
if (signal(SIGRTMIN, handler) == SIG_ERR)
|
|
{
|
|
perror("signal(SIGRTMIN)");
|
|
return 1;
|
|
}
|
|
#endif
|
|
|
|
if (argc < 2)
|
|
{
|
|
puts("Please specify a signal to raise");
|
|
return 1;
|
|
}
|
|
|
|
if (strcmp(argv[1], "SIGSTOP") == 0)
|
|
raise(SIGSTOP);
|
|
else if (strcmp(argv[1], "SIGTRAP") == 0)
|
|
raise(SIGTRAP);
|
|
#ifndef __APPLE__
|
|
else if (strcmp(argv[1], "SIGRTMIN") == 0)
|
|
raise(SIGRTMIN);
|
|
#endif
|
|
else
|
|
{
|
|
printf("Unknown signal: %s\n", argv[1]);
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|