【发布时间】:2020-07-08 22:39:11
【问题描述】:
我正在尝试在 macOS 上使用 Xcode 以 root 身份运行我的应用程序,但我不断收到这个奇怪的错误..
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
它实际上只是一个你好世界。我添加的只是一个 printf 到默认的 Obj-C 应用程序,尝试以 root 身份运行它,aaa 最终以 ud2 指令结束。我试过用sudo 运行Xcode,编辑方案,将两者结合起来,但没有任何效果。似乎只是想到根 shdders 会导致 Xcode 插入一些未定义的指令并崩溃。
编辑:我在昨天刚下载的 macOS Catalina 10.15.3 和 Xcode 11.4 上,这是我要运行的代码:
#import <Cocoa/Cocoa.h>
int main(int argc, const char * argv[]) {
printf("Hello world\n");
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
}
return NSApplicationMain(argc, argv);
}
“我的代码”实际上并没有做任何事情。删除 printf 仍然会导致 ud2 指令崩溃,因此 Apple 开发的实际样板在以 root 身份运行时不起作用..
【问题讨论】:
-
我想你已经检查了这个页面:stackoverflow.com/questions/1033026/debugging-in-xcode-as-root 并且你需要进行身份验证,有时你需要退出并重新启动 Xcode,对吧?如果是这样,如果您说明您使用的是哪个 Xcode 和 macOS 版本,将会有所帮助。
-
如果您发布您正在使用的确切代码也会有所帮助。
-
@PeterCordes 我不知道如何找到它。它在顶部显示“libsystem_secinit.dylib`_libsecinit_appsandbox.cold.5:”,我是否插入任何代码都没有关系。这有帮助吗?
-
另外,Apple 的系统库/框架也使用
ud2作为一种断言/中止。我猜您正在与系统完整性保护/强化运行时发生冲突。或者,我猜是沙盒。 ;) -
回溯调用堆栈以找到调用堆栈的位置。库函数名称可能会有所帮助,希望您能看到最终调用它的代码的源代码行。由于
ud2在库中,而不是在编译器为您的源代码直接发出的机器代码中,@KenThomases 的评论可能是在金钱上:作为断言/中止的非法指令以响应传递的参数它没有喜欢一些功能。我不使用 Mac 或 Objective C,所以我无能为力。 (我只是为了组装标签。)
标签: c objective-c xcode macos assembly