我的 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) 命令来执行目标。几秒钟后,目标重新进入调试器,指定的进程处于活动状态并用于进程上下文。