当前位置: 首页 > 知识库问答 >
问题:

gdb多线程调试如何与Linux线程调度协调?

左康安
2023-03-14

在使用gdb调试多线程程序时,可以做到

1. switching between existing thread
2. step debugging 
3. etc.

同时,进程及其线程作为操作系统的资源,由Linux内核管理和控制。当gdb从另一个线程(t2)切换到一个线程(例如t1)时,它如何与内核协调,因为内核可能仍然希望在一段时间内运行t2。另外,当gdb step在一个特定线程中调试时(通过发出“si”命令),其他线程在此期间如何运行(或完全暂停)?

共有1个答案

尹辰沛
2023-03-14

当gdb从另一个线程(t2)切换到一个线程(例如t1)时,它如何与内核协调,因为内核可能仍然希望在一段时间内运行t2。

默认情况下,GDB以全停模式运行。这意味着每当看到(gdb)提示符时,所有线程都会停止。在2个停止的线程之间切换不需要与内核进行任何协调,因为内核不会运行不可运行的(停止的)线程。

在非停止模式下,当前线程以外的线程可以自由运行,内核可以并将调度它们,让它们在它认为合适的时候运行。

 类似资料:
  • 问题内容: 我有一个使用两个线程的程序。我已经在两个线程中都设置了断点。在gdb下运行程序时,我想在线程之间切换并使其运行。(线程t1是活动的并且正在运行,线程t2;在断点处暂停时。我想停止T1的运行并运行T2)。 有什么办法可以安排gdb中的线程? 问题答案: 如果您使用的是GDB 7或更高版本,请尝试“不间断模式”。 http://sourceware.org/gdb/current/onli

  • 问题内容: 我试图了解Linux如何处理进程调度和线程调度。我读过Linux可以安排进程和线程。 Linux是否具有线程调度程序和进程调度程序?如果是,他们如何合作? 问题答案: 的Linux内核调度器被实际调度的任务,并且这些要么螺纹或(单线程)工艺。 因此,在调度程序的上下文中, 任务 (内核内部)是正在调度的事物,可以是某些 内核线程( 例如或),多线程进程的某些 用户线程 (例如)或单线程

  • 调度器 调度器的算法有许多种,我们将它提取出一个 trait 作为接口 os/src/algorithm/src/scheduler/mod.rs /// 线程调度器 /// /// 这里 `ThreadType` 就是 `Arc<Thread>` pub trait Scheduler<ThreadType: Clone + Eq>: Default { /// 优先级的类型 t

  • 问题内容: 在阅读了这样的问题之后,我有了一些疑问。请帮助理解。 调度涉及确定何时运行流程以及运行时间的多少。 linux内核是否调度线程或进程?由于内核中的进程和线程没有区别,调度程序如何对待它们? 如何确定每个线程的数量?一个。如果为一个进程确定了一个时间量(例如100us),是在该进程的所有线程之间共享该时间吗?或b。每个线程的数量由调度程序决定吗? 注意:问题1和问题2是相关的,可能看起来

  • 主要内容:1 Java 线程调度程序,2 抢占式调度与时间片调度的区别1 Java 线程调度程序 Java中的线程调度程序是JVM(Java虚拟机)的一部分,它决定应该运行哪个线程。 我们无法保证线程调度程序将会选择哪个线程来运行。 一次只能在一个进程中运行一个线程。线程调度程序主要使用抢占式或时间片调度来调度线程。 2 抢占式调度与时间片调度的区别 在抢占式调度下,最高优先级的任务会一直执行,直到进入等待状态或死机状态或存在更高优先级的任务为止。 在时间分片调度下

  • 我有一个MainClass,一个Worker类和一个Supervisor类。在MainClass中,我创建了10个Worker类和一个Supervisor类,它们在不同的线程中运行。 . . 我不知道如何实现这个,因为每个线程中的条件是相互独立的,所以我不需要同步,所以我不能使用等待通知。

  • 问题内容: 如果我们在Linux上使用默认调度策略创建pthreads(pthread_create)或进程(fork),那么调度程序在调度进程和线程时会优先处理优先级相同的进程和线程吗? 假设有一个进程P1有一个线程,有进程P2有2个线程T1 T2 可以说只有一个核心..调度将是P1 T1 P1 T2 P1 T1 P1 T2 要么 P1 T1 T2 P1 T1 T2 问题答案: Linux不再计

  • 我一直在阅读有关多线程的Head First。我对多线程的了解是: 当我们使用Thread类的对象调用start()时,线程将进入可运行状态。因此,所有线程在通过这些线程的对象调用start()后都会进入可运行状态。它是JVM线程调度器,它从可运行状态随机选择线程,使其处于运行状态。进入运行状态后,该特定线程的已确定调用堆栈将被执行。 同样,JVM线程调度器可以通过将线程从运行状态切换到可运行状态