├── screenshots ├── Memory_screen.png ├── product_menu.png ├── Details_screen.png └── Symbolicate_screen.png ├── SymbolicationPlugin ├── down_arrow.png ├── MainWindow.h ├── RootController.h ├── DetailsController.h ├── SymbolicateMemory.h ├── NSObject_Extension.h ├── Info.plist ├── MainWindow.m ├── SymbolicationPlugin.h ├── NSObject_Extension.m ├── MainWindow.xib ├── CommonController.h ├── resymbolicate ├── SymbolicationPlugin.m ├── CommonController.m ├── DetailsController.m ├── SymbolicateMemory.m ├── DetailsController.xib ├── RootController.m ├── SymbolicateMemory.xib └── RootController.xib ├── .gitignore ├── LICENSE ├── README.md └── SymbolicationPlugin.xcodeproj ├── xcshareddata └── xcschemes │ └── SymbolicationPlugin.xcscheme └── project.pbxproj /screenshots/Memory_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaheshRS/symbolication-plugin/HEAD/screenshots/Memory_screen.png -------------------------------------------------------------------------------- /screenshots/product_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaheshRS/symbolication-plugin/HEAD/screenshots/product_menu.png -------------------------------------------------------------------------------- /screenshots/Details_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaheshRS/symbolication-plugin/HEAD/screenshots/Details_screen.png -------------------------------------------------------------------------------- /SymbolicationPlugin/down_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaheshRS/symbolication-plugin/HEAD/SymbolicationPlugin/down_arrow.png -------------------------------------------------------------------------------- /screenshots/Symbolicate_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaheshRS/symbolication-plugin/HEAD/screenshots/Symbolicate_screen.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | Plugin/SymbolicationPlugin.xcodeproj/project.xcworkspace/xcuserdata/ShanbhagMahesh.xcuserdatad/UserInterfaceState.xcuserstate 2 | Plugin/SymbolicationPlugin.xcodeproj/project.xcworkspace/xcshareddata/SymbolicationPlugin.xccheckout 3 | .DS_Store 4 | SymbolicationPlugin.xcodeproj/project.xcworkspace/contents.xcworkspacedata 5 | SymbolicationPlugin.xcodeproj/project.xcworkspace/xcshareddata/SymbolicationPlugin.xccheckout 6 | SymbolicationPlugin.xcodeproj/project.xcworkspace/xcuserdata/ShanbhagMahesh.xcuserdatad/UserInterfaceState.xcuserstate 7 | SymbolicationPlugin.xcodeproj/xcuserdata/ShanbhagMahesh.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist 8 | SymbolicationPlugin.xcodeproj/xcuserdata/ShanbhagMahesh.xcuserdatad/xcschemes/xcschememanagement.plist 9 | SymbolicationPlugin.xcodeproj/project.xcworkspace/xcuserdata/maheshshanbhag.xcuserdatad/UserInterfaceState.xcuserstate 10 | SymbolicationPlugin.xcodeproj/xcuserdata/maheshshanbhag.xcuserdatad/xcschemes/xcschememanagement.plist -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Mahesh R Shanbhag 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /SymbolicationPlugin/MainWindow.h: -------------------------------------------------------------------------------- 1 | // 2 | // MainWindow.h 3 | // SymbolicationPlugin 4 | // 5 | // The MIT License (MIT) 6 | // 7 | // Copyright (c) 2015 Mahesh R Shanbhag 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | #import 28 | 29 | @interface MainWindow : NSWindowController 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /SymbolicationPlugin/RootController.h: -------------------------------------------------------------------------------- 1 | // 2 | // RootController.h 3 | // SymbolicationPlugin 4 | // 5 | // The MIT License (MIT) 6 | // 7 | // Copyright (c) 2015 Mahesh R Shanbhag 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | #import 28 | #import "CommonController.h" 29 | 30 | @interface RootController : CommonController 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /SymbolicationPlugin/DetailsController.h: -------------------------------------------------------------------------------- 1 | // 2 | // DetailsController.h 3 | // SymbolicationPlugin 4 | // 5 | // The MIT License (MIT) 6 | // 7 | // Copyright (c) 2015 Mahesh R Shanbhag 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | #import 28 | #import "CommonController.h" 29 | 30 | @interface DetailsController : CommonController 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /SymbolicationPlugin/SymbolicateMemory.h: -------------------------------------------------------------------------------- 1 | // 2 | // SymbolicateMemory.h 3 | // SymbolicationPlugin 4 | // 5 | // The MIT License (MIT) 6 | // 7 | // Copyright (c) 2015 Mahesh R Shanbhag 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | #import 28 | #import "CommonController.h" 29 | 30 | @interface SymbolicateMemory : CommonController 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /SymbolicationPlugin/NSObject_Extension.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject_Extension.h 3 | // SymbolicationPlugin 4 | // 5 | // The MIT License (MIT) 6 | // 7 | // Copyright (c) 2015 Mahesh R Shanbhag 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | #import 28 | 29 | @interface NSObject (Xcode_Plugin_Template_Extension) 30 | 31 | + (void)pluginDidLoad:(NSBundle *)plugin; 32 | 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /SymbolicationPlugin/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | BNDL 19 | CFBundleShortVersionString 20 | 0.1 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | DVTPlugInCompatibilityUUIDs 26 | 27 | ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C 28 | F41BD31E-2683-44B8-AE7F-5F09E919790E 29 | 7265231C-39B4-402C-89E1-16167C4CC990 30 | 0420B86A-AA43-4792-9ED0-6FE0F2B16A13 31 | 7FDF5C7A-131F-4ABB-9EDC-8C5F8F0B8A90 32 | C4A681B0-4A26-480E-93EC-1218098B9AA0 33 | AD68E85B-441B-4301-B564-A45E4919A6AD 34 | A16FF353-8441-459E-A50C-B071F53F51B7 35 | 9F75337B-21B4-4ADC-B558-F9CADF7073A7 36 | E969541F-E6F9-4D25-8158-72DC3545A6C6 37 | 38 | LSMinimumSystemVersion 39 | $(MACOSX_DEPLOYMENT_TARGET) 40 | NSPrincipalClass 41 | SymbolicationPlugin 42 | XC4Compatible 43 | 44 | XCPluginHasUI 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /SymbolicationPlugin/MainWindow.m: -------------------------------------------------------------------------------- 1 | // 2 | // MainWindow.m 3 | // SymbolicationPlugin 4 | // 5 | // The MIT License (MIT) 6 | // 7 | // Copyright (c) 2015 Mahesh R Shanbhag 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | #import "MainWindow.h" 28 | 29 | NSString *const kSymbolicateWindowTitle = @"Symbolicate"; 30 | 31 | @interface MainWindow () 32 | 33 | @property (weak) IBOutlet NSView *mainView; 34 | 35 | @end 36 | 37 | @implementation MainWindow 38 | 39 | - (void)windowDidLoad { 40 | [super windowDidLoad]; 41 | // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. 42 | 43 | // window title 44 | self.window.title = kSymbolicateWindowTitle; 45 | } 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /SymbolicationPlugin/SymbolicationPlugin.h: -------------------------------------------------------------------------------- 1 | // 2 | // SymbolicationPlugin.h 3 | // SymbolicationPlugin 4 | // 5 | // The MIT License (MIT) 6 | // 7 | // Copyright (c) 2015 Mahesh R Shanbhag 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | 28 | #import 29 | #import "MainWindow.h" 30 | 31 | @class SymbolicationPlugin; 32 | 33 | static SymbolicationPlugin *sharedPlugin; 34 | static NSString *kSymbolicationPluginBundleIdentifier = @"com.mahesh.SymbolicationPlugin"; 35 | 36 | @interface SymbolicationPlugin : NSObject 37 | 38 | @property (nonatomic, strong, readonly) NSBundle* bundle; 39 | @property (nonatomic, strong) MainWindow* mainWindowController; 40 | 41 | + (instancetype)sharedPlugin; 42 | - (id)initWithBundle:(NSBundle *)plugin; 43 | 44 | @end -------------------------------------------------------------------------------- /SymbolicationPlugin/NSObject_Extension.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject_Extension.m 3 | // SymbolicationPlugin 4 | // 5 | // The MIT License (MIT) 6 | // 7 | // Copyright (c) 2015 Mahesh R Shanbhag 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | 28 | #import "NSObject_Extension.h" 29 | #import "SymbolicationPlugin.h" 30 | 31 | @implementation NSObject (Xcode_Plugin_Template_Extension) 32 | 33 | + (void)pluginDidLoad:(NSBundle *)plugin { 34 | static dispatch_once_t onceToken; 35 | NSString *currentApplicationName = [[NSBundle mainBundle] infoDictionary][@"CFBundleName"]; 36 | if ([currentApplicationName isEqual:@"Xcode"]) { 37 | dispatch_once(&onceToken, ^{ 38 | sharedPlugin = [[SymbolicationPlugin alloc] initWithBundle:plugin]; 39 | }); 40 | } 41 | } 42 | @end 43 | -------------------------------------------------------------------------------- /SymbolicationPlugin/MainWindow.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /SymbolicationPlugin/CommonController.h: -------------------------------------------------------------------------------- 1 | // 2 | // CommonController.h 3 | // SymbolicationPlugin 4 | // 5 | // The MIT License (MIT) 6 | // 7 | // Copyright (c) 2015 Mahesh R Shanbhag 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | #import 28 | #import "SymbolicationPlugin.h" 29 | 30 | @interface CommonController : NSViewController 31 | 32 | @property (nonatomic, strong) NSMutableData *taskOutput; 33 | @property (nonatomic, strong) NSTask *task; 34 | 35 | // Alert to be shown 36 | - (void)showAlertWithTitle:(NSString *)text message:(NSString *)message; 37 | 38 | //Task Methods 39 | - (void)startTask; 40 | 41 | - (NSArray *)getArgumentsForTask:(NSTask *)task; 42 | - (NSString *)getLaunchPathForTask:(NSTask *)task; 43 | - (NSString *)getCurrentDirectoryForTask:(NSTask *)task; 44 | 45 | // Task Utils 46 | - (void)setUpShellOutputForTask:(NSTask *)task; 47 | - (void)setUpStdErrorOutputForTask:(NSTask *)task; 48 | - (void)setUpTerminationHandlerForTask:(NSTask *)task completion:(void(^)(NSString *taskOutput, NSError *error))completion; 49 | - (void)tryToLaunchTask:(NSTask *)shellTask completionIfFailed:(void(^)(NSString *taskOutput, NSError *error))completion; 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # symbolication-plugin 2 | Symbolication project enables `Symbolicate` Xcode plugin. This plugin is available in Product menu and is named 'Symbolicate'. 3 | 4 | * Symbolicate Plugin is used to symbolicate crashes. If `dSYM file` and `crash file` is available, the crash can be symbolicated using the Plugin. 5 | * 1.0 (0.1) 6 | 7 | ![Product Menu](https://raw.githubusercontent.com/MaheshRS/symbolication-plugin/master/screenshots/product_menu.png "Produce Menu") 8 | 9 | ### How do I get set up? ## 10 | 11 | * Open the SymbolicationPlugin project 12 | * cmd + k (clean the project) 13 | * cmd + b (build the project) 14 | * ta-da! the plugin is installed 15 | 16 | ### How to check if the plugin is installed 17 | * Open Terminal 18 | * Navigate to ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins directory 19 | * Type ls -l 20 | * `SymbolicationPlugin.xcplugin` should be listed in the installed plug-in's list. 21 | 22 | ### Requirements 23 | To use the complete features of the Plugin the following files are required. 24 | 25 | * The application bundle (application.app file). 26 | * The dSYM file associated with the build. 27 | * The application unix executable file for the available inside the application.app bundle (application.app/application). 28 | 29 | ### How to use the Plugin? 30 | Below are the details of using the three sections of the plugin `Symbolicate`, `Details` and `Memory` 31 | 32 | #### Symbolicating crash file 33 | Use the `Symbolicate` tab to symbolicate the crash log. 34 | 35 | * Select the dSYM file from the disk. 36 | * Select the the crash file from the disk. 37 | * Select Symbolicate. The plugin begins symbolicating the crash. 38 | 39 | Note: Additionally you can save the crash file by clicking at the down arrow at the bottom left of the screen. 40 | 41 | ![Symbolicate](https://raw.githubusercontent.com/MaheshRS/symbolication-plugin/master/screenshots/Symbolicate_screen.png "Symbolicate Section") 42 | 43 | #### Checking the application details 44 | Used the `Details` tab to get the build information. 45 | 46 | * Select the application executable file (Unix executable file) available inside the application.app bundle (application.app/application). 47 | * The details of the application like the build UUID, the build architecture is displayed. 48 | 49 | ![Details](https://raw.githubusercontent.com/MaheshRS/symbolication-plugin/master/screenshots/Details_screen.png "Details Section") 50 | 51 | #### Symbolicating memory references available in the crash file 52 | Used the `Mmeory` tab to symbolicate memory references 53 | 54 | * Select the application executable file (Unix executable file) available inside the application.app bundle (application.app/application). 55 | * List down the memory addresses a single space saperated list. 56 | * Select the architecture (This can be found using the above 'Details' section). 57 | * Select Symbolicate. The Plugin displayes the symbolicated memory reference. 58 | 59 | ![Memory](https://raw.githubusercontent.com/MaheshRS/symbolication-plugin/master/screenshots/Memory_screen.png "Memory Section") 60 | 61 | ### Contribution guidelines ## 62 | Wanna contribute? Great! Fork the repository and send pull request's to the development branch. 63 | -------------------------------------------------------------------------------- /SymbolicationPlugin.xcodeproj/xcshareddata/xcschemes/SymbolicationPlugin.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 46 | 47 | 48 | 49 | 61 | 64 | 65 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /SymbolicationPlugin/resymbolicate: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # The MIT License (MIT) 4 | # 5 | # Copyright (c) 2015 Mahesh R Shanbhag 6 | # 7 | # Permission is hereby granted, free of charge, to any person obtaining a copy 8 | # of this software and associated documentation files (the "Software"), to deal 9 | # in the Software without restriction, including without limitation the rights 10 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | # copies of the Software, and to permit persons to whom the Software is 12 | # furnished to do so, subject to the following conditions: 13 | # 14 | # The above copyright notice and this permission notice shall be included in all 15 | # copies or substantial portions of the Software. 16 | # 17 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 | # SOFTWARE. 24 | 25 | shopt -s expand_aliases 26 | 27 | crash_file_path="$1" #the first argument of the command: This is the *.crash file path 28 | debug_symbols_path="$2" #the second argument of the command: This is the *.app.dSYM debug symbol file path 29 | destination_file_path="$3" #the third argument of the command: This is the destination file path. 30 | xcode_developer_directory_path=$(xcode-select -p) 31 | symbolicateCrashPath=$symbolicatecrash 32 | symbolicatecrash_root_path=${xcode_developer_directory_path::${#xcode_developer_directory_path}-18} 33 | 34 | function startCrashSymbolication { 35 | if [ -n "$destination_file_path" ]; then 36 | $symbolicateCrashPath "$crash_file_path" "$debug_symbols_path" > $destination_file_path 37 | else 38 | $symbolicateCrashPath "$crash_file_path" "$debug_symbols_path" >&2 39 | fi 40 | exit 0 41 | } 42 | 43 | function symbolicateCrash { 44 | if [ -n "$symbolicateCrashPath" ]; then 45 | # here we have found the path to symbolicatecrash.pl script 46 | alias symbolicatecrash="$symbolicateCrashPath" # set path to the symbolicatecrash.pl script 47 | startCrashSymbolication # start symbolicating 48 | else 49 | # get the path to symbolicatecrash.pl script 50 | symbolicateCrashPath=$(find $symbolicatecrash_root_path -name symbolicatecrash -type f) 51 | alias symbolicatecrash="$symbolicateCrashPath" # set path to the symbolicatecrash.pl script 52 | startCrashSymbolication # start symbolicating 53 | fi 54 | } 55 | 56 | function prepareToResymbolicate { 57 | if [ -n "$xcode_developer_directory_path" ]; then 58 | export DEVELOPER_DIR=$xcode_developer_directory_path 59 | symbolicateCrash; 60 | else 61 | echo "ERROR: Xcode Command line tools are not available" 62 | exit 1 # command line tools is necessary 63 | fi 64 | } 65 | 66 | function setupActiveDeveloperDirectory { 67 | if [ -n "$DEVELOPER_DIR" ]; then 68 | symbolicateCrash # prepare variables to symbolicate 69 | else 70 | #developer directory not found. Search for the developer directory and export to $DEVELOPER_DIR environment variable. 71 | prepareToResymbolicate # prepare variables to symbolicate 72 | fi 73 | } 74 | 75 | #check if any options are available for eg 76 | while getopts ":u:" opt; do 77 | case $opt in 78 | u ) 79 | # we have a valid option with an argument, display the version 80 | dwarfdump -u $OPTARG 81 | exit 82 | ;; 83 | *) 84 | echo "error: Invalid option -$OPTARG"; 85 | exit 1; 86 | esac 87 | done 88 | 89 | if [ -z "$1" ]; then 90 | echo "ERROR: Path to .crash file is missing" >&2 91 | elif [ -z "$2" ]; then 92 | echo "ERROR: Path to .app.Dsym file is missing" >&2 93 | else 94 | setupActiveDeveloperDirectory 95 | fi 96 | -------------------------------------------------------------------------------- /SymbolicationPlugin/SymbolicationPlugin.m: -------------------------------------------------------------------------------- 1 | // 2 | // SymbolicationPlugin.m 3 | // SymbolicationPlugin 4 | // 5 | // The MIT License (MIT) 6 | // 7 | // Copyright (c) 2015 Mahesh R Shanbhag 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | #import "SymbolicationPlugin.h" 28 | #import "RootController.h" 29 | 30 | @interface SymbolicationPlugin() 31 | 32 | @property (nonatomic, strong, readwrite) NSBundle *bundle; 33 | @property (nonatomic, strong, readwrite) RootController *rootController; 34 | 35 | @end 36 | 37 | @implementation SymbolicationPlugin 38 | 39 | + (instancetype)sharedPlugin { 40 | return sharedPlugin; 41 | } 42 | 43 | - (id)initWithBundle:(NSBundle *)plugin { 44 | if (self = [super init]) { 45 | // reference to plugin's bundle, for resource access 46 | self.bundle = plugin; 47 | [[NSNotificationCenter defaultCenter] addObserver:self 48 | selector:@selector(didApplicationFinishLaunchingNotification:) 49 | name:NSApplicationDidFinishLaunchingNotification 50 | object:nil]; 51 | } 52 | return self; 53 | } 54 | 55 | - (void)didApplicationFinishLaunchingNotification:(NSNotification*)noti { 56 | //removeObserver 57 | [[NSNotificationCenter defaultCenter] removeObserver:self name:NSApplicationDidFinishLaunchingNotification object:nil]; 58 | 59 | // Create menu items, initialize UI, etc. 60 | NSMenuItem *menuItem = [[NSApp mainMenu] itemWithTitle:@"Product"]; 61 | if (menuItem) { 62 | [[menuItem submenu] addItem:[NSMenuItem separatorItem]]; 63 | 64 | NSMenuItem *actionMenuItem = [[NSMenuItem alloc] initWithTitle:@"Symbolicate" action:@selector(symbolicateMenuAction) keyEquivalent:@""]; 65 | [actionMenuItem setTarget:self]; 66 | [[menuItem submenu] addItem:actionMenuItem]; 67 | } 68 | } 69 | 70 | - (void)symbolicateMenuAction { 71 | NSBundle *bundle = [NSBundle bundleWithIdentifier:kSymbolicationPluginBundleIdentifier]; 72 | if([bundle pathForResource:@"RootController" ofType:@"nib"] == nil) { 73 | self.rootController = nil; 74 | self.mainWindowController = nil; 75 | 76 | NSAlert *alert = [[NSAlert alloc] init]; 77 | [alert setMessageText:@"Cannot find 'Symbolicate' plugin bundle."]; 78 | [alert setInformativeText:@"Please clean and re-build the plugin and restart Xcode to use the plugin."]; 79 | [alert runModal]; 80 | } 81 | else { 82 | 83 | if(self.mainWindowController == nil) { 84 | self.mainWindowController = [[MainWindow alloc] initWithWindowNibName:NSStringFromClass([MainWindow class])]; 85 | self.rootController = [[RootController alloc] initWithNibName:@"RootController" bundle:bundle]; 86 | self.rootController.view.bounds = [(NSView *)self.mainWindowController.window.contentView bounds]; 87 | [self.rootController.view setAutoresizingMask:(NSViewHeightSizable|NSViewWidthSizable)]; 88 | 89 | self.mainWindowController.contentViewController = self.rootController; 90 | 91 | } 92 | 93 | [self.mainWindowController.window makeKeyAndOrderFront:self]; 94 | } 95 | } 96 | 97 | - (void)dealloc { 98 | [[NSNotificationCenter defaultCenter] removeObserver:self]; 99 | } 100 | 101 | @end 102 | -------------------------------------------------------------------------------- /SymbolicationPlugin/CommonController.m: -------------------------------------------------------------------------------- 1 | // 2 | // CommonController.m 3 | // SymbolicationPlugin 4 | // 5 | // The MIT License (MIT) 6 | // 7 | // Copyright (c) 2015 Mahesh R Shanbhag 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | #import "CommonController.h" 28 | 29 | @interface CommonController () 30 | 31 | @end 32 | 33 | @implementation CommonController 34 | 35 | - (void)viewDidLoad { 36 | [super viewDidLoad]; 37 | // Do view setup here. 38 | } 39 | 40 | - (void)showAlertWithTitle:(NSString *)text message:(NSString *)message { 41 | NSAlert *alert = [[NSAlert alloc] init]; 42 | [alert setMessageText:text]; 43 | [alert setInformativeText:message]; 44 | [alert runModal]; 45 | } 46 | 47 | 48 | #pragma mark - Shell Tasks 49 | - (void)startTask { 50 | self.taskOutput = [NSMutableData new]; 51 | self.task = [NSTask new]; 52 | 53 | [self.task setCurrentDirectoryPath:[self getCurrentDirectoryForTask:self.task]]; 54 | [self.task setLaunchPath:[self getLaunchPathForTask:self.task]]; 55 | [self.task setArguments:[self getArgumentsForTask:self.task]]; 56 | 57 | [self setUpShellOutputForTask:self.task]; 58 | [self setUpStdErrorOutputForTask:self.task]; 59 | } 60 | 61 | 62 | - (NSArray *)getArgumentsForTask:(NSTask *)task { 63 | return @[]; 64 | } 65 | 66 | - (NSString *)getLaunchPathForTask:(NSTask *)task { 67 | return @""; 68 | } 69 | 70 | - (NSString *)getCurrentDirectoryForTask:(NSTask *)task { 71 | NSBundle *bundle = [NSBundle bundleWithIdentifier:kSymbolicationPluginBundleIdentifier]; 72 | return bundle.bundlePath; 73 | } 74 | 75 | #pragma mark - Shell Utils 76 | - (void)setUpShellOutputForTask:(NSTask *)task { 77 | task.standardOutput = [NSPipe pipe]; 78 | [[task.standardOutput fileHandleForReading] setReadabilityHandler:^(NSFileHandle *file) { 79 | [self.taskOutput setData:[file availableData]]; 80 | }]; 81 | } 82 | 83 | - (void)setUpStdErrorOutputForTask:(NSTask *)task { 84 | task.standardError = [NSPipe pipe]; 85 | [[task.standardError fileHandleForReading] setReadabilityHandler:^(NSFileHandle *file) { 86 | [self.taskOutput appendData:[file availableData]]; 87 | }]; 88 | } 89 | 90 | - (void)setUpTerminationHandlerForTask:(NSTask *)task completion:(void(^)(NSString *taskOutput, NSError *error))completion { 91 | [task setTerminationHandler:^(NSTask *task) { 92 | 93 | [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 94 | NSString* output = [[NSString alloc] initWithData:self.taskOutput encoding:NSUTF8StringEncoding]; 95 | 96 | if (task.terminationStatus == 0) { 97 | completion(output, nil); 98 | } 99 | else { 100 | NSString* reason = [NSString stringWithFormat:@"Task exited with status %d", task.terminationStatus]; 101 | completion(output, [NSError errorWithDomain:reason code:666 userInfo:@{ NSLocalizedDescriptionKey: reason }]); 102 | } 103 | }]; 104 | 105 | [task.standardOutput fileHandleForReading].readabilityHandler = nil; 106 | [task.standardError fileHandleForReading].readabilityHandler = nil; 107 | }]; 108 | } 109 | 110 | - (void)tryToLaunchTask:(NSTask *)shellTask completionIfFailed:(void(^)(NSString *taskOutput, NSError *error))completion { 111 | @try { 112 | [shellTask launch]; 113 | } 114 | @catch (NSException *exception) { 115 | completion(nil, [NSError errorWithDomain:exception.reason code:667 userInfo:nil]); 116 | } 117 | } 118 | 119 | 120 | @end 121 | -------------------------------------------------------------------------------- /SymbolicationPlugin/DetailsController.m: -------------------------------------------------------------------------------- 1 | // 2 | // DetailsController.m 3 | // SymbolicationPlugin 4 | // 5 | // The MIT License (MIT) 6 | // 7 | // Copyright (c) 2015 Mahesh R Shanbhag 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | #import "DetailsController.h" 28 | 29 | @interface DetailsController () 30 | 31 | @property (weak) IBOutlet NSTextField *headerLbl; 32 | @property (weak) IBOutlet NSTextField *filePathTextField; 33 | @property (weak) IBOutlet NSScrollView *filePathTextView; 34 | @property (unsafe_unretained) IBOutlet NSTextView *textView; 35 | @property (weak) IBOutlet NSButton *selectBtn; 36 | 37 | 38 | @property (nonatomic, strong) NSProgressIndicator *progressIndicator; 39 | 40 | 41 | @end 42 | 43 | @implementation DetailsController 44 | 45 | - (void)viewDidLoad { 46 | [super viewDidLoad]; 47 | // Do view setup here. 48 | self.filePathTextField.enabled = NO; 49 | self.textView.editable = NO; 50 | self.textView.selectable = YES; 51 | } 52 | 53 | - (void)dealloc { 54 | [self.task terminate]; 55 | self.task = nil; 56 | 57 | [self stopProgressIndicator]; 58 | [self enableControllers:YES]; 59 | } 60 | 61 | - (IBAction)selectButtonPressed:(id)sender { 62 | // Create and configure the panel. 63 | NSOpenPanel* panel = [NSOpenPanel openPanel]; 64 | [panel setCanChooseDirectories:NO]; 65 | [panel setAllowsMultipleSelection:NO]; 66 | [panel setAllowedFileTypes:@[@"public.executable"]]; 67 | [panel setMessage:@"Import one or more files or directories."]; 68 | 69 | // Display the panel attached to the document's window. 70 | [panel beginSheetModalForWindow:self.view.window completionHandler:^(NSInteger result){ 71 | if (result == NSFileHandlingPanelOKButton) { 72 | NSArray* urls = [panel URLs]; 73 | NSURL *url = urls[0]; 74 | self.filePathTextField.stringValue = url.path; 75 | 76 | [self startTask]; 77 | } 78 | 79 | }]; 80 | 81 | } 82 | 83 | #pragma mark - NSTask 84 | - (void) startTask { 85 | 86 | [self startProgressIndicator]; 87 | [self enableControllers:NO]; 88 | 89 | self.textView.string = @""; // reset the result view 90 | 91 | [super startTask]; 92 | 93 | __typeof(self) __weak weakself = self; 94 | [self setUpTerminationHandlerForTask:self.task completion:^(NSString *taskOutput, NSError *error) { 95 | [weakself.textView setString:taskOutput]; 96 | [weakself.task terminate]; 97 | weakself.task = nil; 98 | 99 | [weakself stopProgressIndicator]; 100 | [weakself enableControllers:YES]; 101 | 102 | }]; 103 | 104 | [self tryToLaunchTask:self.task completionIfFailed:^(NSString *taskOutput, NSError *error) { 105 | [weakself.textView setString:[error localizedDescription]]; 106 | [weakself.task terminate]; 107 | weakself.task = nil; 108 | 109 | [weakself stopProgressIndicator]; 110 | [weakself enableControllers:YES]; 111 | }]; 112 | } 113 | 114 | - (NSArray *)getArgumentsForTask:(NSTask *)task { 115 | return @[@"-u",self.filePathTextField.stringValue]; 116 | } 117 | 118 | - (NSString *)getLaunchPathForTask:(NSTask *)task { 119 | return @"/usr/bin/dwarfdump"; 120 | } 121 | 122 | #pragma mark - Progress Indicator 123 | - (void)startProgressIndicator { 124 | NSProgressIndicator *indicator = [[NSProgressIndicator alloc] initWithFrame:self.filePathTextField.bounds]; 125 | indicator.style = NSProgressIndicatorSpinningStyle; 126 | indicator.autoresizingMask = NSViewWidthSizable|NSViewHeightSizable; 127 | [self.filePathTextField addSubview:indicator]; 128 | [indicator startAnimation:nil]; 129 | self.progressIndicator = indicator; 130 | } 131 | 132 | - (void)stopProgressIndicator { 133 | [self.progressIndicator stopAnimation:nil]; 134 | [self.progressIndicator removeFromSuperview]; 135 | self.progressIndicator = nil; 136 | } 137 | 138 | - (void)enableControllers:(BOOL)enable { 139 | self.selectBtn.enabled = enable; 140 | self.filePathTextField.enabled = enable; 141 | } 142 | 143 | @end 144 | -------------------------------------------------------------------------------- /SymbolicationPlugin/SymbolicateMemory.m: -------------------------------------------------------------------------------- 1 | // 2 | // SymbolicateMemory.m 3 | // SymbolicationPlugin 4 | // 5 | // The MIT License (MIT) 6 | // 7 | // Copyright (c) 2015 Mahesh R Shanbhag 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | #import "SymbolicateMemory.h" 28 | 29 | @interface SymbolicateMemory () 30 | 31 | @property (weak) IBOutlet NSTextField *dSYMFilePathLbl; 32 | @property (weak) IBOutlet NSTextField *dSYMFilePathTxtFld; 33 | @property (weak) IBOutlet NSTextField *memoryAddressLbl; 34 | @property (weak) IBOutlet NSTextField *memoryAddressTxtFld; 35 | @property (unsafe_unretained) IBOutlet NSTextView *resultTxtView; 36 | @property (weak) IBOutlet NSButton *symbolicateBtn; 37 | @property (weak) IBOutlet NSMatrix *architectureMatrix; 38 | 39 | @property (nonatomic, strong) NSProgressIndicator *progressIndicator; 40 | 41 | @property (weak) IBOutlet NSButton *selectBtn; 42 | 43 | @end 44 | 45 | @implementation SymbolicateMemory 46 | 47 | - (void)viewDidLoad { 48 | [super viewDidLoad]; 49 | // Do view setup here. 50 | self.dSYMFilePathTxtFld.editable = NO; 51 | self.resultTxtView.selectable = YES; 52 | self.resultTxtView.editable = NO; 53 | [self setUpArchitectureMatrix]; 54 | } 55 | 56 | - (void)dealloc { 57 | [self.task terminate]; 58 | self.task = nil; 59 | 60 | [self stopProgressIndicator]; 61 | [self enableControllers:YES]; 62 | } 63 | 64 | - (void)setUpArchitectureMatrix { 65 | NSArray *array = self.architectureMatrix.cells; 66 | [array[0] setTitle:@"x86_64"]; 67 | [array[1] setTitle:@"arm64"]; 68 | [array[2] setTitle:@"armv7"]; 69 | [array[3] setTitle:@"armv7s"]; 70 | } 71 | 72 | - (NSString *)valueForMatrix:(NSInteger)integer { 73 | 74 | NSString *arch = @"armv7"; 75 | switch (integer) { 76 | case 0: 77 | arch = @"x86_64"; 78 | break; 79 | case 1: 80 | arch = @"arm64"; 81 | break; 82 | case 2: 83 | arch = @"armv7"; 84 | break; 85 | case 3: 86 | arch = @"armv7s"; 87 | break; 88 | default: 89 | arch = @"armv7"; 90 | break; 91 | } 92 | 93 | return arch; 94 | } 95 | 96 | 97 | #pragma mark - Symbolicate Button Pressed 98 | - (IBAction)symbolicateBtnPressed:(NSButton *)sender { 99 | 100 | if(self.dSYMFilePathTxtFld.stringValue.length == 0) { 101 | [self showAlertWithTitle:@"Missing Executable." message:@"Please provide the path to the executable (*/.app/application)"]; 102 | } 103 | else { 104 | [self startTask]; 105 | } 106 | } 107 | 108 | #pragma mark - NSTask 109 | - (void) startTask { 110 | 111 | [self startProgressIndicator]; 112 | [self enableControllers:NO]; 113 | 114 | [super startTask]; 115 | 116 | __typeof(self) __weak weakself = self; 117 | [self setUpTerminationHandlerForTask:self.task completion:^(NSString *taskOutput, NSError *error) { 118 | [weakself.resultTxtView setString:taskOutput]; 119 | [weakself.task terminate]; 120 | weakself.task = nil; 121 | 122 | [weakself stopProgressIndicator]; 123 | [weakself enableControllers:YES]; 124 | }]; 125 | 126 | [self tryToLaunchTask:self.task completionIfFailed:^(NSString *taskOutput, NSError *error) { 127 | [weakself.resultTxtView setString:[error localizedDescription]]; 128 | [weakself.task terminate]; 129 | weakself.task = nil; 130 | 131 | [weakself stopProgressIndicator]; 132 | [weakself enableControllers:YES]; 133 | }]; 134 | } 135 | 136 | - (NSArray *)getArgumentsForTask:(NSTask *)task { 137 | return [self getArguments]; 138 | } 139 | 140 | - (NSString *)getLaunchPathForTask:(NSTask *)task { 141 | return @"/usr/bin/atos"; 142 | } 143 | 144 | 145 | #pragma mark - Helper Methods 146 | - (NSArray *)getArguments { 147 | __block NSMutableArray *arguments = [[NSMutableArray alloc] init]; 148 | [arguments addObject:@"-arch"]; 149 | [arguments addObject:[self valueForMatrix:self.architectureMatrix.selectedColumn]]; 150 | [arguments addObject:@"-o"]; 151 | 152 | NSURL *dSYMFilePathURL = [NSURL fileURLWithPath:self.dSYMFilePathTxtFld.stringValue]; 153 | NSString *string = [dSYMFilePathURL path]; 154 | [arguments addObject:string]; 155 | 156 | NSArray *array = [[self.memoryAddressTxtFld stringValue] componentsSeparatedByString:@" "]; 157 | [array enumerateObjectsUsingBlock:^(NSString *obj, NSUInteger idx, BOOL *stop) { 158 | NSString *str = [obj stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 159 | [arguments addObject:str]; 160 | }]; 161 | 162 | return [NSArray arrayWithArray:arguments]; 163 | } 164 | 165 | #pragma mark - Select Button Actions 166 | - (IBAction)applicationFileSelected:(id)sender { 167 | // Create and configure the panel. 168 | NSOpenPanel* panel = [NSOpenPanel openPanel]; 169 | [panel setCanChooseDirectories:NO]; 170 | [panel setAllowsMultipleSelection:NO]; 171 | [panel setAllowedFileTypes:@[@"public.executable"]]; 172 | [panel setMessage:@"Import one or more files or directories."]; 173 | 174 | // Display the panel attached to the document's window. 175 | [panel beginSheetModalForWindow:self.view.window completionHandler:^(NSInteger result){ 176 | if (result == NSFileHandlingPanelOKButton) { 177 | NSArray* urls = [panel URLs]; 178 | NSURL *url = urls[0]; 179 | self.dSYMFilePathTxtFld.stringValue = url.path; 180 | } 181 | 182 | }]; 183 | } 184 | 185 | 186 | #pragma mark - Progress Indicator 187 | - (void)startProgressIndicator { 188 | NSProgressIndicator *indicator = [[NSProgressIndicator alloc] initWithFrame:self.resultTxtView.bounds]; 189 | indicator.style = NSProgressIndicatorSpinningStyle; 190 | indicator.autoresizingMask = NSViewWidthSizable|NSViewHeightSizable; 191 | [self.resultTxtView addSubview:indicator]; 192 | [indicator startAnimation:nil]; 193 | self.progressIndicator = indicator; 194 | } 195 | 196 | - (void)stopProgressIndicator { 197 | [self.progressIndicator stopAnimation:nil]; 198 | [self.progressIndicator removeFromSuperview]; 199 | self.progressIndicator = nil; 200 | } 201 | 202 | - (void)enableControllers:(BOOL)enable { 203 | self.selectBtn.enabled = enable; 204 | self.dSYMFilePathTxtFld.enabled = enable; 205 | self.symbolicateBtn.enabled = enable; 206 | } 207 | 208 | 209 | @end 210 | -------------------------------------------------------------------------------- /SymbolicationPlugin/DetailsController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 68 | 69 | 70 | 71 | 72 | 73 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /SymbolicationPlugin/RootController.m: -------------------------------------------------------------------------------- 1 | // 2 | // RootController.m 3 | // SymbolicationPlugin 4 | // 5 | // The MIT License (MIT) 6 | // 7 | // Copyright (c) 2015 Mahesh R Shanbhag 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in all 17 | // copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | // SOFTWARE. 26 | 27 | #import "RootController.h" 28 | #import "DetailsController.h" 29 | #import "SymbolicateMemory.h" 30 | 31 | @interface RootController () 32 | 33 | @property (weak) IBOutlet NSView *rootContentView; 34 | @property (weak) IBOutlet NSSegmentedControl *segmentControl; 35 | @property (weak) IBOutlet NSTextField *dSYMPathTxtFld; 36 | @property (weak) IBOutlet NSTextField *crashFilePathTxtFld; 37 | @property (unsafe_unretained) IBOutlet NSTextView *resultTextViewField; 38 | 39 | 40 | @property (weak) IBOutlet NSButton *symbolicateBtn; 41 | @property (weak) IBOutlet NSTextField *dSYMFilepathLbl; 42 | @property (weak) IBOutlet NSTextField *crashFilePathLbl; 43 | @property (weak) IBOutlet NSButton *dSYMSelectBtn; 44 | @property (weak) IBOutlet NSButton *crashSelectBtn; 45 | @property (weak) IBOutlet NSScrollView *textScrollView; 46 | @property (weak) IBOutlet NSButton *saveBtn; 47 | 48 | 49 | @property (strong, nonatomic) DetailsController *detailsController; 50 | @property (strong, nonatomic) SymbolicateMemory *symbolicateMemory; 51 | @property (strong, nonatomic) NSProgressIndicator *progressIndicator; 52 | 53 | @end 54 | 55 | @implementation RootController 56 | 57 | - (void)viewDidLoad { 58 | [super viewDidLoad]; 59 | // Do view setup here. 60 | 61 | [self.view setWantsLayer:YES]; 62 | [self.view.layer setBackgroundColor:[NSColor colorWithRed:235.0f/255.0f green:235.0f/255.0f blue:235.0f/255.0f alpha:1.0f].CGColor]; 63 | [self.rootContentView setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; 64 | 65 | [self.rootContentView.layer setBackgroundColor:[NSColor colorWithRed:235.0f/255.0f green:235.0f/255.0f blue:235.0f/255.0f alpha:1.0f].CGColor]; 66 | [self.segmentControl selectSegmentWithTag:0]; 67 | 68 | self.resultTextViewField.editable = NO; 69 | self.dSYMPathTxtFld.editable = NO; 70 | self.crashFilePathTxtFld.editable = NO; 71 | self.resultTextViewField.selectable = YES; 72 | [self enableSaveButton:NO]; 73 | } 74 | 75 | - (void)dealloc { 76 | [self.task terminate]; 77 | self.task = nil; 78 | 79 | [self stopProgressIndicator]; 80 | [self enableControllers:YES]; 81 | } 82 | 83 | #pragma mark - Segment Control 84 | 85 | - (IBAction)segmentSelected:(NSSegmentedControl *)sender { 86 | switch (sender.selectedSegment) { 87 | case 0: { 88 | [self clearDetailsPage]; 89 | [self clearSymbolicateMemoryPage]; 90 | [self showRootView]; 91 | break; 92 | } 93 | case 1: { 94 | [self clearSymbolicateMemoryPage]; 95 | [self hideMainView:YES]; 96 | [self showDetailsPage]; 97 | break; 98 | } 99 | case 2: { 100 | [self clearDetailsPage]; 101 | [self hideMainView:YES]; 102 | [self showSymbolicateMemoryPage]; 103 | break; 104 | } 105 | default: 106 | break; 107 | } 108 | } 109 | 110 | - (void)showRootView { 111 | [self hideMainView:NO]; 112 | } 113 | 114 | - (void)hideMainView:(BOOL)hide { 115 | self.dSYMFilepathLbl.hidden = hide; 116 | self.dSYMPathTxtFld.hidden = hide; 117 | self.crashFilePathLbl.hidden = hide; 118 | self.crashFilePathTxtFld.hidden = hide; 119 | self.symbolicateBtn.hidden = hide; 120 | self.resultTextViewField.hidden = hide; 121 | self.textScrollView.hidden = hide; 122 | self.dSYMSelectBtn.hidden = hide; 123 | self.crashSelectBtn.hidden = hide; 124 | } 125 | 126 | - (void)showDetailsPage { 127 | 128 | if(self.detailsController != nil) { 129 | return; 130 | } 131 | 132 | NSBundle *bundle = [NSBundle bundleForClass:[DetailsController class]]; 133 | DetailsController *detailsCtlr = [[DetailsController alloc] initWithNibName:@"DetailsController" bundle:bundle]; 134 | detailsCtlr.view.autoresizingMask = NSViewHeightSizable|NSViewWidthSizable; 135 | detailsCtlr.view.frame = self.rootContentView.bounds; 136 | 137 | [self.rootContentView addSubview:detailsCtlr.view]; 138 | self.detailsController = detailsCtlr; 139 | } 140 | 141 | - (void)clearDetailsPage { 142 | if(self.detailsController) { 143 | [self.detailsController.view removeFromSuperview]; 144 | self.detailsController = nil; 145 | } 146 | } 147 | 148 | - (void)clearSymbolicateMemoryPage { 149 | if(self.symbolicateMemory) { 150 | [self.symbolicateMemory.view removeFromSuperview]; 151 | self.symbolicateMemory = nil; 152 | } 153 | } 154 | 155 | - (void)showSymbolicateMemoryPage { 156 | 157 | if(self.symbolicateMemory != nil) { 158 | return; 159 | } 160 | 161 | NSBundle *bundle = [NSBundle bundleForClass:[SymbolicateMemory class]]; 162 | SymbolicateMemory *memCtlr = [[SymbolicateMemory alloc] initWithNibName:@"SymbolicateMemory" bundle:bundle]; 163 | memCtlr.view.autoresizingMask = NSViewHeightSizable|NSViewWidthSizable; 164 | memCtlr.view.frame = self.rootContentView.bounds; 165 | 166 | [self.rootContentView addSubview:memCtlr.view]; 167 | self.symbolicateMemory = memCtlr; 168 | } 169 | 170 | 171 | #pragma mark - Symbolicate Button Action 172 | - (IBAction)symbolicateBtnPressed:(id)sender { 173 | 174 | if(self.dSYMPathTxtFld.stringValue.length == 0) { 175 | [self showAlertWithTitle:@"File Missing" message:@"Please select dSYM file for symbolication"]; 176 | } 177 | else if (self.crashFilePathTxtFld.stringValue.length == 0) { 178 | [self showAlertWithTitle:@"File Missing" message:@"Please select the crash file to be symbolicated."]; 179 | } 180 | else { 181 | self.resultTextViewField.string = @""; // reset the result string 182 | [self startTask]; 183 | } 184 | } 185 | 186 | #pragma mark - NSTask 187 | - (void) startTask { 188 | [self startProgressIndicator]; 189 | [self enableControllers:NO]; 190 | [self enableSaveButton:NO]; 191 | 192 | [super startTask]; 193 | 194 | __typeof(self) __weak weakself = self; 195 | [self setUpTerminationHandlerForTask:self.task completion:^(NSString *taskOutput, NSError *error) { 196 | [weakself.resultTextViewField setString:taskOutput]; 197 | [weakself.task terminate]; 198 | weakself.task = nil; 199 | 200 | [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 201 | [weakself stopProgressIndicator]; 202 | [weakself enableControllers:YES]; 203 | [weakself enableSaveButton:YES]; 204 | }]; 205 | }]; 206 | 207 | [self tryToLaunchTask:self.task completionIfFailed:^(NSString *taskOutput, NSError *error) { 208 | [weakself.resultTextViewField setString:[error localizedDescription]]; 209 | [weakself.task terminate]; 210 | weakself.task = nil; 211 | 212 | [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 213 | [weakself stopProgressIndicator]; 214 | [weakself enableControllers:YES]; 215 | [weakself enableSaveButton:NO]; 216 | }]; 217 | }]; 218 | } 219 | 220 | - (NSArray *)getArgumentsForTask:(NSTask *)task { 221 | NSString *dSYMFilePath = self.dSYMPathTxtFld.stringValue; 222 | NSString *crashFilePath = self.crashFilePathTxtFld.stringValue; 223 | return @[crashFilePath, dSYMFilePath]; 224 | } 225 | 226 | - (NSString *)getLaunchPathForTask:(NSTask *)task { 227 | NSBundle *bundle = [NSBundle bundleWithIdentifier:kSymbolicationPluginBundleIdentifier]; 228 | NSString *resymbolicateFilePath = [bundle pathForResource:@"resymbolicate" ofType:@""]; 229 | return resymbolicateFilePath; 230 | } 231 | 232 | #pragma mark - Select Files 233 | - (IBAction)selectdSYMFile:(id)sender { 234 | 235 | // Create and configure the panel. 236 | NSOpenPanel* panel = [NSOpenPanel openPanel]; 237 | [panel setCanChooseDirectories:NO]; 238 | [panel setAllowsMultipleSelection:NO]; 239 | [panel setAllowedFileTypes:@[@"dSYM"]]; 240 | [panel setMessage:@"Import one or more files or directories."]; 241 | 242 | // Display the panel attached to the document's window. 243 | [panel beginSheetModalForWindow:self.view.window completionHandler:^(NSInteger result){ 244 | if (result == NSFileHandlingPanelOKButton) { 245 | NSArray* urls = [panel URLs]; 246 | NSURL *url = urls[0]; 247 | self.dSYMPathTxtFld.stringValue = url.path; 248 | } 249 | 250 | }]; 251 | } 252 | 253 | - (IBAction)selectCrashFile:(id)sender { 254 | 255 | // Create and configure the panel. 256 | NSOpenPanel* panel = [NSOpenPanel openPanel]; 257 | [panel setCanChooseDirectories:NO]; 258 | [panel setAllowsMultipleSelection:NO]; 259 | [panel setAllowedFileTypes:@[@"crash"]]; 260 | [panel setMessage:@"Import one or more files or directories."]; 261 | 262 | // Display the panel attached to the document's window. 263 | [panel beginSheetModalForWindow:self.view.window completionHandler:^(NSInteger result){ 264 | if (result == NSFileHandlingPanelOKButton) { 265 | NSArray* urls = [panel URLs]; 266 | NSURL *url = urls[0]; 267 | self.crashFilePathTxtFld.stringValue = url.path; 268 | } 269 | 270 | }]; 271 | } 272 | 273 | - (IBAction)saveBtnPressed:(id)sender { 274 | 275 | // Create and configure the panel. 276 | NSSavePanel* panel = [NSSavePanel savePanel]; 277 | panel.nameFieldStringValue = @"symbolicated_crash.crash"; 278 | [panel setAllowedFileTypes:@[@"crash"]]; 279 | [panel setMessage:@"Import one or more files or directories."]; 280 | 281 | // Display the panel attached to the document's window. 282 | [panel beginSheetModalForWindow:self.view.window completionHandler:^(NSInteger result){ 283 | NSURL *url = [panel URL]; 284 | 285 | 286 | NSFileManager *manager = [[NSFileManager alloc] init]; 287 | if(![manager fileExistsAtPath:url.path isDirectory:NO]) { 288 | [manager createFileAtPath:url.path contents:[self.resultTextViewField.string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil]; 289 | } 290 | }]; 291 | } 292 | 293 | - (void)enableSaveButton:(BOOL)enable { 294 | self.saveBtn.enabled = enable; 295 | } 296 | 297 | 298 | #pragma mark - Progress Indicator 299 | - (void)startProgressIndicator { 300 | NSProgressIndicator *indicator = [[NSProgressIndicator alloc] initWithFrame:self.textScrollView.bounds]; 301 | indicator.style = NSProgressIndicatorSpinningStyle; 302 | indicator.autoresizingMask = NSViewWidthSizable|NSViewHeightSizable; 303 | [self.textScrollView addSubview:indicator]; 304 | [indicator startAnimation:nil]; 305 | 306 | self.progressIndicator = indicator; 307 | } 308 | 309 | - (void)stopProgressIndicator { 310 | [self.progressIndicator stopAnimation:nil]; 311 | [self.progressIndicator removeFromSuperview]; 312 | self.progressIndicator = nil; 313 | } 314 | 315 | - (void)enableControllers:(BOOL)enable { 316 | self.dSYMPathTxtFld.enabled = enable; 317 | self.dSYMSelectBtn.enabled = enable; 318 | self.crashSelectBtn.enabled = enable; 319 | self.crashFilePathTxtFld.enabled = enable; 320 | self.symbolicateBtn.enabled = enable; 321 | } 322 | 323 | @end 324 | -------------------------------------------------------------------------------- /SymbolicationPlugin/SymbolicateMemory.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 146 | 147 | 148 | 149 | 150 | 151 | 165 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | -------------------------------------------------------------------------------- /SymbolicationPlugin.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 671613331B29DA73004A7DD5 /* RootController.m in Sources */ = {isa = PBXBuildFile; fileRef = 671613311B29DA72004A7DD5 /* RootController.m */; }; 11 | 671613341B29DA73004A7DD5 /* RootController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 671613321B29DA72004A7DD5 /* RootController.xib */; }; 12 | 67472D381B29976B00212378 /* DetailsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 67472D361B29976B00212378 /* DetailsController.m */; }; 13 | 67472D391B29976B00212378 /* DetailsController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 67472D371B29976B00212378 /* DetailsController.xib */; }; 14 | 6750F2A81B2BE429004FF9B9 /* CommonController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6750F2A71B2BE429004FF9B9 /* CommonController.m */; }; 15 | 677BF90E1B2B901300E67A47 /* down_arrow.png in Resources */ = {isa = PBXBuildFile; fileRef = 677BF90D1B2B901300E67A47 /* down_arrow.png */; }; 16 | 678639181B2AD557009F7680 /* SymbolicateMemory.m in Sources */ = {isa = PBXBuildFile; fileRef = 678639161B2AD557009F7680 /* SymbolicateMemory.m */; }; 17 | 678639191B2AD557009F7680 /* SymbolicateMemory.xib in Resources */ = {isa = PBXBuildFile; fileRef = 678639171B2AD557009F7680 /* SymbolicateMemory.xib */; }; 18 | 67BC08681B2B30E50014D37E /* resymbolicate in Resources */ = {isa = PBXBuildFile; fileRef = 67BC08671B2B30E50014D37E /* resymbolicate */; }; 19 | 67BF2FC91B1C927F00B8114E /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 67BF2FC81B1C927F00B8114E /* AppKit.framework */; }; 20 | 67BF2FCB1B1C927F00B8114E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 67BF2FCA1B1C927F00B8114E /* Foundation.framework */; }; 21 | 67BF2FD01B1C927F00B8114E /* SymbolicationPlugin.xcscheme in Resources */ = {isa = PBXBuildFile; fileRef = 67BF2FCF1B1C927F00B8114E /* SymbolicationPlugin.xcscheme */; }; 22 | 67BF2FD31B1C927F00B8114E /* SymbolicationPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 67BF2FD21B1C927F00B8114E /* SymbolicationPlugin.m */; }; 23 | 67BF2FD61B1C927F00B8114E /* NSObject_Extension.m in Sources */ = {isa = PBXBuildFile; fileRef = 67BF2FD51B1C927F00B8114E /* NSObject_Extension.m */; }; 24 | 67DDC7601B1DD50C002D0CB2 /* MainWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 67DDC75E1B1DD50C002D0CB2 /* MainWindow.m */; }; 25 | 67DDC7611B1DD50C002D0CB2 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 67DDC75F1B1DD50C002D0CB2 /* MainWindow.xib */; }; 26 | /* End PBXBuildFile section */ 27 | 28 | /* Begin PBXFileReference section */ 29 | 671613301B29DA72004A7DD5 /* RootController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RootController.h; sourceTree = ""; }; 30 | 671613311B29DA72004A7DD5 /* RootController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RootController.m; sourceTree = ""; }; 31 | 671613321B29DA72004A7DD5 /* RootController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RootController.xib; sourceTree = ""; }; 32 | 67472D351B29976B00212378 /* DetailsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DetailsController.h; sourceTree = ""; }; 33 | 67472D361B29976B00212378 /* DetailsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DetailsController.m; sourceTree = ""; }; 34 | 67472D371B29976B00212378 /* DetailsController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DetailsController.xib; sourceTree = ""; }; 35 | 6750F2A61B2BE429004FF9B9 /* CommonController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommonController.h; sourceTree = ""; }; 36 | 6750F2A71B2BE429004FF9B9 /* CommonController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommonController.m; sourceTree = ""; }; 37 | 677BF90D1B2B901300E67A47 /* down_arrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = down_arrow.png; sourceTree = ""; }; 38 | 678639151B2AD557009F7680 /* SymbolicateMemory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SymbolicateMemory.h; sourceTree = ""; }; 39 | 678639161B2AD557009F7680 /* SymbolicateMemory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SymbolicateMemory.m; sourceTree = ""; }; 40 | 678639171B2AD557009F7680 /* SymbolicateMemory.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SymbolicateMemory.xib; sourceTree = ""; }; 41 | 67BC08671B2B30E50014D37E /* resymbolicate */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = resymbolicate; sourceTree = ""; }; 42 | 67BF2FC51B1C927E00B8114E /* SymbolicationPlugin.xcplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SymbolicationPlugin.xcplugin; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 67BF2FC81B1C927F00B8114E /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 44 | 67BF2FCA1B1C927F00B8114E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 45 | 67BF2FCE1B1C927F00B8114E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 46 | 67BF2FCF1B1C927F00B8114E /* SymbolicationPlugin.xcscheme */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = SymbolicationPlugin.xcscheme; path = SymbolicationPlugin.xcodeproj/xcshareddata/xcschemes/SymbolicationPlugin.xcscheme; sourceTree = SOURCE_ROOT; }; 47 | 67BF2FD11B1C927F00B8114E /* SymbolicationPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SymbolicationPlugin.h; sourceTree = ""; }; 48 | 67BF2FD21B1C927F00B8114E /* SymbolicationPlugin.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SymbolicationPlugin.m; sourceTree = ""; }; 49 | 67BF2FD41B1C927F00B8114E /* NSObject_Extension.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSObject_Extension.h; sourceTree = ""; }; 50 | 67BF2FD51B1C927F00B8114E /* NSObject_Extension.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSObject_Extension.m; sourceTree = ""; }; 51 | 67DDC75D1B1DD50C002D0CB2 /* MainWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainWindow.h; sourceTree = ""; }; 52 | 67DDC75E1B1DD50C002D0CB2 /* MainWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainWindow.m; sourceTree = ""; }; 53 | 67DDC75F1B1DD50C002D0CB2 /* MainWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; 54 | /* End PBXFileReference section */ 55 | 56 | /* Begin PBXFrameworksBuildPhase section */ 57 | 67BF2FC31B1C927E00B8114E /* Frameworks */ = { 58 | isa = PBXFrameworksBuildPhase; 59 | buildActionMask = 2147483647; 60 | files = ( 61 | 67BF2FC91B1C927F00B8114E /* AppKit.framework in Frameworks */, 62 | 67BF2FCB1B1C927F00B8114E /* Foundation.framework in Frameworks */, 63 | ); 64 | runOnlyForDeploymentPostprocessing = 0; 65 | }; 66 | /* End PBXFrameworksBuildPhase section */ 67 | 68 | /* Begin PBXGroup section */ 69 | 67854FD91B2BF145002FEE28 /* GUI */ = { 70 | isa = PBXGroup; 71 | children = ( 72 | 67DDC75D1B1DD50C002D0CB2 /* MainWindow.h */, 73 | 67DDC75E1B1DD50C002D0CB2 /* MainWindow.m */, 74 | 67DDC75F1B1DD50C002D0CB2 /* MainWindow.xib */, 75 | 6750F2A61B2BE429004FF9B9 /* CommonController.h */, 76 | 6750F2A71B2BE429004FF9B9 /* CommonController.m */, 77 | 671613301B29DA72004A7DD5 /* RootController.h */, 78 | 671613311B29DA72004A7DD5 /* RootController.m */, 79 | 671613321B29DA72004A7DD5 /* RootController.xib */, 80 | 67472D351B29976B00212378 /* DetailsController.h */, 81 | 67472D361B29976B00212378 /* DetailsController.m */, 82 | 67472D371B29976B00212378 /* DetailsController.xib */, 83 | 678639151B2AD557009F7680 /* SymbolicateMemory.h */, 84 | 678639161B2AD557009F7680 /* SymbolicateMemory.m */, 85 | 678639171B2AD557009F7680 /* SymbolicateMemory.xib */, 86 | ); 87 | name = GUI; 88 | sourceTree = ""; 89 | }; 90 | 67854FDA1B2BF164002FEE28 /* Script */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 67BC08671B2B30E50014D37E /* resymbolicate */, 94 | ); 95 | name = Script; 96 | sourceTree = ""; 97 | }; 98 | 67854FDB1B2BF16D002FEE28 /* Images */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 677BF90D1B2B901300E67A47 /* down_arrow.png */, 102 | ); 103 | name = Images; 104 | sourceTree = ""; 105 | }; 106 | 67BF2FBC1B1C927E00B8114E = { 107 | isa = PBXGroup; 108 | children = ( 109 | 67BF2FCC1B1C927F00B8114E /* SymbolicationPlugin */, 110 | 67BF2FC71B1C927F00B8114E /* Frameworks */, 111 | 67BF2FC61B1C927E00B8114E /* Products */, 112 | ); 113 | sourceTree = ""; 114 | }; 115 | 67BF2FC61B1C927E00B8114E /* Products */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | 67BF2FC51B1C927E00B8114E /* SymbolicationPlugin.xcplugin */, 119 | ); 120 | name = Products; 121 | sourceTree = ""; 122 | }; 123 | 67BF2FC71B1C927F00B8114E /* Frameworks */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | 67BF2FC81B1C927F00B8114E /* AppKit.framework */, 127 | 67BF2FCA1B1C927F00B8114E /* Foundation.framework */, 128 | ); 129 | name = Frameworks; 130 | sourceTree = ""; 131 | }; 132 | 67BF2FCC1B1C927F00B8114E /* SymbolicationPlugin */ = { 133 | isa = PBXGroup; 134 | children = ( 135 | 67BF2FD11B1C927F00B8114E /* SymbolicationPlugin.h */, 136 | 67BF2FD21B1C927F00B8114E /* SymbolicationPlugin.m */, 137 | 67BF2FD41B1C927F00B8114E /* NSObject_Extension.h */, 138 | 67BF2FD51B1C927F00B8114E /* NSObject_Extension.m */, 139 | 67854FDB1B2BF16D002FEE28 /* Images */, 140 | 67854FDA1B2BF164002FEE28 /* Script */, 141 | 67854FD91B2BF145002FEE28 /* GUI */, 142 | 67BF2FCD1B1C927F00B8114E /* Supporting Files */, 143 | ); 144 | path = SymbolicationPlugin; 145 | sourceTree = ""; 146 | }; 147 | 67BF2FCD1B1C927F00B8114E /* Supporting Files */ = { 148 | isa = PBXGroup; 149 | children = ( 150 | 67BF2FCE1B1C927F00B8114E /* Info.plist */, 151 | 67BF2FCF1B1C927F00B8114E /* SymbolicationPlugin.xcscheme */, 152 | ); 153 | name = "Supporting Files"; 154 | sourceTree = ""; 155 | }; 156 | /* End PBXGroup section */ 157 | 158 | /* Begin PBXNativeTarget section */ 159 | 67BF2FC41B1C927E00B8114E /* SymbolicationPlugin */ = { 160 | isa = PBXNativeTarget; 161 | buildConfigurationList = 67BF2FD91B1C927F00B8114E /* Build configuration list for PBXNativeTarget "SymbolicationPlugin" */; 162 | buildPhases = ( 163 | 67BF2FC11B1C927E00B8114E /* Sources */, 164 | 67BF2FC21B1C927E00B8114E /* Resources */, 165 | 67BF2FC31B1C927E00B8114E /* Frameworks */, 166 | ); 167 | buildRules = ( 168 | ); 169 | dependencies = ( 170 | ); 171 | name = SymbolicationPlugin; 172 | productName = SymbolicationPlugin; 173 | productReference = 67BF2FC51B1C927E00B8114E /* SymbolicationPlugin.xcplugin */; 174 | productType = "com.apple.product-type.bundle"; 175 | }; 176 | /* End PBXNativeTarget section */ 177 | 178 | /* Begin PBXProject section */ 179 | 67BF2FBD1B1C927E00B8114E /* Project object */ = { 180 | isa = PBXProject; 181 | attributes = { 182 | LastUpgradeCheck = 0710; 183 | ORGANIZATIONNAME = "Mahesh Shanbhag"; 184 | TargetAttributes = { 185 | 67BF2FC41B1C927E00B8114E = { 186 | CreatedOnToolsVersion = 6.3.2; 187 | }; 188 | }; 189 | }; 190 | buildConfigurationList = 67BF2FC01B1C927E00B8114E /* Build configuration list for PBXProject "SymbolicationPlugin" */; 191 | compatibilityVersion = "Xcode 3.2"; 192 | developmentRegion = English; 193 | hasScannedForEncodings = 0; 194 | knownRegions = ( 195 | en, 196 | ); 197 | mainGroup = 67BF2FBC1B1C927E00B8114E; 198 | productRefGroup = 67BF2FC61B1C927E00B8114E /* Products */; 199 | projectDirPath = ""; 200 | projectRoot = ""; 201 | targets = ( 202 | 67BF2FC41B1C927E00B8114E /* SymbolicationPlugin */, 203 | ); 204 | }; 205 | /* End PBXProject section */ 206 | 207 | /* Begin PBXResourcesBuildPhase section */ 208 | 67BF2FC21B1C927E00B8114E /* Resources */ = { 209 | isa = PBXResourcesBuildPhase; 210 | buildActionMask = 2147483647; 211 | files = ( 212 | 677BF90E1B2B901300E67A47 /* down_arrow.png in Resources */, 213 | 67DDC7611B1DD50C002D0CB2 /* MainWindow.xib in Resources */, 214 | 67472D391B29976B00212378 /* DetailsController.xib in Resources */, 215 | 67BF2FD01B1C927F00B8114E /* SymbolicationPlugin.xcscheme in Resources */, 216 | 671613341B29DA73004A7DD5 /* RootController.xib in Resources */, 217 | 67BC08681B2B30E50014D37E /* resymbolicate in Resources */, 218 | 678639191B2AD557009F7680 /* SymbolicateMemory.xib in Resources */, 219 | ); 220 | runOnlyForDeploymentPostprocessing = 0; 221 | }; 222 | /* End PBXResourcesBuildPhase section */ 223 | 224 | /* Begin PBXSourcesBuildPhase section */ 225 | 67BF2FC11B1C927E00B8114E /* Sources */ = { 226 | isa = PBXSourcesBuildPhase; 227 | buildActionMask = 2147483647; 228 | files = ( 229 | 67472D381B29976B00212378 /* DetailsController.m in Sources */, 230 | 67BF2FD31B1C927F00B8114E /* SymbolicationPlugin.m in Sources */, 231 | 67BF2FD61B1C927F00B8114E /* NSObject_Extension.m in Sources */, 232 | 6750F2A81B2BE429004FF9B9 /* CommonController.m in Sources */, 233 | 67DDC7601B1DD50C002D0CB2 /* MainWindow.m in Sources */, 234 | 671613331B29DA73004A7DD5 /* RootController.m in Sources */, 235 | 678639181B2AD557009F7680 /* SymbolicateMemory.m in Sources */, 236 | ); 237 | runOnlyForDeploymentPostprocessing = 0; 238 | }; 239 | /* End PBXSourcesBuildPhase section */ 240 | 241 | /* Begin XCBuildConfiguration section */ 242 | 67BF2FD71B1C927F00B8114E /* Debug */ = { 243 | isa = XCBuildConfiguration; 244 | buildSettings = { 245 | ALWAYS_SEARCH_USER_PATHS = NO; 246 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 247 | CLANG_CXX_LIBRARY = "libc++"; 248 | CLANG_ENABLE_MODULES = YES; 249 | CLANG_ENABLE_OBJC_ARC = YES; 250 | CLANG_WARN_BOOL_CONVERSION = YES; 251 | CLANG_WARN_CONSTANT_CONVERSION = YES; 252 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 253 | CLANG_WARN_EMPTY_BODY = YES; 254 | CLANG_WARN_ENUM_CONVERSION = YES; 255 | CLANG_WARN_INT_CONVERSION = YES; 256 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 257 | CLANG_WARN_UNREACHABLE_CODE = YES; 258 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 259 | COPY_PHASE_STRIP = NO; 260 | ENABLE_STRICT_OBJC_MSGSEND = YES; 261 | ENABLE_TESTABILITY = YES; 262 | GCC_C_LANGUAGE_STANDARD = gnu99; 263 | GCC_DYNAMIC_NO_PIC = NO; 264 | GCC_NO_COMMON_BLOCKS = YES; 265 | GCC_OPTIMIZATION_LEVEL = 0; 266 | GCC_PREPROCESSOR_DEFINITIONS = ( 267 | "DEBUG=1", 268 | "$(inherited)", 269 | ); 270 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 271 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 272 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 273 | GCC_WARN_UNDECLARED_SELECTOR = YES; 274 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 275 | GCC_WARN_UNUSED_FUNCTION = YES; 276 | GCC_WARN_UNUSED_VARIABLE = YES; 277 | MTL_ENABLE_DEBUG_INFO = YES; 278 | ONLY_ACTIVE_ARCH = YES; 279 | }; 280 | name = Debug; 281 | }; 282 | 67BF2FD81B1C927F00B8114E /* Release */ = { 283 | isa = XCBuildConfiguration; 284 | buildSettings = { 285 | ALWAYS_SEARCH_USER_PATHS = NO; 286 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 287 | CLANG_CXX_LIBRARY = "libc++"; 288 | CLANG_ENABLE_MODULES = YES; 289 | CLANG_ENABLE_OBJC_ARC = YES; 290 | CLANG_WARN_BOOL_CONVERSION = YES; 291 | CLANG_WARN_CONSTANT_CONVERSION = YES; 292 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 293 | CLANG_WARN_EMPTY_BODY = YES; 294 | CLANG_WARN_ENUM_CONVERSION = YES; 295 | CLANG_WARN_INT_CONVERSION = YES; 296 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 297 | CLANG_WARN_UNREACHABLE_CODE = YES; 298 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 299 | COPY_PHASE_STRIP = NO; 300 | ENABLE_NS_ASSERTIONS = NO; 301 | ENABLE_STRICT_OBJC_MSGSEND = YES; 302 | GCC_C_LANGUAGE_STANDARD = gnu99; 303 | GCC_NO_COMMON_BLOCKS = YES; 304 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 305 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 306 | GCC_WARN_UNDECLARED_SELECTOR = YES; 307 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 308 | GCC_WARN_UNUSED_FUNCTION = YES; 309 | GCC_WARN_UNUSED_VARIABLE = YES; 310 | MTL_ENABLE_DEBUG_INFO = NO; 311 | }; 312 | name = Release; 313 | }; 314 | 67BF2FDA1B1C927F00B8114E /* Debug */ = { 315 | isa = XCBuildConfiguration; 316 | buildSettings = { 317 | COMBINE_HIDPI_IMAGES = YES; 318 | DEPLOYMENT_LOCATION = YES; 319 | DSTROOT = "$(HOME)"; 320 | INFOPLIST_FILE = SymbolicationPlugin/Info.plist; 321 | INSTALL_PATH = "/Library/Application Support/Developer/Shared/Xcode/Plug-ins"; 322 | MACOSX_DEPLOYMENT_TARGET = 10.10; 323 | PRODUCT_BUNDLE_IDENTIFIER = com.mahesh.SymbolicationPlugin; 324 | PRODUCT_NAME = "$(TARGET_NAME)"; 325 | WRAPPER_EXTENSION = xcplugin; 326 | }; 327 | name = Debug; 328 | }; 329 | 67BF2FDB1B1C927F00B8114E /* Release */ = { 330 | isa = XCBuildConfiguration; 331 | buildSettings = { 332 | COMBINE_HIDPI_IMAGES = YES; 333 | DEPLOYMENT_LOCATION = YES; 334 | DSTROOT = "$(HOME)"; 335 | INFOPLIST_FILE = SymbolicationPlugin/Info.plist; 336 | INSTALL_PATH = "/Library/Application Support/Developer/Shared/Xcode/Plug-ins"; 337 | MACOSX_DEPLOYMENT_TARGET = 10.10; 338 | PRODUCT_BUNDLE_IDENTIFIER = com.mahesh.SymbolicationPlugin; 339 | PRODUCT_NAME = "$(TARGET_NAME)"; 340 | WRAPPER_EXTENSION = xcplugin; 341 | }; 342 | name = Release; 343 | }; 344 | /* End XCBuildConfiguration section */ 345 | 346 | /* Begin XCConfigurationList section */ 347 | 67BF2FC01B1C927E00B8114E /* Build configuration list for PBXProject "SymbolicationPlugin" */ = { 348 | isa = XCConfigurationList; 349 | buildConfigurations = ( 350 | 67BF2FD71B1C927F00B8114E /* Debug */, 351 | 67BF2FD81B1C927F00B8114E /* Release */, 352 | ); 353 | defaultConfigurationIsVisible = 0; 354 | defaultConfigurationName = Release; 355 | }; 356 | 67BF2FD91B1C927F00B8114E /* Build configuration list for PBXNativeTarget "SymbolicationPlugin" */ = { 357 | isa = XCConfigurationList; 358 | buildConfigurations = ( 359 | 67BF2FDA1B1C927F00B8114E /* Debug */, 360 | 67BF2FDB1B1C927F00B8114E /* Release */, 361 | ); 362 | defaultConfigurationIsVisible = 0; 363 | defaultConfigurationName = Release; 364 | }; 365 | /* End XCConfigurationList section */ 366 | }; 367 | rootObject = 67BF2FBD1B1C927E00B8114E /* Project object */; 368 | } 369 | -------------------------------------------------------------------------------- /SymbolicationPlugin/RootController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 119 | 120 | 121 | 122 | 123 | 124 | 138 | 152 | 166 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | --------------------------------------------------------------------------------