我可以收到发送 nil 对象消息的警告吗?

发布于 2024-08-07 19:50:45 字数 88 浏览 3 评论 0原文

我知道在 Objective-C 中向 nil 对象发送消息是完全可以的。但是,我很好奇是否有任何运行时支持来标记此类情况。我可以看到这在测试/调试情况下很有用。

I'm aware that it's perfectly fine to send messages to nil objects in Objective-C. However, I am curious if there is any runtime support for flagging such situations. I can see this being useful in testing/debugging situations.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

护你周全 2024-08-14 19:50:45

经过一番摆弄调试器后,我发现了这一点。

您可以在 objc_msgSend 中设置断点,断点条件为第一个参数为零(接收者):

  1. 打开“断点”窗口:Command-Option-B
  2. 双击最后一行以创建一个新的符号断点
  3. 输入符号:objc_msgSend
  4. 在“Condition”栏中输入条件:*(int*)($esp+4) == 0

运行时你的可执行文件会经常中断,因为向 nil 发送消息是很常见的。要了解正在发生的情况,您可以进一步配置断点:

  1. 按加号按钮添加断点命令。
  2. 从弹出窗口中选择“调试器命令”。
  3. 在命令字段中输入 p (char*)*(int*)($esp+8)
  4. 单击断点行中的“自动继续”复选框(最后一个带有小箭头的复选框)列)

当您现在继续执行时,您将在调试器控制台中看到所有消息名称(被发送到 nil)。

以上所有内容仅适用于 Intel Mac(模拟器中的 32 位 Cocoa 或 Cocoa Touch)。 PPC 或 ARM 架构使用其他寄存器名称和调用约定。我将其作为练习留给您,以了解如何在这些平台上实现此功能;)

After a little fiddling with the debugger this is what I found out.

You can set a breakpoint in objc_msgSend with a breakpoint condition on the first argument to be zero (the receiver):

  1. Open the "Breakpoints" window: Command-Option-B
  2. Double click on the last row to create a new symbolic breakpoint
  3. Enter the symbol: objc_msgSend
  4. Enter the condition in the "Condition" column: *(int*)($esp+4) == 0

When you run your executable it will break very often since it's very common to send messages to nil. To get an overview of what's happening you can further configure your breakpoint:

  1. Press the plus button to add a breakpoint command.
  2. Select "Debugger Command" from the popup.
  3. Enter p (char*)*(int*)($esp+8) in the command field
  4. Click the "auto-continue" checkbox in the breakpoint row (the one with the little arrow in the last column)

When you now continue execution, you will see all the message names (being sent to nil) in the debugger console.

All the above is working on Intel Macs only (32 bit Cocoa or Cocoa Touch in the simulator). PPC or ARM architectures use other register names and calling conventions. I leave it as an exercise to you to find out how to get this working on these platforms ;)

独行侠 2024-08-14 19:50:45

或者,您可以使用 dtrace:

使用 dtrace 记录消息到 nil 的日志

这可以是 也在 Instruments 中完成

Alternatively, you can use dtrace:

Using dtrace to log traces messages-to-nil

And this can be done in Instruments, too.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文