窗口应用程序 - 调试器是否停止窗口线程?
逆向工程
调试
2021-06-18 07:57:50
2个回答
x64dbg 的“线程”页面仅每两秒刷新一次,速度不够快,无法看到大部分阻塞等待的线程(例如应用程序的消息循环线程)中发生的事情。
您可以通过查看“用户时间”列来验证线程是否被时间切片。将窗口四处移动几秒钟,您应该运行足够多的应用程序代码以查看“用户时间”增量。
编辑地址@Duke Nukem 的评论:
Windows 上的活动调试器依赖于事件系统,因此它们中的大多数只是坐在那里,直到发生异常、断点或用户交互时才执行任何操作。这些调试器(WinDbg、VS 等)在目标运行时不会显示任何线程状态或类似的东西(只有在目标被破坏时才能获得该信息)。
这就是不熟悉 x64dbg 的人感到困惑的地方。x64dbg Threads 选项卡不绑定到调试事件系统,它只是一个监视工具,它定期扫描目标中的所有线程(即使它正在运行)并获取计时统计信息并查询线程的上下文以显示当前指令指针。
您无法同时查看所有线程的上下文。你应该切换感兴趣的线程。例如,现在我将从线程 3 切换到线程 2。
在 Windbg 中,您可以使用“~”列出当前进程中的所有线程。
WINDBG>~
0 Id: 6c4.4c0 Suspend: 1 Teb: 7ffde000 Unfrozen
1 Id: 6c4.240 Suspend: 1 Teb: 7ffdd000 Unfrozen
2 Id: 6c4.9dc Suspend: 1 Teb: 7ffdc000 Unfrozen
3 Id: 6c4.728 Suspend: 1 Teb: 7ffdb000 Unfrozen
4 Id: 6c4.b1c Suspend: 1 Teb: 7ffda000 Unfrozen
然后你可以使用'>~[Thread number]s'
WINDBG>~2s
eax=00000001 ebx=00000001 ecx=773b73a8 edx=26aa5eee esi=00000002 edi=00288800
eip=77b470b4 esp=0132f9b8 ebp=0132fb18 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000206
ntdll!KiFastSystemCallRet:
77b470b4 c3 ret
现在您可以跟踪线程 2 的执行、设置 bp 等。
其它你可能感兴趣的问题
