lldb跳过objc_msgSend

时间:2015-10-16 15:14:02

标签: objective-c macos reverse-engineering lldb

我正在尝试确定Apple在NSWorkspace上公开的方法如何在内部工作,以便尝试解决该方法的不幸副作用(每次调用它时写入磁盘)。我可以将lldb附加到我的可执行文件并在调用方法时设置断点,然后将si导入objc_msgSend并打开,但我更愿意跳过,直到我找到方法body,有没有办法在方法体的开头设置断点,或者在跳转到方法体之前的objc_msgSend中设置指令?

2 个答案:

答案 0 :(得分:2)

您可以通过类似

之类的东西为实际方法体本身设置断点
br s -n "-[NSWorkspace openURL:]"

答案 1 :(得分:1)

lldb的源级step命令将始终为您传递objc_msgSend trampoline代码,停止在目标实现中,无论实现位于何处。

但是,lldb默认情况下也会自动退出没有调试信息的方法。这在很大程度上是人们想要的行为,但在这种情况下并不是你想要的。幸运的是,您可以通过执行以下步骤关闭后一种行为:

(lldb) step -a 0

或通常通过设置控制此的全局默认值:

(lldb) set set target.process.thread.step-in-avoid-nodebug 0