问题标签 [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.
visual-studio - 如何从 windbg/dbgeng api 获取部分信息/偏移权限?
我正在为 Windbg 编写一个扩展,在某个特定点我需要获得内存偏移的权限,就像!address addr
在 Windbg 中提供的那样。我在这里查看了调试器引擎 API 的可用功能:
http://msdn.microsoft.com/en-us/library/windows/hardware/ff551059%28v=vs.85%29.aspx
但是,我找不到这样一个函数,它可以根据内存偏移量返回部分/权限信息。基本上我想知道地址所在的部分,数据部分,文本部分等,它有什么权限等等。
我找到的最接近的探测函数是 IDebugDataSpaces4 接口中的 GetOffsetInformation。但是,根据文档,它没有提供我正在寻找的任何东西:
http://msdn.microsoft.com/en-us/library/windows/hardware/ff548055(v=vs.85).aspx
我总是可以运行!address
命令并解析其输出,但我正在寻找一种更简洁的方法,可以通过使用 API 直接获取此信息。
我错过了什么吗?是否有记录/未记录的方式可以实现这一目标?
debugging - 获取第一个堆栈帧的帧指针偏移量
我需要获取所有堆栈帧的基地址和顶部地址,用于我为 windbg 编写的扩展。例如,这是我得到的:
ESP=0023c79c EBP=0023c79c
好的,所以根据这里的 msdn 文档,如果 FrameOffset 为零,则应使用当前帧指针,如果 StackOffset 为零,则应使用当前堆栈指针:
http://msdn.microsoft.com/en-us/library/windows/hardware/ff548425%28v=vs.85%29.aspx
现在对于第一帧,或者上例中的帧#26,它显示帧偏移量为零,但是当前帧偏移量EBP是0023c79c,它指的是堆栈的顶部,因此不能对应于帧# 26 的帧偏移。那么我到底应该如何找到堆栈帧#26 的底部呢?
另一个问题,!teb
在 windbg 中运行给了我以下堆栈范围:
现在,在第 26 个堆栈帧指针和堆栈底部之间的 8360 字节(240000 - 23df58)中到底有什么?它是全部由第 26 个堆栈帧本身组成的,还是中间还有其他东西?(除了 ret 和 ebp)
debugging - 从通过 dbgeng 的 DisassembleWide() 反汇编的指令中删除地址
我在DisassembleWide()
为 Windbg 编写扩展时通过将它们的偏移量传递给函数来反汇编指令。但是,对于反汇编指令,它会添加指令的地址 + 该指令的十六进制操作码。
我可以通过DEBUG_ASMOPT_NO_CODE_BYTES
在SetAssemblyOptions()
. 但是我似乎无法摆脱指令偏移量。既不DEBUG_ASMOPT_DEFAULT | DEBUG_ASMOPT_NO_CODE_BYTES
,也不(DEBUG_ASMOPT_DEFAULT | DEBUG_ASMOPT_NO_CODE_BYTES) & ~DEBUG_ASMOPT_VERBOSE
似乎工作。
我错过了什么吗?有没有办法可以干净地从指令中删除偏移量,还是必须手动执行?
dbgeng - 使用 dbgeng 调试正在运行的进程
我编写了一个基于 wdk 样本的简单程序,该程序从转储文件中扫描内存。
现在,我想在进程运行时对其执行相同的操作,但我面临几个问题:
我不知道如何打破正在运行的进程
离开我的程序时,被调试者关闭,而我调用了 DetachProcess。
谢谢
c++ - 获取执行的windbg命令的输出
IDebugControl::Execute 方法允许执行调试器命令。如何获得已执行的调试器命令的输出?我的目标是检查是否加载了驱动程序,为此我使用 Execute 执行“lm”windbg 命令并解析返回的输出。
powershell - 如何以与调试器无关的方式从调试器扩展 (dbgeng) 读取用户输入?
我正在编写一个调试器扩展,并且正在寻找一种在扩展开始执行后从调试器扩展获取用户输入的方法。
我在调试器扩展中托管 PowerShell,并尝试实现对需要用户输入的 Read-Host 的支持。
例如,在调试器中,我可以在 PSExt_profile.ps1 中编写一个脚本:
function Foo{
Read-Host -Prompt "Enter your address"
}
并在调试器命令行上:
!ps Foo
这将调用运行 Read-Host 命令的 PowerShell。
我不明白如何从扩展中询问从 WinDbg 获取输入。在 cdb 中,我可以使用控制台功能。
有没有一种通用的方法来处理这个与加载扩展的调试器无关的问题?
windows - 实现 DebugExtensionProvideValue 会破坏 WinDbg 内部状态?
我正在DebugExtensionProvideValue
我的扩展中实现,所以我可以提供自定义伪寄存器。它在 CDB 中运行良好,最初在 WinDbg 中运行良好,但在停止调试并打开新的可执行文件后,发生了一些事情,WinDbg 最终处于奇怪的不可用状态。
当您触发问题时,WinDbg 会将此消息打印到命令窗口:
无法传递回调,3131
发生这种情况后,WinDbg 似乎在命令窗口中两次打印所有输出!
我的扩展代码很简单:
重现问题看起来像这样:
我能够想出一个似乎确实有效的解决方法,但它只是感觉不对,因为我必须发布一个我从未 QI'ed 或 AddRef'ed 的接口。在我最少量的测试中,这个 hack 似乎从来没有崩溃过,并且通过查看 IDebugClients refcount,它在多次调用中似乎是正确的。
据我所知,您无法停止调试并在 CDB 中像这样打开一个新的 .exe,因此问题似乎只能发生在 WinDbg 中。
我做错了什么还是 DbgEng 中有错误?
windows - 在编写自己的“混合模式”调试器时如何与 Visual Studios 原生调试器交互?
在过去的几天里,我一直在搜索谷歌、博客和 MSDN,寻找有关如何在 Visual Studio 中实现“互操作”或“混合模式”调试的任何一小部分信息。
我正在尝试为自定义 VM 实现我自己的调试器(实际上,它被 JIT 编译为本机代码,这意味着每当它进入 JIT 编译代码时,我都必须为普通本机调试器重建调用堆栈),但是我找不到任何有关如何与 VS 的本机调试器进行实际交互以及如何进行花哨的“本机/托管”转换的信息,例如 VS 的混合模式调试完成的转换。
到目前为止,我发现了一些提供有用花絮的东西,但还不足以与调试器进行实际交互。我发现的最好、最有用的文章是:
- Mike Stall 的各种博客文章(主要是这 两篇)虽然提供了有用的信息和对内部工作原理的一瞥,但它们似乎与 .Net 调试密切相关。
- MSDN 的Creating a Basic Debugger很好地概述了 MS 如何实现它的调试器以及如何在同一技术堆栈上实现一个。不幸的是,这并没有真正提供有关如何将数据传递给 VS 的本机调试器的任何真实信息。(结合 Mike Stall 的博客,似乎两个调试器都在等待相同的事件,那么您如何以有意义的方式将结果拼接在一起?)
- 调试器引擎 API(又名 DbgEng)文档。我通过在 VS 的本机调试引擎上运行 Dependency Walker 发现了这一点(NatDbgDE.dll,它似乎导出了我只能在本文档中找到的 DebugCreate 函数,因此它可能是相关的)。不幸的是,我什至在通过它进行任何调试方面都没有取得什么成功,而且似乎记录得很差,尽管文档似乎确实表明这是我最终可能想要处理的。它也没有真正说明我如何与另一个调试器合作,也没有提到 VS 的调试器,所以无论如何我都可能完全走错了路。
我如何开始编写与 VS 的本机调试器协同工作的调试器?
谢谢!
windbg - '停止调试'在windbg中以编程方式做什么?
我尝试在打开转储、分析它然后“停止调试”后复制由 windbg 完成的清理。
当我尝试在自己的程序中执行此操作时,会泄漏大量内存。我释放了我已经 addref:ed 的 com 接口并调用了 SymCleanup,但这不会取消映射加载的图像或释放 dbgeng 分配的内存。
DDK 中提供的示例在这里似乎没有提供更多信息。这里有什么秘方吗?
我想要的是一个演示打开和关闭转储文件的示例,包括加载相应的图像和符号,而不会泄漏资源。
windbg - 带有 IDebugControl5.GetContextStackTraceEx 的内联堆栈帧?
如何DEBUG_STACK_FRAME_EX
使用内联框架解析 a 的符号?
我知道DEBUG_STACK_FRAME_EX
and 它ULONG
InlineFrameContext
,但我不明白如何将其解析InlineFrameContext
为相应的符号。
什么是FrameSignature
and FrameId
in INLINE_FRAME_CONTEXT
?