使用用户定义或 python 命令序列的 C++ 线程不会在 gdb 异步模式下停止

2024-01-23

我在嵌入式 powerpc 目标上使用 gdb 7.4.1 对使用 pthread 的多线程 C++ 程序执行一些分析。我的最终目标是使用 python 编写 gdb 脚本来自动化一些常见的分析功能。问题是,当我单独运行命令与在 gdb 用户定义的命令(或通过 python 脚本调用相同的命令)中运行命令时,我发现行为存在一些差异。

编辑:我发现this http://sourceware.org/ml/gdb/2009-01/msg00154.html参考主 gdb 邮件列表上的一个非常相似的问题。虽然我不完全遵循 Pedro 关于异步模式限制的回应,但我认为他暗示在异步模式下,用户定义的命令序列的相对时间不可信。这是我凭经验发现的。

在这两种情况下,我都会执行以下启动步骤,加载程序,设置其参数,打开异步和不间断调试模式,然后在后台运行程序:

(gdb) file myprogram
(gdb) set args --interface=eth0 --try-count=0
(gdb) set target-async on
(gdb) set pagination off
(gdb) set non-stop on
(gdb) run &

此时,如果我手动发出interrupt进而info threads命令时,我看到所有正在运行的线程的列表(除了已停止的线程之外)。那我就可以continue &并让我心满意足地重复一遍,它始终有效。当停止时,我可以检查该线程的堆栈帧,一切都很好。

但是,如果我将这些命令放入用户定义的 gdb 命令中:

(gdb) define foo
(gdb) interrupt
(gdb) info threads
(gdb) continue &
(gdb) end
(gdb) foo
Cannot execute this command while the selected thread is running.

然后 foo 打印的线程列表表明没有线程被停止,所以continue &命令返回Cannot execute this command while the selected thread is running.。我认为这是异步 gdb 命令固有的问题,因此我在中断命令后插入了一个荒谬的长时间等待,并得到了相同的行为:

(gdb) define foo
(gdb) interrupt
(gdb) shell sleep 5
(gdb) info threads
(gdb) continue &
(gdb) end
(gdb) foo
Cannot execute this command while the selected thread is running.

无论有没有 sleep 命令,我始终可以发出手动 CLI 命令并且线程会正确停止。

同样,我通过使用 python 脚本来进行线程细读,得到了相同的结果:

import gdb, time

gdb.execute("file myprogram")
gdb.execute("set args --interface=eth0 --try-count=0")
gdb.execute("set target-async on")
gdb.execute("set pagination off") 
gdb.execute("set non-stop on")
gdb.execute("run &")
time.sleep(5)
gdb.execute("interrupt")

# here, I inspect threads via gdb module interface
# in practice, they're always all running bc the program neven got interrupted
for thread in gdb.selected_inferior().threads():
    print thread.is_running(),

gdb.execute("continue &")

即使我指定,我也会得到相同的结果from_tty=True in the gdb.execute来电。另外,如果我使用continue -a它会抑制错误字符串,但不会有任何帮助,因为中断调用仍然不起作用。

那么...是这样的:

  • 驾驶舱错误?鉴于我想要实现的目标,是否有什么我遗漏或做得不正确的事情?这应该有效吗,还是我必须使用 GDB/MI 来像这样异步“驱动”gdb?
  • 时间问题?也许调用shell sleep (or python time.sleep())在这种情况下并没有像我想象的那样做。
  • 我的 pthreads 使用有问题吗?我假设由于使用手动 gdb 命令总是可以正常工作,但事实并非如此。
  • gdb问题?

Thanks.


我认为这很可能是 gdb 问题。我对劣质控制的了解还不够,所以无法更有信心。我确实知道较差的控制通常还没有连接到Python......

值得尝试的一件事是使用一个单独的 Python 线程来执行等待,然后使用 gdb.post_event 向主 gdb 线程发送“中断”命令。

然后,不要同步检查线程或在“中断”后执行工作,而是使用 gdb.events.stop 事件源来触发您的操作。

请慷慨地提交有关 Python API 中漏洞的错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用用户定义或 python 命令序列的 C++ 线程不会在 gdb 异步模式下停止 的相关文章

