首页 > 解决方案 > lldb从脚本后台执行?

问题描述

在 GDB 中,您可以继续/步骤/等。&通过在命令后附加一个(例如:)在后台调试过程continue&,允许您在进程/线程运行时访问 CLI。我发现在调试多进程/多线程应用程序时,当我想在单线程单步执行时保持“不感兴趣的”线程/进程运行时,这是非常宝贵的。

我想知道 LLDB 中是否有任何等价物?具体来说,我想指定要在脚本中使用的执行模型。

我想在 LLDB 脚本中做的一个例子:

# this is just background setup for attaching to multiple processes
# I've figured out how to do this in LLDB
attach 1
add-inferior
inferior 2
attach 2
# this is the step I don't know how to get to work consistently
continue&
inferior 1
# ... do debugging work on inferior 1, possibly switching to inferior 2 as needed

我尝试过的事情:

在 LLDB 中,我在文档中找到的最接近的东西是两个“选项” --no-stdin,或者settings set target.process.disable-stdio true(我的应用程序不需要标准输入,尽管标准输出会很好)。但是,当我尝试在 LLDB 6.0 中寻找这些选项中的任何一个时,它们不再存在,或者至少不存在这些名称。

我发现的另一件事(找不到任何关于此的文档)是,如果我将 LLDB 附加到现有进程 ID,那么当我process continue从 CLI 发出时,它将始终在后台执行。但是,如果我运行 LLDB 命令脚本或让 LLDB 在本地运行进程,那么它总是“在前台”执行,并且除非我中断正在运行的命令,否则我将失去对 CLI 的控制。对我来说重要的是我能够continue&在脚本中执行类似的操作,因为我将有很多进程并且手动切换到/继续每个目标非常耗时。

标签: multithreadinglldbmultiprocess

解决方案


看起来--no-stdin已更改为(可以说更准确)--no-stdio选项,process launch而不更改概述文档。做help process launch以查看所有选项,包括那个选项。等效设置是target.disable-stdio

另请注意,lldb 的帮助已得到增强,因此以结尾的别名--- 即明确关闭向命令添加选项的别名 - 不会列出底层命令的选项。 run是 的别名process launch --,因此如果您这样做,help run您将看不到任何选项。

您还可以使用该--tty选项将输出重定向到另一个终端窗口。

就脚本命令而言。其工作方式是 lldb 可以以同步或异步模式运行进程。在同步模式下,调试器中继续进程的所有命令(和 SB API 调用)都会阻塞,直到进程再次停止。在异步模式下,控制立即返回,然后有人需要观察 lldb 事件流中的进程事件,以确定进程何时再次停止。对于命令,lldb 将为您执行此操作。对于 Python 脚本,您必须手动完成。

如果您使用的是命令行,我们会根据我们是否也尝试从进程中获取 stdio 来确定对命令行命令执行哪些操作。

对于使用 SB API 编写的脚本,无论是用作 lldb 命令行命令还是用作独立脚本,lldb 默认以同步模式运行调试器。这样可以省去您必须等待事件才能知道进程何时停止的麻烦。而且由于目前没有办法在中途“暂停”命令并返回命令行(直到什么时候?),在异步模式下运行通常不是很有用。但它在您想要发出“继续”作为 python 命令的最后一个动作并希望它异步发生的情况下很有用。然后你可以这样做:

old_async = debugger.GetAsync()    
debugger.SetAsync(True)
process.Continue()
debugger.SetAsync(old_async)

然后,当进程成功继续时,基于 Python 的命令将退出,而不是等待它再次停止。


推荐阅读