如何判断DLL启动线程的内容以及DLL为外部DLL拥有的地址空间?

时间:2011-11-29 11:31:20

标签: multithreading dll directshow access-violation

我有一个Delph 6 DirectShow应用程序,它通过套接字与Skype交换音频。我在运行DirectShow过滤器链时,由Filter Graph加载的一个DLL启动的其中一个线程中出现间歇性访问冲突。 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 Monitor窗口(OutputDebugString)的“debug print”语句的结果

上面记录的试用AV的线程是$ 0000176C。线程始终创建的第12个线程,调试器为AV报告的位置始终 * $ 77BEFOOF *。我的问题是:

1)如何判断哪个动态加载的DLL拥有错误线程?

2)有没有办法找出每个DLL的开始和结束内存位置,即使是我没有源代码的那些,所以我可以看到哪个DLL包含 $ 77BEF00F 地址位置?

3)有没有人遇到混合DirectShow链和套接字的应用程序的问题?你可以抛弃我的任何警告或提示?我的应用程序中的DirectShow链混合了来自套接字的音频数据并将数据发送到套接字。

更新:使用Roman R的Process Explorer提示我已将 $ 77BEFOOF 的AV故障位置跟踪到 msacm32.dll ,这是Microsoft音频压缩管理器(在Process Explorer 描述字段中显示为“Microsoft ACM Audio Filter”。)如果任何人有任何关于该DLL问题的现场经验,请分享。

1 个答案:

答案 0 :(得分:2)

线程不属于DLL,属于进程。你通常会想要哪个DLL启动一个线程,所以你将chcek线程调用堆栈,看看底部的条目是什么 - 这将表明谁是线程启动器。

WinInet's Thread

DLL被映射到特定基地址的进程,您可以通过PSAPI(例如EnumProcessModules)以编程方式查询,或Process Explorer可以交互式地获取({{1}列},Base)。

enter image description here