MacOSX/Framework/VLCExceptionHandler.m: Minor adjustement of the Exception window.
[vlc.git] / extras / MacOSX / VLC_app / Sources / VLCExceptionHandler.m
1 /*****************************************************************************
2  * VLCExceptionHandler.m: VLCExceptionHandler implementation
3  *****************************************************************************
4  * Copyright (C) 2007 Pierre d'Herbemont
5  * Copyright (C) 2007 the VideoLAN team
6  * $Id$
7  *
8  * Authors: Pierre d'Herbemont <pdherbemont # videolan.org>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 #import "VLCExceptionHandler.h"
26 #import <ExceptionHandling/ExceptionHandling.h>
27
28
29 @implementation VLCExceptionHandler
30 + (void)load
31 {
32     [[NSExceptionHandler defaultExceptionHandler] setDelegate:[[VLCExceptionHandler alloc] init]];
33  
34     [[NSExceptionHandler defaultExceptionHandler] setExceptionHandlingMask:
35                 0xffff /* Catch all */ ];
36
37     [[NSExceptionHandler defaultExceptionHandler] setExceptionHangingMask:
38                 NSHangOnUncaughtExceptionMask|
39                 NSHangOnUncaughtSystemExceptionMask|
40                 NSHangOnUncaughtRuntimeErrorMask|
41                 NSHangOnTopLevelExceptionMask|
42                 NSHangOnOtherExceptionMask];
43 }
44
45 /* From Apple's guide on exception */
46 - (BOOL)exceptionHandler:(NSExceptionHandler *)sender shouldLogException:(NSException *)exception mask:(unsigned int)aMask
47 {
48     [self printStackTrace:exception];
49     NSRunCriticalAlertPanel(@"Exception not handled!",
50                             [NSString stringWithFormat:@"%@: %@\n\nBack trace has been printed to Console.\n\nWe will now wait for debugger connection...\n",
51                                 [exception name], [exception reason]],
52                             @"Wait Debugger", nil, nil);
53     return YES;
54 }
55
56 - (void)printStackTrace:(NSException *)e
57 {
58     NSString *stack = [[e userInfo] objectForKey:NSStackTraceKey];
59     if (!stack)
60     {
61         NSLog(@"No stack trace available.");
62         return;
63     }
64
65     NSTask *ls = [[NSTask alloc] init];
66     NSString *pid = [[NSNumber numberWithInt:[[NSProcessInfo processInfo] processIdentifier]] stringValue];
67     NSMutableArray *args = [NSMutableArray arrayWithCapacity:20];
68
69     [args addObject:@"-p"];
70     [args addObject:pid];
71     [args addObjectsFromArray:[stack componentsSeparatedByString:@"  "]];
72     /* Note: function addresses are separated by double spaces, not a single space. */
73
74     [ls setLaunchPath:@"/usr/bin/atos"];
75     [ls setArguments:args];
76     [ls launch];
77     [ls release];
78 }
79
80 @end