在 Linux 系统下,安装 GDB 调试工具可能仅仅只是一行 Shell 命令的事情。
尽管 macOS 和 Linux 一样都采用了 POSIX 标准,但是 macOS 自身并不带有软件包管理工具,需要借助第三方的工具。
macOS 有一个很流行的第三方软件包管理工具 Brew,本文关于 Brew 的安装并不加以叙述。
在有了软件包管理工具后,我们可以在终端执行如下这条 Shell 命令即可安装 GDB 调试工具。
brew install gdb
执行结果如下图所示。
根据 Brew 在终端中的提示,我们已经成功地在 macOS 上安装了 GDB 调试工具。
但是请注意最后 Caveats 到 Summary 中间的提示。
尽管我们可以在 macOS 和 Linux 下轻松地使用 GDB 调试工具,但是 macOS 与 Linux 不同的是,我们还需要额外地为 GDB 调试工具赋予特殊权限。
macOS 采用的是类 Unix 的内核 Darwin,它要求其系统上的调试工具在使用时都要有特殊的系统管理员许可证书,因为调试工具其自身涉及到对其他进程的操纵。
我们通过以下步骤来对我们安装的 GDB 调试工具建立签名。
启动 macOS 系统自带的「钥匙串访问」工具。
点击左上角菜单的「钥匙串访问」,选择「证书助理」,再选择「创建证书」。
在弹出的窗口中,输入名称为:「gdb_codesign」。
证书类型选择「代码签名」,并勾选「让我覆盖这些默认值」。
一路点击「继续」按钮,直到向导来到「指定用于该证书的位置」。
在窗口中的「钥匙串」下拉选项中选择「系统」,最后点击「创建」按钮。
那么用来给 GDB 调试工具提权的签名就创建成功了。
回到「钥匙串访问」程序,在左侧选项栏目的「种类」中选择「我的证书」,可以找到我们刚刚创建的证书「gdb_codesign」。
选中它,单击右键,在弹出的菜单栏中选择「显示简介」。
在弹出的窗口中,找到「信任」栏目,展开。
在「使用此证书时:」下拉选项中选择「始终信任」。
此时会弹出窗口提示我们输入用户密码或使用触控 ID 进行验证。
至此我们的证书就成功创建并配置完成了。
接下来要将这个证书颁发给 GDB 调试工具。
在颁发之前我们还需要建立一个 .xml 文件,用于配置被颁发证书的 GDB 调试工具将拥有的权限。
在当前工作目录下新建一个文件 gdb-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.cs.allow-jit</key> <true/> <key>com.apple.security.cs.allow-unsigned-executable-memory</key> <true/> <key>com.apple.security.cs.allow-dyld-environment-variables</key> <true/> <key>com.apple.security.cs.disable-library-validation</key> <true/> <key>com.apple.security.cs.disable-executable-page-protection</key> <true/> <key>com.apple.security.cs.debugger</key> <true/> <key>com.apple.security.get-task-allow</key> <true/> </dict> </plist> </pre>
在终端中执行如下命令,颁发证书。
codesign --entitlements gdb-entitlement.xml -fs gdb_codesign $(which gdb)
此时系统会提示让我们输入用户名和密码,照做就是。
这时我们就成功地把创建的证书颁发给 GDB 调试工具并为其赋予了调试器权限。
在 macOS Sierra 版本以后,GDB 调试工具还需要进行最后一项配置。
接下来在终端执行一条命令,来禁止 GDB 调试工具以 Shell 的方式运行程序。如果不禁止,GDB 工具在执行 run 命令的时候被调试程序会停住。
echo "set startup-with-shell off" >> ~/.gdbinit
接下来我们重启电脑,使上文中的设置生效。
那么至此呢,GDB 调试工具在 macOS 上的安装和配置就大功告成了!
后记
笔者惊讶地发现,目前在国内的网站上虽然有不少关于在 macOS 系统下 GDB 调试工具的安装和配置。但没想到的是,这些教程都已经过期过时。苹果在较新的版本系统中加强了对调试器程序的权限控制和管理(SIP),需要采用新的方式。因此写下本文,供开发者们参考学习。
1 条评论
MX福利 · 2020年11月17日 下午12:03
没用过Mac