从外部源向Windows调试器发送调试事件

时间:2011-07-19 07:22:26

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

我创建了一组多平台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扩展指示调试器加载符号信息?
  5. 我已经广泛搜索了有关上述主题的信息,但已经做得很短。我找到了一些有关Windows调试器使用的数据结构的信息,但与我的具体情况无关。

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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