pul*_*van 5 c++ debugging winapi windbg
我知道在任何给定时间使用任何类型的Win API调用都无法确定线程队列中有多少消息.我有一个不起作用的应用程序,因为PostMessage有时失败(可能是由于队列增长到10000,虽然我不知道它怎么会变得这么大).这是一个间歇性的问题,我发生了几次内存转储.显然队列必须在某个地方,本文解释了如何获取它http://moyix.blogspot.com/2008_09_01_archive.html
Windows中的每个线程(由_ETHREAD结构表示)在其线程控制块(或Tcb,即_KTHREAD)中都有一个名为Win32Thread的字段.该字段指向数据结构_W32THREAD,该结构在Windows图形子系统win32k.sys的内核模式部分中定义.你可以通过在WinDbg中发出"dt win32k!_W32THREAD"来检查_W32THREAD结构.但是,如果你开始逆向工程win32k.sys,你会很快发现那里给出的信息远未完成.事实上,_W32THREAD是一个更大的数据结构,其中包括有关当前桌面,键盘布局,已安装的窗口挂钩以及最重要的是输入消息队列的信息.在Windows XP SP2中,消息队列位于_W32THREAD的偏移量0xD0处,如下所示:
Run Code Online (Sandbox Code Playgroud)typedef struct _MSG_QUEUE { PMSG_QUEUE_ENTRY Head; PMSG_QUEUE_ENTRY Tail; unsigned long NumberOfMessages; } MSG_QUEUE;
基本上我正在尝试找到一个指针MSG_QUEUE(这将给我NumberOfMessages,加上我可以从Head开始枚举它们).但是看起来我看不到通过分析内存转储找到_ETHREAD,_KTHREAD和_W32THREAD中的任何一个的指针.它们究竟存储在哪里,是否处于存储空间?我必须在内核模式下运行吗?我是否需要为win32k.sys加载符号?还有什么我需要做的吗?谢谢.
这不是所有 WinDbg 命令的完整答案,但可能仍然有帮助。
消息队列只能在内核模式下访问,因此您需要内核转储或使用 SysInternals livekd。使用 -y 开关设置符号路径。
livekd -y srv*d:\debug\symbols*http://msdl.microsoft.com/download/symbols
Run Code Online (Sandbox Code Playgroud)
进入内核模式后,找到要调试的进程
!process 0 0 executable.exe
Run Code Online (Sandbox Code Playgroud)
然后获取进程的线程
!process <process> 4
Run Code Online (Sandbox Code Playgroud)
Win32Thread 不等于 0 的所有线程都可能是有趣的。
博客文章“跳队列”描述了 Windows 7 的其余部分。我无法立即理解,并且该文章实际上并未描述要使用哪些 WinDbg 命令。我记得在 Windows XP 上要容易得多。
| 归档时间: |
|
| 查看次数: |
1020 次 |
| 最近记录: |