解决 Mac 系统下 gdb调试的问题
在mac系统下,初次使用gdb的时候可能会遇到下面的错误
(gdb) run
Starting program: /usr/local/bin/order_monitor
Unable to find Mach task port for process-id 26551: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
这是因为 Darwin 内核在你没有特殊权限的情况下,不允许调试其它进程。调试某个进程,意味着你对这个进程有完全的控制权限,所以为了防止被恶意利用,它是默认禁止的。允许 gdb 控制其它进程最好的方法就是用系统信任的证书对它进行签名。
创建证书
按照以下步骤创建代码签名的证书:
- 打开keychain Access(钥匙串) 应用程序
- 执行菜单 钥匙串访问->证书助理->创建证书
-
填写如下信息:
- 名称: gdb_codesign (可以自定义其他名称)
- 身份类型: 自签名根证书
- 证书类型: 代码签名
- 勾选: 让我覆盖这些默认设置
- 一路继续,直到指定证书位置 的步骤,然后选择 系统
- 点击“创建”,会提示数据系统登录密码,创建完成。 (注意: 如果在第四步选择系统,可能会出现创建不成功的问题,这时候可以在第四步的时候选择登录,来创建。这样在创建成功之后,将新创建的证书直接拖入左侧的系统中即可。 如果选择系统可以直接创建成功,则忽略此项注意)
- 在钥匙串访问程序中,选择左侧栏的系统和我的证书,找到刚刚创建的gdb_codesign 证书,双击打开证书信息窗口,展开信任项,设置使用此证书时:始终信任。
- 关闭证书信息窗口,系统会再次要求输入系统登录密码。
对gdb签名
执行下面的命令
codesign -fs gdb_codesign(上面创建的证书名称) $(which gdb)
注意: 上面的签名命令是在我们的mac系统是10.14(Mojave)版本之前。如果我们的系统是 10.14(Mojave) 之后的系统 需要先创建一个文件 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.debugger</key> <true/> </dict> </plist> </pre>
然后再执行
codesign --entitlements gdb-entitlement.xml -fs gdb_codesign $(which gdb)
完成之后,一定要重启系统,否则签名不会生效。
解决gdb的调试失败问题
经过上面的操作之后,解决了gdb的签名问题。但是有时候也可能会遇到下面的问题。
(gdb) run
Starting program: /usr/local/bin/order_monitor
During startup program terminated with signal ?, Unknown signal.
解决方法很简单,执行下面的命令即可
set startup-with-shell off
为了方便,此命令可以写入到个人路径下的.gdbinit 文件中。
相关文章
在 Mac 上更新 Git
发布时间:2023/04/05 浏览次数:196 分类:Git
-
在 Git 上工作时,应该使用最新版本保持更新以获得它的最新功能。 本文将讨论如何在个人计算机上安装和更新最新版本的 Homebrew 和 Git。
在 Mac 上打开 Git Bash
发布时间:2023/03/31 浏览次数:398 分类:Git
-
在 Git 中管理版本号 Git 是开发人员使用的最受欢迎和最著名的免费版本控制系统,可帮助他们在团队中安全高效地处理各种程序。 他们可以轻松地跟踪自己的项目,而无需探究彼此的任务。
在 PHP 中从 Hash_hmac() 和 Sha256 创建签名
发布时间:2023/03/29 浏览次数:63 分类:PHP
-
我们将创建基于字符串的密钥并将它们转换为秘密签名,我们将使用 hash_hmac() 方法和一些最常见的 HMAC 方法进行密码转换。我们还将使用 PHP 中的 sha256 和 hex2bin 和 bin2hex 函数创建一个复