如何在最新版本的 MacOS 上调试失败的系统调用错误

问题描述 投票:0回答:0

我有一个返回权限错误的应用程序。该应用程序启动并几乎立即返回错误。

我想找出触发错误的系统调用和返回的确切错误并修复问题。在 Linux 上,我会使用 truss 来转储应用程序的系统调用,查找故障,并快速确定问题所在。但是在 MacOS 12.x 中我们有很多障碍。

到目前为止,我已经尝试过 dtruss 和 lldb:

使用 DTRUSS 进行调试

您不能以有问题的用户身份运行 DTRUSS。它需要 root 权限。

所以我需要运行

sudo dtruss sudo -u myuser myapp
.

你不能 DTRUSS sudo,因为 sudo 在 /usr/bin 中,所以我制作了一个副本,并使用

sudo codesign --remove-signature sudo
从我的副本中删除签名(否则会出现另一个错误)。

所以现在我得到这个错误:

$ sudo dtruss ./sudo -u myuser                                                                                                                                                                                                                          
dtrace: system integrity protection is on, some features will not be available
dtrace: failed to execute ./sudo: Could not create symbolicator for task

也许我需要退出应用程序并重新公证?而且我们离调试我原来的问题还差得很远。

使用 LLDB 进行调试

我能想到的另一种方法是运行 LLDB 并在 fopen 上设置断点。这不起作用,因为该应用程序需要以特定用户身份运行,因此我无法轻松地从 lldb 启动它。你不能 LLDB sudo 因为那会分叉,而 lldb 不会跟随分叉。您不能将 --wait-for 与 LLDB 一起使用,因为应用程序在 LLDB 附加之前很快关闭。

所以...

关于如何在不禁用 SIP 的情况下查看失败的系统调用,有没有人有什么好主意?或者我应该硬着头皮禁用它......

macos lldb
© www.soinside.com 2019 - 2024. All rights reserved.