【问题标题】:LLDB - automatically step, and print list of lines, until a breakpointLLDB - 自动步进并打印行列表,直到断点
【发布时间】:2021-02-21 01:07:54
【问题描述】:

我想继续执行以下命令:

(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 行 VS 第 5 行,它们实际上来自两个同名的不同文件。 **数字是指执行的顺序。

格式类似于上面,但最好可以自定义。

**如果可能的话,我还想先运行程序到某个断点,然后单步执行,直到另一个断点。

这应该怎么做?我可以使用 Python API 或 C API 吗?其他方式也是可以的。

有关 API 的答案,请务必提及用于 (1) 单步执行 (2) 检索当前行 (3) 检索完整文件路径 (4) 检查是否已到达函数 read() 的类和方法

【问题讨论】:

    标签: lldb


    【解决方案1】:

    有两种方法可以做到这一点。第一种是直接在 Script Interpreter 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()
    

    在代码中的某处设置断点。

    【讨论】:

    • 谢谢@Jim Ingham。您能否提供有关使用哪些类和方法来检索当前行和文件以及检查函数 read() 是否已到达的建议?
    • 当您停止时,找到您正在跟踪的线程(请记住,多个线程可能在任何给定时间停止,因此存储线程索引,然后使用 SBProcess.thread[IDX] 重新查找。然后从中获取第 0 帧(SBThread.frame 是按顺序排列的帧数组,因此thread.frames[0] 是当前帧)。从 SBFrame 中获取addr 属性。这将是一个 SBAddress,它具有用于line_entry 和函数。这应该可以满足您的需要。
    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    相关资源
    最近更新 更多