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

Mic*_*tha 5 debugging xcode lldb

当我尝试使用 Xcode 12.4 附带的 LLDBcp在 macOS Catalina 10.15.7 和 Big Sur 11.2.2 上运行 Unix 命令时,当我启动该进程时,LLDB 会冻结几秒钟,然后失败并出现以下错误:

错误:进程退出,状态为 -1(附加失败(不允许附加到进程。附加失败时,请查看控制台消息 (Console.app),靠近调试服务器条目。拒绝附加权限的子系统可能会记录关于为何被拒绝的信息性消息。))

在控制台中,我看到 LLDBdebugserver引擎服务器进程中存在 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.))
Run Code Online (Sandbox Code Playgroud)

Gee*_*ser 6

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

\n
codesign --entitlements debuggee-entitlement.xml ...\n
Run Code Online (Sandbox Code Playgroud)\n

debuggee-entitlement.xml:

\n
<?xml version="1.0" encoding="UTF-8"?>\n\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">\n<dict>\n    <key>com.apple.security.get-task-allow</key>\n    <true/>\n</dict>\n</plist>\n
Run Code Online (Sandbox Code Playgroud)\n

来源:如何在 macOS 上的 Qt Creator 中调试应用程序(lldb 解决方法)

\n