lldb 跳过 objc_msgSend
lldb skip objc_msgSend
我正在尝试确定 Apple 在 NSWorkspace
上公开的方法在内部如何工作,以便尝试解决该方法的不幸副作用(它会写入磁盘,每次调用它时).我可以将 lldb 附加到我的可执行文件并在调用该方法时设置一个断点,然后使用 si
进入 objc_msgSend
等等,但我更愿意直接跳过直到我到达该方法body, 有什么方法可以在方法体的开头设置断点,或者在跳转到方法体之前的objc_msgSend
中的指令?
您可以通过这样的方式将断点设置到实际的方法体本身
br s -n "-[NSWorkspace openURL:]"
lldb 的源级 step
命令将始终为您传递 objc_msgSend 蹦床代码,在目标实现中停止,而不管实现位于何处。
但是,默认情况下,lldb 也会自动退出没有调试信息的方法。这在很大程度上是人们想要的行为,但在这种情况下并不是你想要的。幸运的是,您可以通过以下方式关闭后一种行为:
(lldb) step -a 0
或者通常通过设置控制它的全局默认值:
(lldb) set set target.process.thread.step-in-avoid-nodebug 0
我正在尝试确定 Apple 在 NSWorkspace
上公开的方法在内部如何工作,以便尝试解决该方法的不幸副作用(它会写入磁盘,每次调用它时).我可以将 lldb 附加到我的可执行文件并在调用该方法时设置一个断点,然后使用 si
进入 objc_msgSend
等等,但我更愿意直接跳过直到我到达该方法body, 有什么方法可以在方法体的开头设置断点,或者在跳转到方法体之前的objc_msgSend
中的指令?
您可以通过这样的方式将断点设置到实际的方法体本身
br s -n "-[NSWorkspace openURL:]"
lldb 的源级 step
命令将始终为您传递 objc_msgSend 蹦床代码,在目标实现中停止,而不管实现位于何处。
但是,默认情况下,lldb 也会自动退出没有调试信息的方法。这在很大程度上是人们想要的行为,但在这种情况下并不是你想要的。幸运的是,您可以通过以下方式关闭后一种行为:
(lldb) step -a 0
或者通常通过设置控制它的全局默认值:
(lldb) set set target.process.thread.step-in-avoid-nodebug 0