问题标签 [dbgeng]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - CMake'ifying Boost Jam 文件:Windows 库名称
我正在尝试“去增强”其中一个 Boost 库,无论如何它或多或少是独立的。(这是 Antony Polukhin 的精彩 [stacktrace
库][1];它使您可以轻松访问堆栈跟踪,包括名称和行号,没有任何麻烦。但这不是重点。)
现在,Boost 使用自己的构建系统 [B2][2],它使用“Jam 文件”进行配置;所以我正在尝试将此库的 Jam 文件迁移到CMakeLists.txt
.
具体来说,我需要将用 B2 术语表达的依赖关系转换为find_package()
命令,或者最糟糕的是,我需要自己查找一些 DLL。具体来说,我似乎需要 Boost 引用的库:Dbgeng
和ole32
.
取决于这两者,CMake 相当于什么?
注意:我对 Windows 开发几乎一无所知。
windbg - 如何以编程方式找到合适的区域来重新加载已卸载的模块而不会重叠?
我正在开发一个用于转储分析的 Windbg 扩展,该扩展需要来自已卸载模块的符号。我正在使用函数IDebugSymbols3::Reload,它类似于.reload
命令。如果模块最初占用的区域不再可用,我必须明确指定一个新的基地址来加载。
如果我手动调试,我可能会使用!address
扩展列出空闲区域并寻找一个足够大的区域。如何以编程方式在目标地址空间中找到要使用的适当位置?
multithreading - 在多核系统上的多线程应用程序中记录单步/跟踪指令
我使用 DbgEng 为 WinDbg 创建了一个扩展,它记录了包含用户模式和内核模式下每条执行指令的寄存器和堆栈状态的跟踪。
对于步进跟踪,我使用断点(我还尝试将 TRAP 标志设置为记录跟踪的线程上下文,但它给出了相同的结果)。在每一步之后并遇到断点 IDebugEventCallbacks::Breakpoint() 被调用,它返回 DEBUG_STATUS_BREAK。这会导致调试器在引擎循环中完成 IDebugControl::WaitForEvent() 函数,并记录当前指令的状态。
跟踪记录在多核系统(4 个物理核、8 个虚拟核)上的测试多线程应用程序中。测试应用程序在主线程之外创建了 6 个线程。4个线程异步记录同一个函数func0的trace。其他 3 个创建的线程模拟计算。
测试程序代码:
在大多数情况下,一切都按预期工作,我得到了一个完整记录的跟踪,如下所示:
但有时调试器会跳过步骤并且不会触发断点。
例如:
假设已记录状态rip = 00007ff6'ad314215,并在以下地址00007ff6'ad31421a处设置断点。之后,我继续执行程序并期望触发地址 00007ff6'ad31421a 处的断点。但是,我当前的 rip = 00007ff6'ad314221 并没有预期在 00007ff6'ad31421a 处到达断点并调用 IDebugEventCallbacks::Breakpoint(),而是使用以下参数调用 IDebugEventCallbacks::Exception():
因此系统已经执行了 00007ff6'ad31421a 处的指令,但由于某种原因,调试器没有命中设置的断点,并在未设置任何断点的下一条指令(00007ff6`ad314221)上引发异常。
我还尝试在 IDebugEventCallbacks::ChangeEngineState() 中检查程序计数器 (threadContext.rip) 以查找正在记录其执行的线程,但我从来没有得到一个计数器等于被跳过的指令的地址 (00007ff6'ad31421a) .
因此,我的跟踪中没有地址 00007ff6'ad31421a 的状态:
问题:
- 这种行为的原因是什么?
- 我遇到了这样的观点,即这种行为可能是由在多核系统上执行引起的,但是这个判断的作者没有提到任何有理由证明这一点的来源。如果确实是这种情况,有人可以提供有关基本原理的链接吗?
- 有什么解决问题的建议吗?
- 是否有工具可以让您在 Windows 中记录与用户模式和内核模式类似的状态跟踪?
windbg - 如何为 WinDBG 预览 TTD 跟踪会话获取可用的虚拟内存区域?
我正在编写 dbgeng 客户端并尝试为时间旅行调试会话枚举可用的虚拟内存。
Dbgeng API 有IDebugDataSpaces2::QueryVirtual
方法,它适用于实时用户模式调试会话,但不适用于 TTD 跟踪会话重放。当我尝试调用它时,我收到 0x8000ffff (E_UNEXPECTED) 错误。
看起来!address
和!vprot
来自windbg preview gui的命令有同样的问题
有IDebugDataSpaces4::GetValidRegionVirtual
方法。它可以工作,但太长了(看起来它试图手动检查每一页)。看起来IDebugDataSpaces4::GetNextDifferentlyValidOffsetVirtual
对于 TTD 重放也有问题。
dbgeng API 是否有其他方法来枚举进程的有效内存范围?或者也许还有另一种方法可以从 IDX 或 RUN 文件中获取此信息?
multithreading - 关于线程安全的 DbgHelp vs DbgEng vs DIA SDK
所有这些 API(DbgHelp、DbgEng、DIA SDK)都可用于从函数指针中恢复函数名称/源文件位置,因此可用于解密堆栈跟踪。
但是,每个 DbgHelp 函数都有以下注释:
所有 DbgHelp 函数,例如这个函数,都是单线程的。因此,从多个线程调用此函数可能会导致意外行为或内存损坏。为避免这种情况,您必须将来自多个线程的所有并发调用同步到该函数。
至于 DbgEng,没有这样的声明,但是它似乎是基于 DbgHelp,所以不能是线程安全的:即使 DbgEng 保护对 DbgHelp 的每次调用,也可能不是来自 DbgEng 的对 DbgHelp 的调用,而是直接来自用户的代码。
恐怕 DIA SDK 也是使用 DbgHelp 实现的。
那么是否有任何健壮的符号 API 可用于为多线程应用程序设计的库中?