struct sigaction newSignalAction;
memset(&newSignalAction, 0, sizeof(newSignalAction));
newSignalAction.sa_handler = &SignalHandler;
sigaction(SIGSEGV, &newSignalAction, NULL);
[TestFlight takeOff:@"etc etc etc"];
Then
void SignalHandler(int sig) {
NSLog(@"Boom");
}
I tried to perform a SIGSEGV
signal:
int *p = NULL;
*p = 1;
But my handler is not called. Instead, Xcode points out the line *p = 1
.
I have read that you can't print stuff with a signal handler. Maybe that's the problem. What can I do then? I heard that you're supposed to save data - so I guess I can create files in the Documents directory. I tried to do that, too, but the files are not created either.
To a close approximation you can't do anything in a signal handler. The problem is that the code interrupted by the signal might be holding locks. If your handler tries to take the same locks then it deadlocks.
The sigaction
man page lists the functions that are officially approved for use in a signal handler. The list is short. Neither NSLog()
nor Objective-C method dispatch is in that list.
However, if NSLog()
doesn't deadlock then it should print output as usual. Perhaps your crash is SIGBUS
instead of SIGSEGV
. Perhaps the compiler optimizer is transforming your *NULL=1
so that it crashes in a different way. Perhaps TestFlight installs its own signal handler that replaces your signal handler.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With