Debugging mftrace:CMFStreamSinkDetours::GetEvent似乎不起作用 < >我在使用“代码> MFTrace跟踪我的媒体基础应用程序时遇到了奇怪的问题:当运行在 MfTrace时,应用程序会因访问冲突而崩溃。它是从VisualStudio调试器运行的,但我需要运行 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__ 29522320,5CE8 13:05:14.78185 CMFStreamSinkDetours::GetEvent@000001CFB1E85BD0-输入 2953 22320,5CE8 13:05:14.78455 CKERNEL2ExportDetours::OutputDebugStringA@[23784 ENTER]RtspStreamSinkBase::IsMediaTypeSupported 2954 u M_uf_ur_ua_uc_ue_u_u日志__

Debugging mftrace:CMFStreamSinkDetours::GetEvent似乎不起作用 < >我在使用“代码> MFTrace跟踪我的媒体基础应用程序时遇到了奇怪的问题:当运行在 MfTrace时,应用程序会因访问冲突而崩溃。它是从VisualStudio调试器运行的,但我需要运行 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__ 29522320,5CE8 13:05:14.78185 CMFStreamSinkDetours::GetEvent@000001CFB1E85BD0-输入 2953 22320,5CE8 13:05:14.78455 CKERNEL2ExportDetours::OutputDebugStringA@[23784 ENTER]RtspStreamSinkBase::IsMediaTypeSupported 2954 u M_uf_ur_ua_uc_ue_u_u日志__,debugging,visual-studio-2013,atl,ms-media-foundation,detours,Debugging,Visual Studio 2013,Atl,Ms Media Foundation,Detours,由于作为媒体类型传入的指针无效(但非空),方法RtspStreamSinkBase::IsMediaTypeSupported实际崩溃。通过将调试器附加到崩溃的进程,我知道这一点 对我来说,看起来好像mftrace认为它正在调用GetEvent,但实际调用的方法是IsMediaTypeSupported 以前有人遇到过这样的问题吗?解决办法是什么?是什么导致了这样的问题 致以最良好的祝愿, 克里斯托夫 更新:我做了一些进一步的研究,发现了两个可能出错的地方:首先,我使用ATL实现(不仅是ATL:

由于作为媒体类型传入的指针无效(但非空),方法
RtspStreamSinkBase::IsMediaTypeSupported
实际崩溃。通过将调试器附加到崩溃的进程,我知道这一点

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

以前有人遇到过这样的问题吗?解决办法是什么?是什么导致了这样的问题

致以最良好的祝愿, 克里斯托夫

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

是否使用ATL会妨碍正确安装迂回路线?原则上,是否可以使用ATL实现MFT类?有没有人成功地做到了这一点(我在互联网上看到的大多数示例都是手动完成所有COM操作的)

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


是否ATL中的引用跟踪(
\define\u ATL\u DEBUG\u INTERFACES
)会干扰迂回/mftrace?

我最终发现了问题:事实证明,启用
\define\u ATL\u DEBUG\u INTERFACES
对于基于ATL的MF类来说是一个非常糟糕的主意。删除这个定义后,内部错误消失了,跟踪不再崩溃。

你好,你写了代码> RTSPStaseSnkBase< /Cord>——是你的代码还是来自MediaFoundation SDK?是的,这是我的代码。这就是我添加调试输出的地方,这表明vtable在mftrace中被弄乱了。我使用ATL进行MF开发,没有发现任何问题。示例代码可能避免了ATL,因为ATL在所有VS版本中都不可用。非mftrace运行如何,它们工作正常吗?非
mftrace
运行不会崩溃,在
mftrace
中发布版本也不会崩溃。既然您使用ATL基类成功地构建了MFT,我想我会更彻底地研究副作用方向。@RomanR。请问您的代码中是否也使用了
ATL\u NO\u VTABLE