我有一个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问题的现场经验,请分享。
答案 0 :(得分:2)
线程不属于DLL,属于进程。你通常会想要哪个DLL启动一个线程,所以你将chcek线程调用堆栈,看看底部的条目是什么 - 这将表明谁是线程启动器。
DLL被映射到特定基地址的进程,您可以通过PSAPI
(例如EnumProcessModules
)以编程方式查询,或Process Explorer
可以交互式地获取({{1}列},Base
)。