debugging XCode/LLDB:LLDB可以在调用函数上中断吗?

9vw9lbht  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(177)

我在-[CALayer setSpeed:]上设置了一个符号断点,并且我希望仅在特定函数调用该函数时才触发该断点
-[UIPercentDrivenInteractiveTransition _updateInteractiveTransition:percent:isFinished:didComplete:]
有什么办法吗?
我可以通过bt 2手动查看调用函数的值。是否有某种方法可以在断点条件中执行与此输出的字符串比较?
谢谢!

zbwhf8kr

zbwhf8kr1#

您可以在断点上编写一些python脚本来实现这一点,这意味着每次遇到断点时,lldb都会停止进程,然后重新开始--对于像objc_msgSend这样的热门函数来说,这将极大地影响性能。
在homedir中创建一个包含以下内容的python函数,例如~/lldb/stopifcaller.py

import lldb
def stop_if_caller(current_frame, function_of_interest):
  thread = current_frame.GetThread()
  if thread.GetNumFrames() > 1:
    if thread.GetFrameAtIndex(1).GetFunctionName() != function_of_interest:
      thread.GetProcess().Continue()

那就把

command script import ~/lldb/stopifcaller.py

~/.lldbinit文件中。
在lldb中这样使用它:

(lldb) br s -n bar
Breakpoint 1: where = a.out`bar + 15 at a.c:5, address = 0x0000000100000e7f
(lldb) br comm add --script-type python -o "stopifcaller.stop_if_caller(frame, 'foo')" 1

这样就完成了--断点1(在bar()上)只有在调用者帧是foo()时才会停止,或者换句话说,如果调用者帧不是foo(),它就会继续。

相关问题