如何获取 WinDBG 预览 TTD 跟踪会话的可用虚拟内存区域?

How to get available virtual memory regions for WinDBG preview TTD trace session?

我正在编写 dbgeng 客户端并尝试为时间旅行调试会话枚举可用的虚拟内存。

Dbgeng API 有 IDebugDataSpaces2::QueryVirtual 方法,它非常适合实时用户模式调试会话,但不适用于 TTD 跟踪会话重放。 当我尝试调用它时,我收到 0x8000ffff (E_UNEXPECTED) 错误。

看起来来自 windbg 预览 gui 的 !address!vprot 命令有同样的问题

0:000> !vprot 0
ERROR: !vprot: extension exception 0x8000ffff.
    "QueryVirtual failed"
0:000> !address

        BaseAddress      EndAddress+1        RegionSize     Type       State                 Protect             Usage
--------------------------------------------------------------------------------------------------------------------------

IDebugDataSpaces4::GetValidRegionVirtual方法。它有效,但太长了(看起来它试图手动检查每一页)。看起来 IDebugDataSpaces4::GetNextDifferentlyValidOffsetVirtual 对于 TTD 重放也有问题。

dbgeng API 是否有其他方法来枚举进程的有效内存范围? 或者也许还有另一种方法可以从 IDX 或 运行 文件中获取此信息?

目前一些在实时调试和转储文件中可用的信息在 TTD 中不可用。两个主要特征是:a) QueryVirtual 不起作用; b) 不保存进程和线程安全令牌信息。 我在我的 Debug 扩展中大量使用了 QueryVirtual 并且我做了一些改变来处理它。很抱歉成为坏消息的传递者。