在 Windows7 上使用 dbgrpc 时出现问题

Problems using dbgrpc on Windows7

windbg自带的

dbgrpc.exe在Windows下好像不太好用 7.我按照说明,启用RPC状态信息,如MSDN

我创建了测试 out-of-proc COM 服务器和客户端,运行 调试器下的客户端,调用 COM 服务器方法(在 return 之前进入方法)和 运行 dbgrpc。 我能够枚举 RPC 端点。但是,当我尝试获取这样的线程信息时:

dbgrpc -t -P 1234

没有打印任何有用的东西 - 只是 header,没有任何数据行:

PID CELL ID ST PNO IFSTART THRDCELL CALLFLAG CALLID LASTTIME CONN/CLN


我发现其他人在 Windows 7 上遇到了同样的问题(在 Windows XP 上没问题)。所以,我怀疑这是 Windows 7 的问题(可能是它的安全性)。 WinDbg 中的类似问题 - 没有有用的信息 运行ning !rpcexts.getcallinfo 0 0 FFFF 1234。有什么建议吗?

在 Vista 和更高版本上忘记 "dbgrpc",因为它无法正常工作。 Vista 和更高版本使用 ALPC ("advanced") 而不是旧的 LPC。如果要分析 ALPC 端口和消息,可以 kernel-debug 机器并使用命令“!alpc”。但是不要期望有太多文档,WinDbg 帮助中甚至都没有提到它。

为了避免这种内核混乱,我在线程的 TEB(偏移量 0xf80)中使用 "ReservedForOle" 指针,COM 存储进程和线程 ID。可以使用以下命令为 WinDbg 访问它们:

In COM-server: 传入 COM-call 来自哪里: 调用者的进程ID: ? dwo(dwo(@$teb + 0xf80) + 0x108) 调用者的线程 ID(如果调用者的线程在 MTA 中,则为 0,如果在 NA 中,则为 -1): ? dwo(dwo(@$teb + 0xf80) + 0x34)

In COM-client: 即将离任的 COM-call 去哪里: 目标的进程 ID: ? dwo(dwo(@$teb + 0xf80) + 0x100) 目标的线程 ID(如果目标服务器是 MTA COM-server,则为 0): ? dwo(dwo(@$teb + 0xf80) + 0x104)

这些值适用于 32 位进程。对于本机 64 位进程,偏移量会有所不同(例如,"ReservedForOle" 在 TEB 中的偏移量 0x1758 上)。