multithreading - 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&
在脚本中执行类似的操作,因为我将有很多进程并且手动切换到/继续每个目标非常耗时。
解决方案
看起来--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 的命令将退出,而不是等待它再次停止。
推荐阅读
- reactjs - 为什么我在生产中收到服务器错误(500)?
- r - 如何在列的连接中放置条件
- r - 使用 tidyr,当传播值得到 NA
- php - 根据 Laravel 刀片中的状态过滤结果
- python - PyQt QFileSystemModel 在 MyWindow 中缺少参数?
- android - 具有 76800 字节的 Android TensorFlowLite 缓冲区和具有 307200 字节的 ByteBuffer
- c++ - 模板区分有符号和无符号
- javascript - 无法获取图像的大小,但长度可以吗?
- java - 如何使用流而不是循环来迭代 jsonarray?
- c++ - 结构数据成员的decltype,使用结构化绑定