【问题标题】:Need help understanding "DBWinMutex"需要帮助了解“DBWinMutex”
【发布时间】:2021-03-29 11:39:17
【问题描述】:

我正在使用这篇文章编写我自己的 DebugView 版本:https://www.codeproject.com/Articles/23776/Mechanism-of-OutputDebugString 作为起点。 该代码似乎工作正常。但是我不明白命名互斥体“DBWinMutex”的使用。 这个互斥锁是在代码开头打开的:

CComBSTR DBWinMutex = L"DBWinMutex";
HANDLE m_hDBWinMutex = ::OpenMutex(MUTEX_ALL_ACCESS,
                                   FALSE,
                                   DBWinMutex);

在程序结束前没有关闭!?

我觉得这很奇怪。我认为必须反复锁定和解锁互斥锁,以便 OutputDebugString 可以写入共享内存“DBWIN_BUFFER”?

但是,我能够读取其他程序编写的 OutputDebugString 消息,因此互斥锁似乎不会锁定“DBWIN_BUFFER”以进行写入。 此外,我还可以与我的 DebugView 实现并行运行 DebugView,它们都可以读取 OutputDebugString 消息。因此,似乎互斥锁也不授予对“DBWIN_BUFFER”的独占读取权限。

使用上面的 MUTEX_ALL_ACCESS 访问意味着我必须以管理员身份运行程序。 当我将其替换为 SYNCHRONIZE 访问时,该程序的功能似乎完全相同,只是我不必以管理员身份运行它。 这可以吗?或者它可能会导致一些微妙的错误?

我还测试了上面 OpenMutex 的返回值,如果它为 null,则调用 CreateMutex。

【问题讨论】:

  • OpenMutex 返回一个互斥量的句柄。它不获取该互斥体。此外,您无需检查NULL,如果是,则调用CreateMutex。只需使用CreateMutex,它将返回一个现有互斥对象的句柄,或者创建一个新对象。
  • 谢谢。但是我如何获得这个互斥锁? WaitForSingleObject(互斥体)?在我参考的文章中,我根本没有看到这个句柄被使用。
  • WaitForSingleObject - 是的,用于获取互斥锁
  • 您不需要任何互斥锁来捕获 OutputDebugString 的结果,请参阅此处获取 C 版本 drdobbs.com/a-dbwin32-debugger-for-windows/184403245?pgno=3 和此处获取 .NET github.com/smourier/TraceSpy/blob/master/TraceSpy/Main.cscodeproject.com/Articles/13345/…
  • @SimonMourier:谢谢。但是存在一个名为“DBWinMutex”的互斥锁。如果这个互斥锁不能确保一次只有一个线程访问“DBWIN_BUFFER”共享内存,它会做什么?

标签: windows debugging winapi


【解决方案1】:

article you linked to 中所述,DBWinMutex 仅供OutputDebugString() 本身使用,以防止多个线程同时写入输出缓冲区。调试监视器根本不需要使用DBWinMutex

但是,上图中有一个错误。它应该看起来更像这样:

【讨论】:

    猜你喜欢
    • 2017-06-19
    • 2016-05-03
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    相关资源
    最近更新 更多