Multithreading 我如何知道哪个DLL启动了一个线程,以及一个DLL为一个外部DLL拥有什么地址空间?

Multithreading 我如何知道哪个DLL启动了一个线程,以及一个DLL为一个外部DLL拥有什么地址空间?,multithreading,dll,directshow,access-violation,Multithreading,Dll,Directshow,Access Violation,我有一个Delph 6 DirectShow应用程序,可以通过套接字与Skype交换音频。当运行DirectShow筛选器链时,我在由筛选器图加载的DLL之一启动的一个线程中遇到间歇性访问冲突。DLL不属于我,因此我没有源代码 我检查了事件日志,并在运行筛选器图时看到了以下相关摘录: Thread Start: Thread ID: $00000804. Process Test.exe ($CE4) Module Load: QCap.dll. No Debug Info. Base Addr

我有一个Delph 6 DirectShow应用程序,可以通过套接字与Skype交换音频。当运行DirectShow筛选器链时,我在由筛选器图加载的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行是调试监视器窗口(OutputDebugString)的“调试打印”语句的结果

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

1) 我如何判断哪个动态加载的DLL拥有故障线程

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

3) 有没有人遇到过混合DirectShow链和套接字的应用程序的问题?你能给我一些提示吗?我的应用程序中的DirectShow链混合来自套接字的音频数据,并将数据发送到套接字


更新:使用Roman R的Process Explorer提示,我跟踪了$77BEFOOFmsacm32.dll的AV故障位置,msacm32.dll是Microsoft音频压缩管理器(在Process Explorer描述字段中显示为“Microsoft ACM音频过滤器”)如果任何人在该DLL方面有任何问题,请分享。

线程不属于DLL,它们属于进程。您通常需要哪个DLL启动了一个线程,因此您将chcek thread call stack并查看最底部的条目-这将建议谁是线程启动者

DLL被映射到进程的某个基址,您可以通过
PSAPI
(例如)以编程方式进行查询,或者以交互方式(列
base
Size
)将其发送给您


谢谢。我更改了文章的标题和一些措辞,以表明我正在寻找启动线程的DLL,而不是它的所有者。不幸的是,Delphi调试器没有在堆栈上显示出现故障的线程的任何内容,CPU窗口只显示一大块汇编指令,没有任何有用的上下文标签。是否有方法捕获CreateThread()调用或其他方法来尝试更准确地确定哪个DLL启动了线程?如果有机会,请评论我上面关于Microsoft Audio Compression Manager的更新。如果您有AV,这次或将来,请始终附加故障线程的完整调用堆栈。这是有帮助的。我记得一些
ACM
驱动程序有一个问题,但是细节消失了。我的线索是,您可能不正确地构建了媒体类型,并且驱动程序没有正确地检查/验证它,从而导致AV。请参阅我对您在其他评论线程上的完整调用堆栈评论的回复: