首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调试器如何标识线程?

调试器如何标识线程?
EN

Stack Overflow用户
提问于 2022-03-06 11:44:33
回答 1查看 125关注 0票数 1

当使用调试器调试mutli线程应用程序时,调试器通常会显示当前正在运行的线程。或者使用一些图形用户界面或者像info threads这样的命令。

但是线程是一个特定于操作系统的概念。虽然逻辑上相似,但每个OS都有不同的线程实现。

根据这里的说法,gcc工具链有这样的命名约定:

代码语言:javascript
运行
复制
arch-vendor-(os-)abi

例如:

  • 无-linux-gnueabi(用于linux的ARM工具链)
  • 臂-无-eabi(裸金属系统用ARM工具链)

arm部分显然表明调试器是特定于体系结构的。并且可以有一个可选的部件来指定操作系统。

调试器需要熟悉操作系统才能理解该操作系统的线程细节吗?也就是说,调试器正在显示软件线程

还是调试器只是将每个处理器核心当作一个线程?也就是说,调试器正在显示硬件线程。这种方法看起来更通用,因为它可以在相同的硬件架构上为不同的OSes工作。

当我使用特定于Zephyr的gdb连接到运行Zephyr的板时,我注意到它在开始时显示了下面的信息。

因此,调试器对于几个RTOSes确实有一些内置的知识。

这是一些特定于操作系统的东西,比如线程细节吗?还是别的什么?

加1- 3:44下午5/1/2022

(对Employed Russian的答复有一些了解。)

来自数据库的报价

libthread_db依赖于lib线程的内部实现细节。它是C++意义上的libthread的“朋友”,这正是libthread_db的“增值”。封装了调试器为操作目标进程的线程相关状态所需的lib线程内部知识。

因此,libthread隐藏底层操作系统的线程实现细节。而该操作系统的调试器可以利用它。

至于下面的情况:

还是调试器只是将每个处理器核心当作一个线程?也就是说,调试器正在显示硬件线程。这种方法似乎更为通用。 不是的。这种方法完全不适合调试(您可以在单核系统上运行多线程程序)。

看起来调试器应该足够好,可以提供一些软件线程抽象来简化调试。但我认为,这只能为一些著名的OSes.如果我写了一个只有我知道线程内部的唯一操作系统呢?这是裸金属调试器(如arm-none-eabi (ARM toolchain for bare-metal systems))吗?

EN

回答 1

Stack Overflow用户

发布于 2022-03-06 20:48:06

调试器需要熟悉操作系统才能理解该操作系统的线程细节吗?

不一定。调试器可以利用数据库 (线程库实现的一部分),它提供了特定实现的详细信息。

也就是说,调试器正在显示软件线程。

是。

还是调试器只是将每个处理器核心当作一个线程?也就是说,调试器正在显示硬件线程。这种方法似乎更为通用。

不是的。这种方法完全不适合调试(您可以在单核系统上运行多线程程序)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71369962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档