随机推荐

  • 类型错误:图像数据的形状无效(3072)

    这是我的事情 我不想在 Colab 上运行 而是想读取本地 CIFAR10 数据集并使用以下代码玩 CNNcolab https colab research google com github tensorflow docs blob m
  • 为什么 devise 不通过 gmail smtp 发送电子邮件?

    我正在使用设备进行身份验证 它提供了一个忘记密码的链接 当我发送电子邮件时 电子邮件未发送 以下是我使用过的设置 你能告诉我为什么 gmail 不发送电子邮件吗 我还打开了 允许不太安全的应用程序发送电子邮件 并且还在 gmail 设置中启
  • SQL Server 时区

    使用 AT TIME ZONE 有一种方法可以获取我的 UTC 时间 而无需在查询中使用 LEFT 结尾的 00 00 AT 我正在这样做 SELECT GETDATE AT TIME ZONE EASTERN standard time
  • SKProductsRequest 返回空结果

    我查看了其他一些答案 它们似乎对我的情况没有帮助 我有一个新应用程序即将首次发布 我正在处理 应用程序内购买 部分 我在之前的应用程序中使用过 IAP 所以我认为转移应该是直接的 然而 问题是 每当我运行 SKProductsRequest
  • 在 C++ 中格式化输出

    在 C 代码中 我有一个双变量矩阵 我将其打印出来 然而 由于它们的位数不同 输出格式被破坏 一种解决方案是做cout precision 5 但我希望不同的列有不同的精度 此外 由于在某些情况下存在负值 因此 标志也会引起问题 如何解决这
  • 为什么尝试写入大文件会导致 js 堆内存不足

    这段代码 const file require fs createWriteStream test dat for var i 0 i lt 1e7 i file write a 运行大约 30 秒后出现此错误消息 lt Last few
  • 无法使用 Windows 10 安装 Firebase Tools cli

    您好 我无法在 Windows 中通过命令行安装 firebase 工具 我使用下面的命令 npm install g firebase tools 输入此命令后 我收到以下错误 npm 错误 路径 C Users data AppData
  • 使用 OpenSSL API 读取公钥的密码回调

    当使用公钥加密技术时 通常习惯以加密格式存储私钥 因为它们当然应该是秘密的 这反映在 OpenSSL C API 中 它提供了诸如PEM write PrivateKey 它采用一个可选密码作为函数参数 用于加密密钥 如 AES 然后 当从
  • 通过 Amazon SNS 和 Unity 的 iOS APNS - 无法创建开发 iOS 证书

    我正在尝试通过 Unity 中的 Amazon SNS 设置推送通知 我的 Android 方面工作得很好 但 iOS 方面却遇到了问题 我能够让设备注册到苹果生产SNS 应用程序并订阅主题 但一旦我尝试发送通知 端点 已启用 状态就会变为
  • Javascript:“取消”动态脚本标签?

    我使用动态脚本标签从外部域请求 javascript 有时请求花费的时间太长 如果请求时间太长 是否可以停止请求或超时 我不想使用 xmlhttprequest 因为我想避免使用服务器端代理 Thanks 话虽如此 动态添加脚本有多种方法
  • x/2 和 x>>1 或 x*2 和 x << 1 之间的差异,其中 x 是整数

    正如我们所知 计算整数 x 2 我们只需编写y x 2 对于 x 2 也类似 但优秀的程序员会使用位操作来计算这个值 他们只是做y x gt gt 1 这两种方法有什么区别吗 我所说的差异是指所需时间 空间 内存的差异 或者两者完全相同 即
  • 如何获取select2:unselect的值

    我怎样才能获得未选择选项的值Select2 https select2 github io using select2 unselect mySelect on select2 unselect function e var unselec
  • 重命名android中的包名称

    我想在我的项目中重命名包名称 到目前为止我有 9 个包 当我更改包名称时 更改是在 java 和 xml 文件中完成的 但在Manifest xml文件中 活动定义部分 包活动在重命名包后不会改变 请帮我 Android Tools 中有一
  • Camel - 流缓存不缓存/无法转换?

    读完一遍之后 我似乎失去了 内在 的身体 请注意 我使用的是 Camel 的流缓存 并且输入是来自 http 组件的 json 文件 我有一个带有以下代码的处理器 log debug Body Type exchange getIn get
  • 使用 jsonp 来自 Jquery 的 REST WCF url 中的 javascript 错误

    当我尝试从 jsonp 执行 REST WCF 服务时 出现 javascript 错误 网页错误详细信息 User Agent Mozilla 4 0 compatible MSIE 8 0 Windows NT 6 1 WOW64 Tr
  • 如何在Android RxJava中使用flatMap在不使用lambda函数的情况下顺序调用三个Web服务?

    我的 API 客户端 public class ApiClient public static final String BASE URL http baseurl com wp json private static Retrofit r
  • 生成 test-jar 以及测试包中的 jar 文件

    我想将我的测试包打包成jar文件 如何从maven插件Surefire执行生成test jar 通过使用以下配置 您可以从测试中创建一个 jar
  • 相当于 Python 2 中 BytesIO 的 getbuffer

    在Python 3中 我可以通过以下方式获取ByteIO对象的大小object getbuffer nbytes where object ByteIO 但是什么是最好的等价物getbuffer 在 Python 2 中 做了一些探索 我发
  • Bash 中对除数进行四舍五入

    我如何舍入两个除数的结果 例如 3 2 就像我做的时候一样 testOne 3 2 testOne 包含 1 而它应该四舍五入为 2 作为 3 2 1 5 的答案 要在截断算术中进行舍入 只需添加 denom 1 到分子 示例 向下舍入 N
  • 使用用户定义或 python 命令序列的 C++ 线程不会在 gdb 异步模式下停止

    我在嵌入式 powerpc 目标上使用 gdb 7 4 1 对使用 pthread 的多线程 C 程序执行一些分析 我的最终目标是使用 python 编写 gdb 脚本来自动化一些常见的分析功能 问题是 当我单独运行命令与在 gdb 用户定