windbg附带的dbgrpc.exe在Windows 7下似乎不能正常工作。我按照说明操作,启用MSDN中所述的RPC状态信息
我创建了测试进程外的COM服务器和客户端,在调试器下运行客户端,调用COM服务器方法(在返回之前进入方法)并运行dbgrpc。 我能够枚举RPC端点。但是,当我尝试获取类似的线程信息时:
dbgrpc -t -P 1234
没有打印任何有用的东西 - 只是没有任何数据行的标题:
PID CELL ID ST PNO IFSTART THRDCELL CALLFLAG CALLID LASTTIME CONN / CLN
我知道其他人在Windows 7上遇到同样问题的信息(在Windows XP上也没问题)。所以,我怀疑这是Windows 7的问题(也许是它的安全性)。 WinDbg中的类似问题 - 没有有用的信息在运行!rpcexts.getcallinfo 0 0 FFFF 1234.有什么建议吗?
答案 0 :(得分:2)
在Vista上忘记“dbgrpc”,之后因为它无法正常工作。 Vista和后来使用ALPC(“高级”)而不是旧的LPC。如果要分析ALPC端口和消息,可以对机器进行内核调试并使用命令“!alpc”。但是不要期待太多文档,甚至在WinDbg帮助中都没有提到。
为了避免这个内核混乱,我在线程的TEB(偏移量0xf80)中使用“ReservedForOle”指针,其中COM存储进程和线程ID。以下命令可用于访问WinDbg:
在COM服务器中:传入的COM呼叫来自哪里: 来电者的流程ID: ? dwo(dwo(@ $ teb + 0xf80)+ 0x108) 呼叫者的线程ID(如果呼叫者的线程在MTA中,则为0,如果在NA中,则为-1): ? dwo(dwo(@ $ teb + 0xf80)+ 0x34)
在COM-client中:传出的COM调用将在何处: 目标的进程ID: ? dwo(dwo(@ $ teb + 0xf80)+ 0x100) 目标的线程ID(如果目标服务器是MTA COM服务器,则为0): ? dwo(dwo(@ $ teb + 0xf80)+ 0x104)
这些值适用于32位进程。对于本机64位进程,偏移量会有所不同(例如“ReservedForOle”在TEB中的偏移量0x1758上)。