Как отлаживать управляемые / неуправляемые исключения маршаллинга C #?

Я пишу фильтр DirectShow на C # и не хочу использовать какие-либо сторонние библиотеки. Эта задача почти на 100% основана на правильном прототипировании интерфейсов COM, таких как IGraphBuilder, IBaseFilter, IPin и т. Д. И если интерфейс прототипирован неправильно, возникают различные исключения на управляемых / собственных границах. Проблема состоит в том, чтобы определить местоположение метода интерфейса с неверным прототипом.

В настоящее время у меня есть: Исключение типа 'System.NullReferenceException' произошло в DirectShow.dll (это имя моей управляемой dll) и не было обработано до управляемой / собственной границы

Стек вызовов:

ntdll.dll! NtWaitForSingleObject ( ) + 0xa байтов
KernelBase.dll! WaitForSingleObjectEx () + 0x9c байт
clr.dll! CLREvent :: WaitEx () + 0x20f байт
clr.dll! CLREvent :: WaitEx () + 0x1b8 байт
clr.dll! CLREvent :: WaitEx () + 0x73 байта
clr.dll! Thread :: WaitSuspendEventsHelper () + 0xcf байт clr.dll! Thread :: WaitSuspendEvents () + 0x10 байт
clr.dll! string "d: \ iso_whid \ amd64fre \ base \ ntos \ r" ... () + 0x35688d байт
clr.dll! Thread :: RareDisablePreemptiveGC () + 0x118 байт
clr.dll! GCHolderEEInterface <0,0,0> :: ~ GCHolderEEInterface <0,0,0> () + 0x19 байт clr.dll! Debugger :: SendCatchHandlerFound () + 0x150 байт
clr.dll! string "d: \ iso_whid \ amd64fre \ base \ ntos \ r" ... () + 0x3b9340 байт
clr.dll! NotifyOfCHFFilterWrapper () + 0x77 байт
clr.dll! string "d: \ iso_whid \ amd64fre \ base \ ntos \ r" ... () + 0x336941 байт
msvcr100_clr0400.dll! __ C_specific_handler () + 0x97 байт
ntdll.dll! RtlpExecuteHandlerForException () + 0xd байт ntdll.dll! RtlDispatchException () + 0x38f байт ntdll.dll! KiUserExceptionDispatch () + 0x2e байтов
KernelBase.dll! RaiseException () + 0x3d байтов
clr.dll! NakedThrowHelper2 () + 0xc байтов
clr.dll! NakedThrowHelper_RspAligned () + 0x3d байтов clr.dll! NakedThrowHelper_FixRsp () + 0x5 байт
000007ff00179486 ()
clr.dll! COMToCLRDispatchHelper () + 0x4e байтов
clr.dll! SecurityDeclarative :: CheckLinkDemandAgainstAppDomain () - 0x40e байт
clr.dll! COMToCLRWorkerBody () + 0xd6 байт
clr.dll! COMToCLRWorkerDebuggerWrapper () + 0x22 байта
clr.dll! COMToCLRWorker () + 0x201 байт clr.dll! GenericComCallStub () + 0x57 байт
[Переход от собственного к управляемому]
quartz.dll! CEnumConnectedPins :: CEnumConnectedPins () + 0x4a байтов
quartz.dll! CFilterGraph :: FindUpstreamInterface () + 0x150 байт quartz.dll! CFilterGraph :: FindUpstreamInterface () + 0xc1 байт
quartz.dll! CFilterGraph :: FindUpstreamInterface () + 0x171 байт quartz.dll! CFilterGraph :: FindUpstreamInterface () + 0xc1 байт
quartz.dll! CFilterGraph :: FindUpstreamInterface () + 0x171 байт quartz.dll! CFilterGraph :: FindUpstreamInterface () + 0xc1 байт
quartz.dll! CWaveSlave :: UpdateSlaveMode () + 0xa7 байт
quartz.dll! CWaveOutInputPin :: RemovePreroll () + 0x95 байт
quartz.dll! CWaveOutInputPin :: Receive () + 0x12f байт
msmpeg2adec.dll! CBaseOutputPin :: Deliver () + 0x22 байта msmpeg2adec.dll! CIVIAudioFilter :: DeliverOutSample () + 0x3da байтов
msmpeg2adec.dll! CIVIAudioCodec :: DecodeDDPlus () + 0x556 байт
msmpeg2adec.dll! CIVIAudioCodec :: DecodeAll () + 0x121 байт
msmpeg2adec.dll! CIVIAudioFilter :: Process () + 0xda7 байт
msmpeg2adec.dll! CIVIAudioFilter :: Receive () + 0x16d байтов
msmpeg2adec.dll! CTransformInputPin :: Receive () + 0x4c байтов msmpeg2adec.dll! CIVIAudioInPin :: Receive () + 0x3f байт quartz.dll! CBaseOutputPin :: Deliver () + 0x22 байта
quartz.dll! CBaseMSRWorker :: TryDeliverSample () + 0x14f байт
quartz.dll! CBaseMSRWorker :: PushLoop () + 0x1da байт
quartz.dll! CBaseMSRWorker :: ThreadProc () + 0x90 байт
quartz.dll! CAMThread :: InitialThreadProc () + 0x1c байт kernel32.dll! BaseThreadInitThunk () + 0xd байт ntdll.dll! RtlUserThreadStart () + 0x21 байт

Другими словами, конвейер:

  1. Функция собственного кода с именем CEnumConnectedPins ()
  2. Переход от собственного к управляемому -> Если здесь возникает исключение, то xxx из шага 3 известен только маршаллеру, но мы находимся в глуши.
  3. Метод управляемого кода с именем xxx.

Так что это никуда меня не приведет, и я не знаю, как это отладить.

5
задан SSS 13 October 2017 в 00:04
поделиться