【发布时间】: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<class RtspVideoStreamSink>::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<class RtspVideoStreamSink>- 是你的代码还是来自 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