【问题标题】:mftrace: CMFStreamSinkDetours::GetEvent seems not not workmftrace:CMFStreamSinkDetours::GetEvent 似乎不起作用
【发布时间】:2016-11-02 15:03:26
【问题描述】:

我在使用 mftrace 跟踪我的 Media Foundation 应用程序时遇到了奇怪的问题:在 mftrace 中运行时,应用程序因访问冲突而崩溃。它从 Visual Studio 调试器运行,但我需要运行 mftrace 来解决媒体基础问题。在调查了一段时间后,我添加了自己的跟踪代码并发现了以下内容:

2952 22320,5CE8 13:05:14.78185 CMFStreamSinkDetours::GetEvent @000001CFB1E85BD0 - enter
2953 22320,5CE8 13:05:14.78455 CKernel32ExportDetours::OutputDebugStringA @ [23784 ENTER]RtspStreamSinkBase<class RtspVideoStreamSink>::IsMediaTypeSupported 
2954            __M_F_T_R_A_C_E___LOG__

RtspStreamSinkBase&lt;class RtspVideoStreamSink&gt;::IsMediaTypeSupported 方法实际上是由于作为媒体类型传入的无效(但非空)指针而崩溃的方法。我知道通过将调试器附加到崩溃的进程。

对我来说,看起来好像mftrace 认为它正在调用GetEvent,但实际调用的方法是IsMediaTypeSupported

以前有没有人遇到过这样的问题?解决方案是什么?什么可能导致这样的问题?

最好的问候, 克里斯托夫

更新:我做了一些进一步的研究,发现了两个可能出错的地方:首先,我使用 ATL 来实现我的实现(不仅是 ATL::CComPtr,还有其他基类像ATL::CCoClass 使用注册商等)。虽然我自己也处理过detours,但不知道mftrace是怎么用的。我假设他们正在覆盖 vtable 指针。

会不会是使用 ATL 会妨碍正确安装弯路?原则上,是否可以使用 ATL 来实现 MFT 类?有没有人成功做到这一点(我在互联网上看到的大多数样本都是手动完成所有 COM 的)?

第二个观察是mftrace 中只有调试版本崩溃。因此,调试代码中的一些意外副作用(例如assert(ptr = nullptr))可能会导致问题。不过,到目前为止,我还没有在自己的代码中找到一个。

会不会是 ATL 中的参考跟踪 (#define _ATL_DEBUG_INTERFACES) 干扰了 detours/mftrace?

【问题讨论】:

  • 嗨,你写的 RtspStreamSinkBase&lt;class RtspVideoStreamSink&gt; - 是你的代码还是来自 Media Foundation SDK?
  • 是的,这是我的代码。这是我添加调试输出的地方,这表明 vtable 在 mftrace 中搞砸了。
  • 我使用 ATL 进行 MF 开发,我没有发现任何问题。示例代码可能避免了 ATL,因为 ATL 并非在所有 VS 版本中都可用。非 mftrace 运行呢,它们工作正常吗?
  • mftrace 运行不会崩溃以及mftrace 中的发布版本。鉴于您使用 ATL 基类成功构建了 MFT,我想我会更彻底地研究副作用方向。
  • @RomanR。请问你的代码中是否也使用ATL_NO_VTABLE

标签: debugging visual-studio-2013 atl ms-media-foundation detours


【解决方案1】:

我终于找到了问题:事实证明,启用#define _ATL_DEBUG_INTERFACES 对于基于 ATL 的 MF 类是一个非常糟糕的主意。删除此定义后,内部错误消失了,跟踪不再崩溃。

【讨论】:

    猜你喜欢
    • 2016-11-29
    • 2016-02-01
    • 2020-09-23
    • 2010-12-05
    • 2011-06-14
    • 2015-01-10
    • 2016-02-24
    • 2011-01-18
    • 2018-06-20
    相关资源
    最近更新 更多