如何从windbg内核调试器检查用户线程调用堆栈?

Jim*_*hen 1 windbg

我的 exe-once 测试程序调用CancelIo并且它被阻止,我想调查它在哪个函数中被阻止,因此,当它被阻止时,我使用 Windbg 远程闯入机器,并尝试找出它。

如图中标记为黄色的,我的 EXE 有两个线程,fffffa8013958b60并且fffffa8013aa1060. 我已经知道是fffffa8013aa1060那个人打来的CancelIo

那么,如何显示线程当前的调用堆栈呢fffffa8013aa1060

在此输入图像描述

1: kd> !process fffffa8014c25170 2
PROCESS fffffa8014c25170
    SessionId: 1  Cid: 0ad4    Peb: 7fffffdf000  ParentCid: 07b8
    DirBase: 2b451000  ObjectTable: fffff8a002e61620  HandleCount:  12.
    Image: exe-once.exe

        THREAD fffffa8013958b60  Cid 0ad4.0724  Teb: 000007fffffdd000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable
            fffffa8013aa1060  Thread

        THREAD fffffa8013aa1060  Cid 0ad4.01e8  Teb: 000007fffffdb000 Win32Thread: 0000000000000000 WAIT: (DelayExecution) KernelMode Non-Alertable
            fffffa8013aa1420  Semaphore Limit 0x1
Run Code Online (Sandbox Code Playgroud)

小智 5

尝试这个命令序列

.process /i fffffa8014c25170 
g
.thread fffffa8013aa1060
.reload /user
k
Run Code Online (Sandbox Code Playgroud)

摘自 WinDbg 文档:

/i [...] 指定要侵入式调试进程。这种调试意味着目标计算机的操作系统实际上使指定的进程处于活动状态。[...] 如果使用 /i,则必须使用 g (Go) 命令来执行目标。几秒钟后,目标重新进入调试器,指定的进程处于活动状态并用于进程上下文。