mftrace: CMFStreamSinkDetours::GetEvent 好像不行

mftrace: CMFStreamSinkDetours::GetEvent seems not not work

使用 mftrace 跟踪我的媒体基础应用程序时遇到奇怪的问题:当 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,用于使用注册商等)。虽然自己也绕过弯路,但不知道mftrace是怎么用的。我假设他们正在覆盖 vtable 指针。

难道是使用ATL导致绕道无法正确安装?原则上是否可以使用 ATL 来实现 MFT 类?有没有人成功做到这一点(我在互联网上看到的大多数示例都是手动完成所有 COM 的)?

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

会不会是ATL(#define _ATL_DEBUG_INTERFACES)中的reference tracking干扰了detours/mftrace?

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