我想将断点添加到方法rb_vm_check_ints
中,但是仅当从rb_ary_collect_bang
内部调用断点时才可以。有几个线程正在执行。
答案 0 :(得分:2)
作为吉姆回答的后续措施,这也可以作为一个衬套完成,而无需创建命名函数:
breakpoint command add -s python -o 'return frame.parent.name == "rb_ary_collect_bang"'
lldb为您创建一个包装函数(它具有一个frame
参数),关键是return
比较的结果,因为正如Jim所说,如果结果为lldb将会停止true,如果结果为false,则继续操作。
这可以扩展为查看堆栈中的任何调用函数:
br c add -s python -o 'return any(f.name == "rb_ary_collect_bang" for f in frame.thread)'
这个不透明。表达式frame.thread
是当前线程堆栈上所有帧的迭代器。表达式[f.name for f in frame.thread]
将为您提供堆栈上所有函数名称的列表。如果函数“ abc”在堆栈中的任何位置,则表达式any(f.name == "abc" for f in frame.thread)
将返回true。
对于这些情况,GDB有一些辅助函数,我为lldb写了类似的set函数。 https://github.com/kastiglione/lldb-helpers。使用这些功能,您可以编写:
break com add -F 'caller_is("rb_ary_collect_bang")'
答案 1 :(得分:1)
您需要编写Python断点回调。在这里描述:
http://lldb.llvm.org/python-reference.html
“遇到断点时运行Python脚本”部分中的
。
您会在文档中发现的一件事是,如果回调返回False,则lldb不会因该断点命中而停止。
此外,传递给回调的参数之一是包含刚到达断点的代码的框架。框架对象实际上是lldb.SBFrame对象。 SBFrame的文档在这里:
http://lldb.llvm.org/python_reference/lldb.SBFrame-class.html
SBFrame的parent
属性返回调用方框架。 name
属性返回函数名称。所以你想做类似的事情:
def MyCallback(frame, bp_loc, dict):
if frame.parent.name == "rb_ary_collect_bang":
return True
else
return False