Как я могу сказать, какая DLL запустила поток и какое адресное пространство принадлежит DLL для внешней DLL? - PullRequest
1 голос
/ 29 ноября 2011

У меня есть приложение Delph 6 DirectShow, которое обменивается аудио через Skype через сокеты. Я получаю прерывистое нарушение прав доступа в одном из потоков, запущенных одной из библиотек DLL, загруженных графом фильтров при запуске цепочки фильтров DirectShow. DLL не принадлежит мне, поэтому у меня нет исходного кода.

Я изучил журнал событий и вижу соответствующую выдержку при запуске графика фильтра:

Thread Start: Thread ID: $00000804. Process Test.exe ($CE4)
Module Load: QCap.dll. No Debug Info. Base Address: $757F0000. Process Test.exe ($CE4)
Thread Start: Thread ID: $00000608. Process Test.exe ($CE4)
Thread Start: Thread ID: $0000259C. Process Test.exe ($CE4)
Thread Start: Thread ID: $00002778. Process Test.exe ($CE4)
ODS: DXCHAIN, STARTING> DXCaptureFilterComponent1 succeeded Process Test.exe ($CE4)
ODS: DXCHAIN, STARTING> DXChainComp_mic2skype Process Test.exe ($CE4)
Module Load: DSOUND.dll. No Debug Info. Base Address: $73F10000. Process Test.exe ($CE4)
ODS: (TPushSourcePinBase_wavaudio.Create) Construction succeeded. Process Test.exe ($CE4)
ODS: (TPushSourcePinBase_wavaudio.Create) Construction succeeded. Process Test.exe ($CE4)
Module Load: wavdest.ax. No Debug Info. Base Address: $10000000. Process Test.exe ($CE4)
ODS: (TPushSourcePinBase_wavaudio.DecideBufferSize) Resulting buffer size for audio is: 800 Process Test.exe ($CE4)
ODS: (TPushSourcePinBase_wavaudio.DecideBufferSize) Resulting buffer size for audio is: 800 Process Test.exe ($CE4)
Thread Start: Thread ID: $000027E0. Process Test.exe ($CE4)
Thread Start: Thread ID: $00001DF0. Process Test.exe ($CE4)
Thread Start: Thread ID: $0000176C. Process Test.exe ($CE4)
Thread Start: Thread ID: $0000083C. Process Test.exe ($CE4)

Обратите внимание, строки ODS являются результатом операторов "debug print" в окне монитора отладки (OutputDebugString)

Поток, который выбросил AV в документированном выше испытании, был $ 0000176C. Поток - всегда - создан 12-й поток, а местоположение, сообщаемое отладчиком для AV, всегда * $ 77BEFOOF *. Мои вопросы:

1) Как определить, какой из динамически загружаемых библиотек DLL принадлежит неисправный поток?

2) Есть ли способ узнать начальную и конечную области памяти для каждой DLL, даже для тех, для которых у меня нет исходного кода, чтобы я мог видеть, какая DLL содержит $ 77BEF00F адрес местоположения?

3) У кого-нибудь когда-нибудь были проблемы с приложением, которое смешивало цепочки и сокеты DirectShow? Любые предостережения или советы вы можете бросить меня? Цепочки DirectShow в моем приложении смешивают аудиоданные, поступающие из сокетов, и отправляют данные в сокеты.

ОБНОВЛЕНИЕ : Используя совет Process Explorer от Roman R, я отследил местоположение ошибки AV от $ 77BEFOOF до msacm32.dll , то есть Microsoft Audio Compression Диспетчер (отображается как «Аудиофильтр Microsoft ACM» в поле Process Explorer Description .) Если у кого-либо есть опыт работы с проблемами с этой DLL, пожалуйста, поделитесь.

1 Ответ

2 голосов
/ 29 ноября 2011

Потоки не принадлежат DLL, они принадлежат процессам. Обычно вам нужно, чтобы из какой DLL была запущена нить, так что вы вызовете стек вызовов chcek и увидите, какие записи находятся в самом низу - это покажет, кто является инициатором потока.

WinInet's Thread

DLL отображается в процесс по определенному базовому адресу, вы можете запросить это программно через PSAPI (например, EnumProcessModules), или Process Explorer может получить его для вас в интерактивном режиме (столбцы Base, Size).

enter image description here

...