我想继续执行以下命令:
(lldb) s直到它到达断点。或者仅仅是当它达到某个功能时(例如,read())
在此过程中,我希望按执行的顺序保存行号列表(以及文件的完整路径)。因此,对于例如。保存为如下所示的文件(LOG.csv):
Number;LineNumber;FilePath
1;1080;/Users/user/Documents/zDEVELOP/bash-3.2.57/shell.c
2;1082;/Users/user/Documents/zDEVELOP/bash-3.2.57/shell.c
3;1083;/Users/user/Documents/zDEVELOP/bash-3.2.57/shell.c
4;40;/Users/user/Documents/zDEVELOP/bash-3.2.57/readline.c
5;71;/Users/user/Documents/zDEVELOP/bash-3.2.57/lib/readline/readline.c
6;72;/Users/user/Documents/zDEVELOP/bash-3.2.57/lib/readline/readline.c**注意需要文件的完整路径。参见第4行与第5行,它们实际上来自2个具有相同名称的不同文件。**Number是指执行的顺序。
格式将类似于上面,但最好是可以自定义的。
**如果可能的话,我还想先运行程序直到某个断点,然后单步执行到另一个断点。
这应该怎么做呢?我可以使用Python API或C API吗?其他方法也是可能的。
有关API的答案,请提及使用哪个类和方法(1)单步执行(2)检索当前行(3)检索完整文件路径(4)检查是否已到达函数read()
发布于 2021-02-23 04:46:00
有两种方法可以做到这一点。第一种方法是直接在脚本解释器REPL中使用Python (在lldb中使用script命令输入)。然后,在Python REPL中,您可以编写一个while循环,该循环执行您想执行的任何打印操作,检查您的停止条件,如果不满足,则在您要跟踪的线程上调用SBThread.StepInto或StepOver。
更多关于lldb Python API的信息在这里:
https://lldb.llvm.org/python_api.html
您需要注意的一件事是lldb的调试器有两种运行模式“同步”和“异步”。如果调试器处于“同步”模式,则使被调试程序运行的任何命令都会等待返回,直到被调试程序出于某种原因停止。在“异步”模式下,"SBThread.StepInto“、"SBThread.StepOver”等方法会立即返回,您可以使用lldb的事件系统来通知停止。前者对于您的任务来说要方便得多,因此在script会话开始时只需执行以下操作:
>>> lldb.debugger.SetAsync(False)您还可以将此逻辑打包到基于Python的命令中,如果这样使用起来更方便的话。
更奇妙的方法是使用lldb“脚本化步骤”计划。这里有几个使用方法的例子:
https://github.com/llvm/llvm-project/blob/main/lldb/examples/python/scripted_step.py
文件开头的头部有一些关于这是如何工作的解释,这里有更多的文档:
https://lldb.llvm.org/use/python-reference.html#using-the-python-api-to-create-custom-stepping-logic
虽然设置有点令人生畏,但由于您只是回复了几条简单的消息,一旦您弄清楚了它是如何工作的,最终实现起来通常都相当简单。
另一件要记住的事情是,在lldb的python解释器中运行的所有代码都共享lldb控制台。因此,如果在您编写的一些代码中调用pdb调试器,您将在控制台中看到pdb提示符,并可以查看变量和逐步执行python代码。例如,插入:
import pdb; pdb.set_trace()在代码中的某处设置断点。
https://stackoverflow.com/questions/66298178
复制相似问题