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
是一个非常糟糕的主意。删除此定义后,内部错误消失,跟踪不再崩溃。
使用 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
是一个非常糟糕的主意。删除此定义后,内部错误消失,跟踪不再崩溃。