【问题标题】:Illegal instruction (ud2) when running application with Xcode as root on macOS在 macOS 上以 Xcode 作为 root 运行应用程序时的非法指令 (ud2)
【发布时间】: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


【解决方案1】:

我尝试了从您提供的 GitHub 链接下载的项目,我可以告诉您我能够重现您报告的错误。显然,libsystem_secinit 初始化代码和当你打开权利App SandboxYES 之间存在一些不兼容。 如果您将其关闭,崩溃就会消失。

这让我想起了 Eskimo 描述的 bug,他是一位非常乐于助人的 Apple 工程师。他还描述了一些权利和libsystem_secinit 之间的不兼容。

我绝对建议您针对与反馈助手的这种不兼容问题提交一个错误。至少,Apple 的样板代码应该不会崩溃。

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 2014-08-10
    • 2022-10-05
    • 1970-01-01
    • 2016-04-11
    相关资源
    最近更新 更多