关于多线程:从脚本中执行lldb后台执行?

lldb background execution from script?

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

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

我想在LLDB脚本中执行的操作的示例:

1
2
3
4
5
6
7
8
9
10
# 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中,我在文档中找到的最接近的东西是两个" options " --no-stdinsettings set target.process.disable-stdio true(我不需要我的应用程序使用stdin,尽管stdout会很好) 。但是,当我尝试在LLDB 6.0中查找这些选项中的任何一个时,它们不再存在,或者至少不存在这些名称。

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


看起来--no-stdin更改为(可能更准确)--no-stdio选项更改为process launch,而没有更改概述文档。执行help process launch查看所有选项,包括该选项。等效设置为target.disable-stdio

还请注意,增强了lldb的帮助,以便以--结尾的别名-即显式关闭向该命令添加选项的行为-不列出基础命令的选项。 runprocess launch --的别名,因此,如果执行help run,则不会看到任何选项。

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

就脚本命令而言。这种工作方式是lldb可以以同步或异步模式运行进程。在同步模式下,调试器中的所有命令(和SB API调用)将继续执行流程块,直到流程再次停止。在异步模式下,控制权立即返回,然后有人需要监视lldb事件流以获取进程事件,以弄清该进程何时再次停止。对于命令,lldb会为您完成。对于Python脚本,您必须手动执行。

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

对于使用SB API编写的脚本,当用作lldb命令行命令或用作独立脚本时,默认情况下lldb以同步模式运行调试器。这样可以省去等待事件知道进程何时停止的麻烦。而且,由于目前尚没有一种方法可以"暂停"命令的中途运行并返回命令行(直到何时?),所以以异步模式运行通常不是很有用。但是在您要发出" continue"作为python命令的最后一个动作并希望异步发生的情况下,它很有用。然后您可以执行以下操作:

1
2
3
4
old_async = debugger.GetAsync()    
debugger.SetAsync(True)
process.Continue()
debugger.SetAsync(old_async)

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