HandBrake/macosx/HBApplication.m
2023-03-25 10:00:07 +01:00

65 lines
2.2 KiB
Objective-C

/* HBApplication.m $
This file is part of the HandBrake source code.
Homepage: <http://handbrake.fr/>.
It may be used under the terms of the GNU General Public License. */
#import "HBApplication.h"
#import "HBExceptionAlertController.h"
@import HandBrakeKit;
@implementation HBApplication
static void CrashMyApplication(void)
{
*(char *)0x08 = 1;
}
- (NSAttributedString *)_formattedExceptionBacktrace:(NSArray *)backtrace
{
NSMutableAttributedString *result = [[NSMutableAttributedString alloc] init];
for (__strong NSString *s in backtrace)
{
s = [s stringByAppendingString:@"\n"];
NSAttributedString *attrS = [[NSAttributedString alloc] initWithString:s];
[result appendAttributedString:attrS];
}
[result addAttribute:NSFontAttributeName value:[NSFont fontWithName:@"Monaco" size:10] range:NSMakeRange(0, result.length)];
return result;
}
- (void)reportException:(NSException *)exception
{
// NSApplication simply logs the exception to the console. We want to let the user know
// when it happens in order to possibly prevent subsequent random crashes that are difficult to debug
@try
{
@autoreleasepool
{
// Create a string based on the exception
NSString *exceptionMessage = [NSString stringWithFormat:@"%@\nReason: %@\nUser Info: %@", exception.name, exception.reason, exception.userInfo];
// Always log to console for history
[HBUtilities writeToActivityLog:"Exception raised:\n%s", exceptionMessage.UTF8String];
[HBUtilities writeToActivityLog:"Backtrace:\n%s", exception.callStackSymbols.description.UTF8String];
HBExceptionAlertController *alertController = [[HBExceptionAlertController alloc] init];
alertController.exceptionMessage = exceptionMessage;
alertController.exceptionBacktrace = [self _formattedExceptionBacktrace:exception.callStackSymbols];
NSInteger result = [alertController runModal];
if (result == HBExceptionAlertControllerResultCrash)
{
CrashMyApplication();
}
}
}
@catch (NSException *e)
{
// Suppress any exceptions raised in the handling
}
}
@end