【问题标题】:Display content of shared memory section in WinDbg?在WinDbg中显示共享内存部分的内容?
【发布时间】:2011-02-10 10:06:13
【问题描述】:

我有几个使用命名内存部分进行通信的程序。有什么方法可以在用户模式或内核模式下从 WinDBG 查看此共享内存部分的内容?我没有指向它的指针,但我知道它的名字。

【问题讨论】:

  • 你有没有设法找到?使用 Sysinternals 的 Process Explorer 和使用 LiveKD 获取命名部分的地址非常容易,我可以检查 FILE_OBJECT 但我不知道如何访问 contents 本身。关注this 会将我带到包含 _EX_FAST_REF 作为 FilePointer 的 CONTROL_AREA。

标签: windbg


【解决方案1】:

只是尝试在我们的共享内存上执行此操作,但没有得到您想要的,但我在这里为后代做笔记:

  • 我找不到从名称中获取句柄的简单方法,但如果您执行“!handle 0 f”然后搜索输出,您可以看到内核对象的名称及其句柄 ID:get从此处理。
  • 显然共享内存内核对象中没有进程特定的地址,但是 .call /s KnownFuncWithSamePrototype MapViewOfFileEx 确实返回了看起来像有效指针的东西

'.call' 需要完整的符号才能工作,但 MapViewOfFile(Ex) 没有,我碰巧在我们的代码中找到了一个返回指针并接受六个参数的函数,所以我没有必须重新编译才能使其工作(这就是 KnownFuncWithSamePrototype 上面的意思)。我不确定这是否适合您。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    使用用户模式调试器...您是否可以编写一个非常简单的测试应用程序来获取对指定内存部分的访问权限(即调用 OpenFileMapping 然后 MapViewOfFile),然后在调试器下运行该应用程序?您应该能够跳过调用以访问该部分,然后检查该应用对该部分的视图。

    (如果有帮助,this MSDN page 上的“第二进程”标题提供了示例代码,供进程访问命名的共享内存部分并将其映射到其地址空间。)

    我通常喜欢编写小型测试工具来帮助调试这样的事情......如果你想让事情变得更简单,你甚至可以编写测试工具来自动中断任何附加的调试器(使用函数像 DebugBreak)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 2018-02-15
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多