当使用调试器调试mutli线程应用程序时,调试器通常会显示当前正在运行的线程。或者使用一些图形用户界面或者像info threads这样的命令。
但是线程是一个特定于操作系统的概念。虽然逻辑上相似,但每个OS都有不同的线程实现。
根据这里的说法,gcc工具链有这样的命名约定:
arch-vendor-(os-)abi例如:
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))吗?
发布于 2022-03-06 20:48:06
调试器需要熟悉操作系统才能理解该操作系统的线程细节吗?
不一定。调试器可以利用数据库 (线程库实现的一部分),它提供了特定实现的详细信息。
也就是说,调试器正在显示软件线程。
是。
还是调试器只是将每个处理器核心当作一个线程?也就是说,调试器正在显示硬件线程。这种方法似乎更为通用。
不是的。这种方法完全不适合调试(您可以在单核系统上运行多线程程序)。
https://stackoverflow.com/questions/71369962
复制相似问题