【问题标题】:Sending debug events to Windows debugger from external source从外部源向 Windows 调试器发送调试事件
【发布时间】:2011-07-19 07:22:25
【问题描述】:

我创建了一组多平台 C++ 组件来加载和管理各种类型的数字签名共享库。它处理加载和初始化的所有方面,包括将它们映射到调用进程、应用分支修复、绑定任何导入和调用初始化入口点。组件不能使用 LoadLibrary(),因为它是特定于平台的,并且并非所有共享库都是 PE 格式。

我面临的少数几个剩余问题之一是为目标平台和开发环境提供适当的调试器支持。在 MS Windows 环境中,这包括让调试器加载由编译器和链接器生成的符号信息(或从其他源转换而来)。因为库的加载和初始化发生在内核之外,调试器永远不会收到 LOAD_DLL_DEBUG_EVENT 和 UNLOAD_DLL_DEBUG_EVENT 事件。这导致以下问题:

  1. 是否存在允许将 LOAD_DLL_DEBUG_EVENT 等事件直接发送到调试器的 API 或系统调用?
  2. 是否有书面方法可以直接与程序或会话调试管理器或机器调试管理器服务进行通信?
  3. 是否有 API 或系统调用可用于通知内核以及随后的调试器已加载 DLL?由于 PE 文件是主要支持的格式之一,因此这是最理想的选择。它还具有允许库出现在进程的模块列表中的潜在好处。
  4. WinDBG SDK 是否适用于整个 Windows 上的调试,是否可以使用 WinDBG 扩展来指示调试器加载符号信息?

我已经广泛搜索了有关上述主题的信息,但没有找到。我找到了一些有关 Windows 调试器使用的数据结构的信息,但与我的具体情况无关。

我对记录或未记录的 API/系统调用和方法以及需要提升权限才能运行的方法持开放态度。

【问题讨论】:

  • 为什么需要内核模式调试?
  • @ajay 我没有。我的帖子中有什么不清楚的地方吗?
  • @CaptainObvlious 8 年后你找到发送 LOAD_DLL_DEBUG_EVENT 的方法了吗? :) 我正在为同样的问题寻找同样的东西!

标签: c++ visual-studio winapi debugging windbg


【解决方案1】:

我认为没有办法直接将您想要的事件(如LOAD_DLL_DEBUG_EVENT)发送到进程,至少不容易。 为什么不简单地将库包装在 Windows 中的普通 DLL 中?也许您将自定义模块加载机制嵌入到每个“代理”DLL 中,这样您就不需要复制操作系统已经为您提供的太多功能。

【讨论】:

  • 不幸的是,使用 stub dll 只能部分解决问题。根据共享库的类型,应用必须在运行时完成的附加修复。
【解决方案2】:

如果我理解了这个问题,你可能会看到:

  1. Writing a basic Windows Debuggers
  2. Writing Windows Debugger(详细)

【讨论】:

  • 我不是在写调试器,我需要向它传达某些事件。
  • 但我看到所有三个操作都是由操作系统自动执行的。调试器将接收事件。
  • 由于调试器是由调试器使用CreateProcess(...DEBUG_PROCESS...) 启动的,因此很难钩入调试器循环发送信息。我可以建议 Process Monitor 从以下位置开始:technet.microsoft.com/en-us/sysinternals/bb896645。使用它,您可以查看调试器获取事件时发生的情况,并尝试自己发送这些事件。
  • 但我不相信做这件事很容易!
猜你喜欢
  • 1970-01-01
  • 2012-02-20
  • 2011-09-11
  • 2014-11-15
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 2013-02-09
  • 2011-07-17
相关资源
最近更新 更多