├── EnterDebuggerService.workflow
└── Contents
│ ├── QuickLook
│ └── Thumbnail.png
│ ├── Info.plist
│ └── document.wflow
├── EnterDebugger
├── EnterDebuggerUserClientShared.h
├── EnterDebugger.hpp
├── EnterDebugger.cpp
├── EnterDebuggerUserClient.hpp
├── Info.plist
└── EnterDebuggerUserClient.cpp
├── README.md
├── LICENSE
├── EnterDebuggerClient
└── main.m
└── EnterDebugger.xcodeproj
└── project.pbxproj
/EnterDebuggerService.workflow/Contents/QuickLook/Thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/knightsc/EnterDebugger/HEAD/EnterDebuggerService.workflow/Contents/QuickLook/Thumbnail.png
--------------------------------------------------------------------------------
/EnterDebugger/EnterDebuggerUserClientShared.h:
--------------------------------------------------------------------------------
1 | #ifndef EnterDebuggerUserClientShared_h
2 | #define EnterDebuggerUserClientShared_h
3 |
4 | enum EnterDebuggerRequestCode {
5 | kEnterDebuggerRequestEnterDebugger,
6 | kEnterDebuggerRequestMethodCount
7 | };
8 |
9 | #endif /* EnterDebuggerUserClientShared_h */
10 |
--------------------------------------------------------------------------------
/EnterDebuggerService.workflow/Contents/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | NSServices
6 |
7 |
8 | NSMenuItem
9 |
10 | default
11 | EnterDebuggerService
12 |
13 | NSMessage
14 | runWorkflowAsService
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # EnterDebugger
2 |
3 | On macOS, when you have kernel debugging set up there are two ways to trigger
4 | a NMI. One is the two command buttons and the power button (this doesn't seem
5 | to work in VMs) the other is Cmd-Opt-Ctrl-Shift-Esc. The Esc key combination
6 | seems to not work after upgrading to Sierra so this kext provides a way
7 | to trigger the needed call to PE_enter_debugger. Additionally there is
8 | an Automator service include to call the user space client that can then
9 | be bound to a keystroke.
10 |
11 | See https://computers.tutsplus.com/tutorials/how-to-launch-any-app-with-a-keyboard-shortcut--mac-31463
12 | for more info on the Automator service.
--------------------------------------------------------------------------------
/EnterDebugger/EnterDebugger.hpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | #ifndef EnterDebugger_hpp
5 | #define EnterDebugger_hpp
6 |
7 | class com_scottknight_EnterDebugger : public IOService
8 | {
9 | OSDeclareDefaultStructors(com_scottknight_EnterDebugger)
10 |
11 | public:
12 | virtual bool init (OSDictionary* dictionary = NULL) override;
13 | virtual void free (void) override;
14 |
15 | virtual IOService* probe (IOService* provider, SInt32* score) override;
16 | virtual bool start (IOService* provider) override;
17 | virtual void stop (IOService* provider) override;
18 | };
19 |
20 |
21 | #endif /* EnterDebuggerUserClient_hpp */
22 |
--------------------------------------------------------------------------------
/EnterDebugger/EnterDebugger.cpp:
--------------------------------------------------------------------------------
1 | #include "EnterDebugger.hpp"
2 |
3 | #define super IOService
4 |
5 | OSDefineMetaClassAndStructors(com_scottknight_EnterDebugger, IOService)
6 |
7 | bool com_scottknight_EnterDebugger::init (OSDictionary* dict)
8 | {
9 | bool res = super::init(dict);
10 | IOLog("EnterDebugger::init\n");
11 | return res;
12 | }
13 |
14 | void com_scottknight_EnterDebugger::free (void)
15 | {
16 | IOLog("EnterDebugger::free\n");
17 | super::free();
18 | }
19 |
20 | IOService* com_scottknight_EnterDebugger::probe (IOService* provider, SInt32* score)
21 | {
22 | IOService *res = super::probe(provider, score);
23 | IOLog("EnterDebugger::probe\n");
24 | return res;
25 | }
26 |
27 | bool com_scottknight_EnterDebugger::start (IOService *provider)
28 | {
29 | bool res = super::start(provider);
30 | IOLog("EnterDebugger::start\n");
31 |
32 | super::registerService();
33 |
34 | return res;
35 | }
36 |
37 | void com_scottknight_EnterDebugger::stop (IOService *provider)
38 | {
39 | IOLog("EnterDebugger::stop\n");
40 | super::stop(provider);
41 | }
42 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Scott Knight
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 |
--------------------------------------------------------------------------------
/EnterDebuggerClient/main.m:
--------------------------------------------------------------------------------
1 | #import
2 | #import "EnterDebuggerUserClientShared.h"
3 |
4 | int main(int argc, const char * argv[]) {
5 | @autoreleasepool {
6 | CFDictionaryRef matchingDict = NULL;
7 | io_service_t service = 0;
8 |
9 | matchingDict = IOServiceMatching("com_scottknight_EnterDebugger");
10 |
11 | service = IOServiceGetMatchingService(kIOMasterPortDefault, matchingDict);
12 |
13 | if (!service) {
14 | return -1;
15 | }
16 |
17 | task_port_t owningTask = mach_task_self();
18 | uint32_t type = 0;
19 | io_connect_t driverConnection;
20 | kern_return_t kr;
21 |
22 | kr = IOServiceOpen(service, owningTask, type, &driverConnection);
23 | if (kr != KERN_SUCCESS) {
24 | return -1;
25 | }
26 |
27 | IOConnectCallMethod(driverConnection, kEnterDebuggerRequestEnterDebugger, NULL, 0, NULL, 0, NULL, NULL, NULL, NULL);
28 |
29 | IOServiceClose(service);
30 |
31 | IOObjectRelease(service);
32 | }
33 | return 0;
34 | }
35 |
--------------------------------------------------------------------------------
/EnterDebugger/EnterDebuggerUserClient.hpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include "EnterDebugger.hpp"
4 | #include "EnterDebuggerUserClientShared.h"
5 |
6 | #ifndef EnterDebuggerUserClient_hpp
7 | #define EnterDebuggerUserClient_hpp
8 |
9 | class com_scottknight_EnterDebuggerUserClient : public IOUserClient
10 | {
11 | OSDeclareDefaultStructors(com_scottknight_EnterDebuggerUserClient)
12 |
13 | private:
14 | task_t m_task;
15 | bool m_taskIsAdmin;
16 | com_scottknight_EnterDebugger* m_driver;
17 |
18 | public:
19 | virtual bool initWithTask (task_t owningTask, void* securityToken, UInt32 type, OSDictionary* properties) override;
20 | virtual bool start (IOService* provider) override;
21 | virtual IOReturn clientClose (void) override;
22 | virtual void stop (IOService* provider) override;
23 | virtual void free (void) override;
24 |
25 | IOReturn externalMethod(uint32_t selector, IOExternalMethodArguments *args, IOExternalMethodDispatch *dispatch,
26 | OSObject *target, void *reference) override;
27 |
28 | protected:
29 | static const IOExternalMethodDispatch sMethods[kEnterDebuggerRequestMethodCount];
30 |
31 | static IOReturn sEnterDebugger(OSObject *target, void *reference, IOExternalMethodArguments *args);
32 | };
33 |
34 | #endif /* EnterDebuggerUserClient_hpp */
35 |
--------------------------------------------------------------------------------
/EnterDebugger/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | KEXT
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | IOKitPersonalities
22 |
23 | IOKitPersonalities
24 |
25 | IOKitTest
26 |
27 | CFBundleIdentifier
28 | $(PRODUCT_BUNDLE_IDENTIFIER)
29 | IOClass
30 | com_scottknight_EnterDebugger
31 | IOMatchCategory
32 | com_scottknight_EnterDebugger
33 | IOProviderClass
34 | IOResources
35 | IOResourceMatch
36 | IOKit
37 | IOUserClientClass
38 | com_scottknight_EnterDebuggerUserClient
39 |
40 |
41 | NSHumanReadableCopyright
42 | Copyright © 2017 Scott Knight. All rights reserved.
43 | OSBundleLibraries
44 |
45 | com.apple.kpi.iokit
46 | 9.0.0
47 | com.apple.kpi.libkern
48 | 9.0.0
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/EnterDebugger/EnterDebuggerUserClient.cpp:
--------------------------------------------------------------------------------
1 | #include "EnterDebuggerUserClient.hpp"
2 |
3 | #define super IOUserClient
4 |
5 | OSDefineMetaClassAndStructors(com_scottknight_EnterDebuggerUserClient, IOUserClient)
6 |
7 | const IOExternalMethodDispatch
8 | com_scottknight_EnterDebuggerUserClient::sMethods[kEnterDebuggerRequestMethodCount] =
9 | {
10 | { sEnterDebugger, 0, 0, 0, 0 }
11 | };
12 |
13 | bool com_scottknight_EnterDebuggerUserClient::initWithTask (task_t owningTask, void* securityToken, UInt32 type, OSDictionary* properties)
14 | {
15 | if (!owningTask) {
16 | return false;
17 | }
18 |
19 | if (! super::initWithTask(owningTask, securityToken , type, properties)) {
20 | return false;
21 | }
22 |
23 | m_task = owningTask;
24 |
25 | IOReturn ret = clientHasPrivilege(securityToken, kIOClientPrivilegeAdministrator);
26 | if ( ret == kIOReturnSuccess ) {
27 | m_taskIsAdmin = true;
28 | }
29 |
30 | return true;
31 | }
32 |
33 | void com_scottknight_EnterDebuggerUserClient::free (void)
34 | {
35 | super::free();
36 | }
37 |
38 |
39 | bool com_scottknight_EnterDebuggerUserClient::start (IOService* provider)
40 | {
41 | if (! super::start(provider)) {
42 | return false;
43 | }
44 |
45 | m_driver = OSDynamicCast(com_scottknight_EnterDebugger, provider);
46 |
47 | if (!m_driver) {
48 | return false;
49 | }
50 |
51 | return true;
52 | }
53 |
54 | IOReturn com_scottknight_EnterDebuggerUserClient::clientClose (void)
55 | {
56 | terminate();
57 | return kIOReturnSuccess;
58 | }
59 |
60 | void com_scottknight_EnterDebuggerUserClient::stop (IOService *provider)
61 | {
62 | super::stop(provider);
63 | }
64 |
65 | IOReturn com_scottknight_EnterDebuggerUserClient::externalMethod (uint32_t selector, IOExternalMethodArguments* arguments,
66 | IOExternalMethodDispatch* dispatch, OSObject* target,
67 | void* reference)
68 | {
69 | // Ensure the requested control selector is within range.
70 | if (selector >= kEnterDebuggerRequestMethodCount) {
71 | return kIOReturnUnsupported;
72 | }
73 |
74 | dispatch = (IOExternalMethodDispatch*)&sMethods[selector];
75 | target = this;
76 | reference = NULL;
77 |
78 | return super::externalMethod(selector, arguments, dispatch, target, reference);
79 | }
80 |
81 | IOReturn com_scottknight_EnterDebuggerUserClient::sEnterDebugger(OSObject *target, void *reference, IOExternalMethodArguments *args)
82 | {
83 | IOLog("EnterDebuggerUserClient::sEnterDebugger\n");
84 | PE_enter_debugger("EnterDebugger.kext");
85 | return KERN_SUCCESS;
86 | }
87 |
--------------------------------------------------------------------------------
/EnterDebuggerService.workflow/Contents/document.wflow:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | AMApplicationBuild
6 | 428
7 | AMApplicationVersion
8 | 2.7
9 | AMDocumentVersion
10 | 2
11 | actions
12 |
13 |
14 | action
15 |
16 | AMAccepts
17 |
18 | Container
19 | List
20 | Optional
21 |
22 | Types
23 |
24 | com.apple.cocoa.string
25 |
26 |
27 | AMActionVersion
28 | 2.0.3
29 | AMApplication
30 |
31 | Automator
32 |
33 | AMParameterProperties
34 |
35 | COMMAND_STRING
36 |
37 | CheckedForUserDefaultShell
38 |
39 | inputMethod
40 |
41 | shell
42 |
43 | source
44 |
45 |
46 | AMProvides
47 |
48 | Container
49 | List
50 | Types
51 |
52 | com.apple.cocoa.string
53 |
54 |
55 | ActionBundlePath
56 | /System/Library/Automator/Run Shell Script.action
57 | ActionName
58 | Run Shell Script
59 | ActionParameters
60 |
61 | COMMAND_STRING
62 | /full/path/to/client/EnterDebuggerClient
63 | CheckedForUserDefaultShell
64 |
65 | inputMethod
66 | 0
67 | shell
68 | /bin/bash
69 | source
70 |
71 |
72 | BundleIdentifier
73 | com.apple.RunShellScript
74 | CFBundleVersion
75 | 2.0.3
76 | CanShowSelectedItemsWhenRun
77 |
78 | CanShowWhenRun
79 |
80 | Category
81 |
82 | AMCategoryUtilities
83 |
84 | Class Name
85 | RunShellScriptAction
86 | InputUUID
87 | F119BFC7-E1B4-4E7D-A6DF-FF9A65C530E9
88 | Keywords
89 |
90 | Shell
91 | Script
92 | Command
93 | Run
94 | Unix
95 |
96 | OutputUUID
97 | 89D069AF-EB56-45B4-ADA3-09284678BEB4
98 | UUID
99 | D86E457B-AA3F-4C9F-AFE9-4C05D5E662A7
100 | UnlocalizedApplications
101 |
102 | Automator
103 |
104 | arguments
105 |
106 | 0
107 |
108 | default value
109 | 0
110 | name
111 | inputMethod
112 | required
113 | 0
114 | type
115 | 0
116 | uuid
117 | 0
118 |
119 | 1
120 |
121 | default value
122 |
123 | name
124 | source
125 | required
126 | 0
127 | type
128 | 0
129 | uuid
130 | 1
131 |
132 | 2
133 |
134 | default value
135 |
136 | name
137 | CheckedForUserDefaultShell
138 | required
139 | 0
140 | type
141 | 0
142 | uuid
143 | 2
144 |
145 | 3
146 |
147 | default value
148 |
149 | name
150 | COMMAND_STRING
151 | required
152 | 0
153 | type
154 | 0
155 | uuid
156 | 3
157 |
158 | 4
159 |
160 | default value
161 | /bin/sh
162 | name
163 | shell
164 | required
165 | 0
166 | type
167 | 0
168 | uuid
169 | 4
170 |
171 |
172 | isViewVisible
173 |
174 | location
175 | 309.000000:253.000000
176 | nibPath
177 | /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib
178 |
179 | isViewVisible
180 |
181 |
182 |
183 | connectors
184 |
185 | workflowMetaData
186 |
187 | serviceApplicationBundleID
188 |
189 | serviceApplicationPath
190 |
191 | serviceInputTypeIdentifier
192 | com.apple.Automator.nothing
193 | serviceOutputTypeIdentifier
194 | com.apple.Automator.nothing
195 | serviceProcessesInput
196 | 0
197 | workflowTypeIdentifier
198 | com.apple.Automator.servicesMenu
199 |
200 |
201 |
202 |
--------------------------------------------------------------------------------
/EnterDebugger.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 6FF8451E1E38F37500BB6EDB /* EnterDebugger.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6FF8451D1E38F37500BB6EDB /* EnterDebugger.hpp */; };
11 | 6FF845201E38F37500BB6EDB /* EnterDebugger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6FF8451F1E38F37500BB6EDB /* EnterDebugger.cpp */; };
12 | 6FF8452E1E38F41300BB6EDB /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FF8452D1E38F41300BB6EDB /* main.m */; };
13 | 6FF845341E38F46400BB6EDB /* EnterDebuggerUserClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6FF845321E38F46400BB6EDB /* EnterDebuggerUserClient.cpp */; };
14 | 6FF845351E38F46400BB6EDB /* EnterDebuggerUserClient.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6FF845331E38F46400BB6EDB /* EnterDebuggerUserClient.hpp */; };
15 | 6FF845371E38F5AF00BB6EDB /* EnterDebuggerUserClientShared.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FF845361E38F5AF00BB6EDB /* EnterDebuggerUserClientShared.h */; };
16 | /* End PBXBuildFile section */
17 |
18 | /* Begin PBXCopyFilesBuildPhase section */
19 | 6FF845291E38F41300BB6EDB /* CopyFiles */ = {
20 | isa = PBXCopyFilesBuildPhase;
21 | buildActionMask = 2147483647;
22 | dstPath = /usr/share/man/man1/;
23 | dstSubfolderSpec = 0;
24 | files = (
25 | );
26 | runOnlyForDeploymentPostprocessing = 1;
27 | };
28 | /* End PBXCopyFilesBuildPhase section */
29 |
30 | /* Begin PBXFileReference section */
31 | 6FF8451A1E38F37500BB6EDB /* EnterDebugger.kext */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = EnterDebugger.kext; sourceTree = BUILT_PRODUCTS_DIR; };
32 | 6FF8451D1E38F37500BB6EDB /* EnterDebugger.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = EnterDebugger.hpp; sourceTree = ""; };
33 | 6FF8451F1E38F37500BB6EDB /* EnterDebugger.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = EnterDebugger.cpp; sourceTree = ""; };
34 | 6FF845211E38F37500BB6EDB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
35 | 6FF8452B1E38F41300BB6EDB /* EnterDebuggerClient */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = EnterDebuggerClient; sourceTree = BUILT_PRODUCTS_DIR; };
36 | 6FF8452D1E38F41300BB6EDB /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
37 | 6FF845321E38F46400BB6EDB /* EnterDebuggerUserClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EnterDebuggerUserClient.cpp; sourceTree = ""; };
38 | 6FF845331E38F46400BB6EDB /* EnterDebuggerUserClient.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = EnterDebuggerUserClient.hpp; sourceTree = ""; };
39 | 6FF845361E38F5AF00BB6EDB /* EnterDebuggerUserClientShared.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EnterDebuggerUserClientShared.h; sourceTree = ""; };
40 | /* End PBXFileReference section */
41 |
42 | /* Begin PBXFrameworksBuildPhase section */
43 | 6FF845161E38F37500BB6EDB /* Frameworks */ = {
44 | isa = PBXFrameworksBuildPhase;
45 | buildActionMask = 2147483647;
46 | files = (
47 | );
48 | runOnlyForDeploymentPostprocessing = 0;
49 | };
50 | 6FF845281E38F41300BB6EDB /* Frameworks */ = {
51 | isa = PBXFrameworksBuildPhase;
52 | buildActionMask = 2147483647;
53 | files = (
54 | );
55 | runOnlyForDeploymentPostprocessing = 0;
56 | };
57 | /* End PBXFrameworksBuildPhase section */
58 |
59 | /* Begin PBXGroup section */
60 | 6FF845101E38F37500BB6EDB = {
61 | isa = PBXGroup;
62 | children = (
63 | 6FF8451C1E38F37500BB6EDB /* EnterDebugger */,
64 | 6FF8452C1E38F41300BB6EDB /* EnterDebuggerClient */,
65 | 6FF8451B1E38F37500BB6EDB /* Products */,
66 | );
67 | sourceTree = "";
68 | };
69 | 6FF8451B1E38F37500BB6EDB /* Products */ = {
70 | isa = PBXGroup;
71 | children = (
72 | 6FF8451A1E38F37500BB6EDB /* EnterDebugger.kext */,
73 | 6FF8452B1E38F41300BB6EDB /* EnterDebuggerClient */,
74 | );
75 | name = Products;
76 | sourceTree = "";
77 | };
78 | 6FF8451C1E38F37500BB6EDB /* EnterDebugger */ = {
79 | isa = PBXGroup;
80 | children = (
81 | 6FF8451D1E38F37500BB6EDB /* EnterDebugger.hpp */,
82 | 6FF8451F1E38F37500BB6EDB /* EnterDebugger.cpp */,
83 | 6FF845321E38F46400BB6EDB /* EnterDebuggerUserClient.cpp */,
84 | 6FF845331E38F46400BB6EDB /* EnterDebuggerUserClient.hpp */,
85 | 6FF845361E38F5AF00BB6EDB /* EnterDebuggerUserClientShared.h */,
86 | 6FF845211E38F37500BB6EDB /* Info.plist */,
87 | );
88 | path = EnterDebugger;
89 | sourceTree = "";
90 | };
91 | 6FF8452C1E38F41300BB6EDB /* EnterDebuggerClient */ = {
92 | isa = PBXGroup;
93 | children = (
94 | 6FF8452D1E38F41300BB6EDB /* main.m */,
95 | );
96 | path = EnterDebuggerClient;
97 | sourceTree = "";
98 | };
99 | /* End PBXGroup section */
100 |
101 | /* Begin PBXHeadersBuildPhase section */
102 | 6FF845171E38F37500BB6EDB /* Headers */ = {
103 | isa = PBXHeadersBuildPhase;
104 | buildActionMask = 2147483647;
105 | files = (
106 | 6FF845351E38F46400BB6EDB /* EnterDebuggerUserClient.hpp in Headers */,
107 | 6FF8451E1E38F37500BB6EDB /* EnterDebugger.hpp in Headers */,
108 | 6FF845371E38F5AF00BB6EDB /* EnterDebuggerUserClientShared.h in Headers */,
109 | );
110 | runOnlyForDeploymentPostprocessing = 0;
111 | };
112 | /* End PBXHeadersBuildPhase section */
113 |
114 | /* Begin PBXNativeTarget section */
115 | 6FF845191E38F37500BB6EDB /* EnterDebugger */ = {
116 | isa = PBXNativeTarget;
117 | buildConfigurationList = 6FF845241E38F37500BB6EDB /* Build configuration list for PBXNativeTarget "EnterDebugger" */;
118 | buildPhases = (
119 | 6FF845151E38F37500BB6EDB /* Sources */,
120 | 6FF845161E38F37500BB6EDB /* Frameworks */,
121 | 6FF845171E38F37500BB6EDB /* Headers */,
122 | 6FF845181E38F37500BB6EDB /* Resources */,
123 | );
124 | buildRules = (
125 | );
126 | dependencies = (
127 | );
128 | name = EnterDebugger;
129 | productName = EnterDebugger;
130 | productReference = 6FF8451A1E38F37500BB6EDB /* EnterDebugger.kext */;
131 | productType = "com.apple.product-type.kernel-extension";
132 | };
133 | 6FF8452A1E38F41300BB6EDB /* EnterDebuggerClient */ = {
134 | isa = PBXNativeTarget;
135 | buildConfigurationList = 6FF8452F1E38F41300BB6EDB /* Build configuration list for PBXNativeTarget "EnterDebuggerClient" */;
136 | buildPhases = (
137 | 6FF845271E38F41300BB6EDB /* Sources */,
138 | 6FF845281E38F41300BB6EDB /* Frameworks */,
139 | 6FF845291E38F41300BB6EDB /* CopyFiles */,
140 | );
141 | buildRules = (
142 | );
143 | dependencies = (
144 | );
145 | name = EnterDebuggerClient;
146 | productName = EnterDebuggerClient;
147 | productReference = 6FF8452B1E38F41300BB6EDB /* EnterDebuggerClient */;
148 | productType = "com.apple.product-type.tool";
149 | };
150 | /* End PBXNativeTarget section */
151 |
152 | /* Begin PBXProject section */
153 | 6FF845111E38F37500BB6EDB /* Project object */ = {
154 | isa = PBXProject;
155 | attributes = {
156 | LastUpgradeCheck = 0820;
157 | ORGANIZATIONNAME = "Scott Knight";
158 | TargetAttributes = {
159 | 6FF845191E38F37500BB6EDB = {
160 | CreatedOnToolsVersion = 8.2.1;
161 | ProvisioningStyle = Automatic;
162 | };
163 | 6FF8452A1E38F41300BB6EDB = {
164 | CreatedOnToolsVersion = 8.2.1;
165 | ProvisioningStyle = Automatic;
166 | };
167 | };
168 | };
169 | buildConfigurationList = 6FF845141E38F37500BB6EDB /* Build configuration list for PBXProject "EnterDebugger" */;
170 | compatibilityVersion = "Xcode 3.2";
171 | developmentRegion = English;
172 | hasScannedForEncodings = 0;
173 | knownRegions = (
174 | en,
175 | );
176 | mainGroup = 6FF845101E38F37500BB6EDB;
177 | productRefGroup = 6FF8451B1E38F37500BB6EDB /* Products */;
178 | projectDirPath = "";
179 | projectRoot = "";
180 | targets = (
181 | 6FF845191E38F37500BB6EDB /* EnterDebugger */,
182 | 6FF8452A1E38F41300BB6EDB /* EnterDebuggerClient */,
183 | );
184 | };
185 | /* End PBXProject section */
186 |
187 | /* Begin PBXResourcesBuildPhase section */
188 | 6FF845181E38F37500BB6EDB /* Resources */ = {
189 | isa = PBXResourcesBuildPhase;
190 | buildActionMask = 2147483647;
191 | files = (
192 | );
193 | runOnlyForDeploymentPostprocessing = 0;
194 | };
195 | /* End PBXResourcesBuildPhase section */
196 |
197 | /* Begin PBXSourcesBuildPhase section */
198 | 6FF845151E38F37500BB6EDB /* Sources */ = {
199 | isa = PBXSourcesBuildPhase;
200 | buildActionMask = 2147483647;
201 | files = (
202 | 6FF845201E38F37500BB6EDB /* EnterDebugger.cpp in Sources */,
203 | 6FF845341E38F46400BB6EDB /* EnterDebuggerUserClient.cpp in Sources */,
204 | );
205 | runOnlyForDeploymentPostprocessing = 0;
206 | };
207 | 6FF845271E38F41300BB6EDB /* Sources */ = {
208 | isa = PBXSourcesBuildPhase;
209 | buildActionMask = 2147483647;
210 | files = (
211 | 6FF8452E1E38F41300BB6EDB /* main.m in Sources */,
212 | );
213 | runOnlyForDeploymentPostprocessing = 0;
214 | };
215 | /* End PBXSourcesBuildPhase section */
216 |
217 | /* Begin XCBuildConfiguration section */
218 | 6FF845221E38F37500BB6EDB /* Debug */ = {
219 | isa = XCBuildConfiguration;
220 | buildSettings = {
221 | ALWAYS_SEARCH_USER_PATHS = NO;
222 | CLANG_ANALYZER_NONNULL = YES;
223 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
224 | CLANG_CXX_LIBRARY = "libc++";
225 | CLANG_ENABLE_MODULES = YES;
226 | CLANG_ENABLE_OBJC_ARC = YES;
227 | CLANG_WARN_BOOL_CONVERSION = YES;
228 | CLANG_WARN_CONSTANT_CONVERSION = YES;
229 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
230 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
231 | CLANG_WARN_EMPTY_BODY = YES;
232 | CLANG_WARN_ENUM_CONVERSION = YES;
233 | CLANG_WARN_INFINITE_RECURSION = YES;
234 | CLANG_WARN_INT_CONVERSION = YES;
235 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
236 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
237 | CLANG_WARN_UNREACHABLE_CODE = YES;
238 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
239 | CODE_SIGN_IDENTITY = "-";
240 | COPY_PHASE_STRIP = NO;
241 | DEBUG_INFORMATION_FORMAT = dwarf;
242 | ENABLE_STRICT_OBJC_MSGSEND = YES;
243 | ENABLE_TESTABILITY = YES;
244 | GCC_C_LANGUAGE_STANDARD = gnu99;
245 | GCC_DYNAMIC_NO_PIC = NO;
246 | GCC_NO_COMMON_BLOCKS = YES;
247 | GCC_OPTIMIZATION_LEVEL = 0;
248 | GCC_PREPROCESSOR_DEFINITIONS = (
249 | "DEBUG=1",
250 | "$(inherited)",
251 | );
252 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
253 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
254 | GCC_WARN_UNDECLARED_SELECTOR = YES;
255 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
256 | GCC_WARN_UNUSED_FUNCTION = YES;
257 | GCC_WARN_UNUSED_VARIABLE = YES;
258 | MACOSX_DEPLOYMENT_TARGET = 10.12;
259 | MTL_ENABLE_DEBUG_INFO = YES;
260 | ONLY_ACTIVE_ARCH = YES;
261 | SDKROOT = macosx;
262 | };
263 | name = Debug;
264 | };
265 | 6FF845231E38F37500BB6EDB /* Release */ = {
266 | isa = XCBuildConfiguration;
267 | buildSettings = {
268 | ALWAYS_SEARCH_USER_PATHS = NO;
269 | CLANG_ANALYZER_NONNULL = YES;
270 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
271 | CLANG_CXX_LIBRARY = "libc++";
272 | CLANG_ENABLE_MODULES = YES;
273 | CLANG_ENABLE_OBJC_ARC = YES;
274 | CLANG_WARN_BOOL_CONVERSION = YES;
275 | CLANG_WARN_CONSTANT_CONVERSION = YES;
276 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
277 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
278 | CLANG_WARN_EMPTY_BODY = YES;
279 | CLANG_WARN_ENUM_CONVERSION = YES;
280 | CLANG_WARN_INFINITE_RECURSION = YES;
281 | CLANG_WARN_INT_CONVERSION = YES;
282 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
283 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
284 | CLANG_WARN_UNREACHABLE_CODE = YES;
285 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
286 | CODE_SIGN_IDENTITY = "-";
287 | COPY_PHASE_STRIP = NO;
288 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
289 | ENABLE_NS_ASSERTIONS = NO;
290 | ENABLE_STRICT_OBJC_MSGSEND = YES;
291 | GCC_C_LANGUAGE_STANDARD = gnu99;
292 | GCC_NO_COMMON_BLOCKS = YES;
293 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
294 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
295 | GCC_WARN_UNDECLARED_SELECTOR = YES;
296 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
297 | GCC_WARN_UNUSED_FUNCTION = YES;
298 | GCC_WARN_UNUSED_VARIABLE = YES;
299 | MACOSX_DEPLOYMENT_TARGET = 10.12;
300 | MTL_ENABLE_DEBUG_INFO = NO;
301 | SDKROOT = macosx;
302 | };
303 | name = Release;
304 | };
305 | 6FF845251E38F37500BB6EDB /* Debug */ = {
306 | isa = XCBuildConfiguration;
307 | buildSettings = {
308 | COMBINE_HIDPI_IMAGES = YES;
309 | CURRENT_PROJECT_VERSION = 1.0.0d1;
310 | INFOPLIST_FILE = EnterDebugger/Info.plist;
311 | MODULE_NAME = com.scottknight.EnterDebugger;
312 | MODULE_VERSION = 1.0.0d1;
313 | PRODUCT_BUNDLE_IDENTIFIER = com.scottknight.EnterDebugger;
314 | PRODUCT_NAME = "$(TARGET_NAME)";
315 | WRAPPER_EXTENSION = kext;
316 | };
317 | name = Debug;
318 | };
319 | 6FF845261E38F37500BB6EDB /* Release */ = {
320 | isa = XCBuildConfiguration;
321 | buildSettings = {
322 | COMBINE_HIDPI_IMAGES = YES;
323 | CURRENT_PROJECT_VERSION = 1.0.0d1;
324 | INFOPLIST_FILE = EnterDebugger/Info.plist;
325 | MODULE_NAME = com.scottknight.EnterDebugger;
326 | MODULE_VERSION = 1.0.0d1;
327 | PRODUCT_BUNDLE_IDENTIFIER = com.scottknight.EnterDebugger;
328 | PRODUCT_NAME = "$(TARGET_NAME)";
329 | WRAPPER_EXTENSION = kext;
330 | };
331 | name = Release;
332 | };
333 | 6FF845301E38F41300BB6EDB /* Debug */ = {
334 | isa = XCBuildConfiguration;
335 | buildSettings = {
336 | PRODUCT_NAME = "$(TARGET_NAME)";
337 | };
338 | name = Debug;
339 | };
340 | 6FF845311E38F41300BB6EDB /* Release */ = {
341 | isa = XCBuildConfiguration;
342 | buildSettings = {
343 | PRODUCT_NAME = "$(TARGET_NAME)";
344 | };
345 | name = Release;
346 | };
347 | /* End XCBuildConfiguration section */
348 |
349 | /* Begin XCConfigurationList section */
350 | 6FF845141E38F37500BB6EDB /* Build configuration list for PBXProject "EnterDebugger" */ = {
351 | isa = XCConfigurationList;
352 | buildConfigurations = (
353 | 6FF845221E38F37500BB6EDB /* Debug */,
354 | 6FF845231E38F37500BB6EDB /* Release */,
355 | );
356 | defaultConfigurationIsVisible = 0;
357 | defaultConfigurationName = Release;
358 | };
359 | 6FF845241E38F37500BB6EDB /* Build configuration list for PBXNativeTarget "EnterDebugger" */ = {
360 | isa = XCConfigurationList;
361 | buildConfigurations = (
362 | 6FF845251E38F37500BB6EDB /* Debug */,
363 | 6FF845261E38F37500BB6EDB /* Release */,
364 | );
365 | defaultConfigurationIsVisible = 0;
366 | };
367 | 6FF8452F1E38F41300BB6EDB /* Build configuration list for PBXNativeTarget "EnterDebuggerClient" */ = {
368 | isa = XCConfigurationList;
369 | buildConfigurations = (
370 | 6FF845301E38F41300BB6EDB /* Debug */,
371 | 6FF845311E38F41300BB6EDB /* Release */,
372 | );
373 | defaultConfigurationIsVisible = 0;
374 | };
375 | /* End XCConfigurationList section */
376 | };
377 | rootObject = 6FF845111E38F37500BB6EDB /* Project object */;
378 | }
379 |
--------------------------------------------------------------------------------