【问题标题】:How to list threads in WinDbg (kernel debugging)如何在 WinDbg 中列出线程(内核调试)
【发布时间】:2012-01-27 05:36:10
【问题描述】:

有谁知道在内核调试时如何列出 WinDbg 中的所有线程。我发现较旧的参考文献说“~”,但这不起作用。

具体来说,我正在寻找导致事件的线程的 ID,即断点。

谢谢。

【问题讨论】:

    标签: windows multithreading kernel windbg


    【解决方案1】:

    ~ 仅在用户模式下工作。要列出系统上的所有线程,我记得是!process 0 1(已经有一段时间了)。

    “具体来说,我正在寻找导致事件的线程的 ID,即断点。”

    这个语句在内核模式下没有多大意义。你能详细描述一下你的场景是什么吗?

    编辑:啊,现在我明白了。你想知道你现在在哪个线程。试试看!thread

    【讨论】:

    • 是的,我在 NtLoadDriver 上有一个断点,只是想知道引发异常的线程的 ID。
    • 你是如何设置断点的?默认情况下,在内核调试器中,您无法在用户模式代码上设置或拦截断点。
    • 我的意思是 ntoskrnl 中的 NtLoadDriver,所以线程已经在主管模式下执行(环 0)。使用调试符号,我只需键入 kd> bp NtLoadDriver
    • 当我也期望它时,它也按预期坏了。我只是在寻找一种方法来检索引发异常的线程的 ID。
    • 为了记录,应该是 !process 0 2 来显示每个进程的线程。如果您还想要堆栈跟踪,则可以使用 !process 0 6。但这会变得非常冗长,因此我建议您提供一个特定的进程来查看而不是使用 0。
    【解决方案2】:

    你总是可以使用@$thread 伪寄存器来引用当前线程对象:

    0: kd> r @$thread
    $thread=fffff80002c02cc0
    

    如果你想要线程的 ID,你需要从 ETHREAD 中挖掘它。幸运的是,如果您使用 C++ 求值器,@$thread 会被输入为指向 ETHREAD 的指针:

    0: kd> ?? @$thread->Cid
    struct _CLIENT_ID
       +0x000 UniqueProcess    : 0x00000000`00001408 Void
       +0x008 UniqueThread     : 0x00000000`0000144c Void
    

    -斯科特

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-06
      • 2011-12-19
      • 2013-05-09
      • 2017-12-20
      • 2015-09-26
      • 1970-01-01
      • 2019-07-08
      • 2012-02-03
      相关资源
      最近更新 更多