Xcode lldb 无法附加到 MacOS 系统程序 /bin/cp -“不允许附加到进程。”

Posted

技术标签:

【中文标题】Xcode lldb 无法附加到 MacOS 系统程序 /bin/cp -“不允许附加到进程。”【英文标题】:Xcode lldb can't attach to MacOS system program /bin/cp - "Not allowed to attach to process." 【发布时间】:2021-06-09 00:47:32 【问题描述】:

当我尝试使用 Xcode 12.4 中包含的 LLDB 在 macOS Catalina 10.15.7 和 Big Sur 11.2.2 上运行 Unix cp 命令时,LLDB 在我启动进程时冻结几秒钟,然后失败并显示以下错误:

error: process exited with status -1 (attach failed (Not allowed to attach to process。查看控制台消息 (Console.app),在附加失败时靠近调试服务器条目。拒绝附加权限的子系统将可能已经记录了一条关于为什么它被拒绝的信息性消息。))

在控制台中,我看到来自 LLDB debugserver 引擎服务器进程的相同错误的 10 个副本,正如所承诺的那样:

错误:MachTask::TaskPortForProcessID task_for_pid 失败:::task_for_pid (target_tport = 0x0103, pid = 44753, &task) => err = 0x00000005((os/kern) 失败)

在进程运行时附加到进程,无论是从lldb 命令行还是从 Xcode IDE,都会产生相同的错误消息,就像尝试使用 sudo lldb 运行调试器和调试的进程一样。

我可以做些什么来解决这个问题?


终端会话的完整记录:

$ lldb --version
lldb-1200.0.44.2
Apple Swift version 5.3.2 (swiftlang-1200.0.45 clang-1200.0.32.28)

$ lldb cp /etc/profile ~/scratchfile.txt
(lldb) target create "cp"
Current executable set to 'cp' (x86_64).
(lldb) settings set -- target.run-args  "/etc/profile" "/Users/me/scratchfile.txt"
(lldb) run
error: process exited with status -1 (attach failed (Not allowed to attach to process.  Look in the console messages (Console.app), near the debugserver entries when the attached failed.  The subsystem that denied the attach permission will likely have logged an informative message about why it was denied.))

【问题讨论】:

我的猜测是cp 没有get-task-allow entitlement 显示,所以你必须在启动设置中disable system integrity protection 来调试它。但我还没有尝试过这个修复。 【参考方案1】:

基本上,macOS 上的 lldb 现在要求您的应用使用 get-task-allow 权利进行签名,该权利允许其他进程(如调试器)附加到您的应用。或者,您也可以禁用系统完整性保护 (SIP),但这是非常不可取的,因为它会使您的 PC 面临安全风险。

codesign --entitlements debuggee-entitlement.xml ...

debuggee-entitlement.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.get-task-allow</key>
    <true/>
</dict>
</plist>

Source: how to debug your app in Qt Creator on macOS (lldb workaround)

【讨论】:

道歉 - 澄清一下,我的问题不是“为什么 my 应用程序不可调试”,而是“为什么这个 system 程序不可调试”。所以不幸的是,我认为我不能接受这个答案,尽管我怀疑它正朝着正确的方向前进,正如我在对问题的评论中提到的那样,因为codesign -d /bin/cp --entitlements - 没有打印任何权利信息。 @MichaelRatanapintha 同样适用于应用程序也适用于系统程序。在 macOS 中签名的任何内容都不可调试,除非它具有使其可调试的权利。

以上是关于Xcode lldb 无法附加到 MacOS 系统程序 /bin/cp -“不允许附加到进程。”的主要内容,如果未能解决你的问题,请参考以下文章

[转] Xcode 高级调试技巧

IOS逆向学习-动态调试原理LLDB

编写 Python 脚本以在 lldb 中打印出一个 recs 数组

iOS - Xcode 错误:由于系统完整性保护而无法附加到进程

为啥 Xcode 不能附加到某些程序?

开发投稿1macOS 系统版本升级导致cocoapods无法使用的解决办法