mftrace:CMFStreamSinkDetours :: GetEvent似乎不起作用

时间:2016-06-30 13:21:35

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

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

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)中的参考跟踪干扰了绕行/ mftrace吗?

1 个答案:

答案 0 :(得分:1)

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