Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 7 如何深入到创建句柄的代码_Windows 7_Sysinternals_Handle - Fatal编程技术网

Windows 7 如何深入到创建句柄的代码

Windows 7 如何深入到创建句柄的代码,windows-7,sysinternals,handle,Windows 7,Sysinternals,Handle,我知道如果我们提供Handle.exe的绝对路径,它将列出锁定该文件的所有进程 F:\Softwares\Handle>Handle.exe D:\Source\sample.dll Handle v4.0 Copyright (C) 1997-2014 Mark Russinovich Sysinternals - www.sysinternals.com test1.exe pid: 9928 type: File 408: D:\So

我知道如果我们提供Handle.exe的绝对路径,它将列出锁定该文件的所有进程

F:\Softwares\Handle>Handle.exe  D:\Source\sample.dll

Handle v4.0
Copyright (C) 1997-2014 Mark Russinovich
Sysinternals - www.sysinternals.com

test1.exe           pid: 9928   type: File           408: D:\Source\sample.dll
test2.exe           pid: 10840  type: File           6A8: D:\Source\sample.dll
test3.exe           pid: 15788  type: File           374: D:\Source\sample.dll
test4.exe           pid: 10940  type: File           308: D:\Source\sample.dll
test5.exe           pid: 15424  type: File           3FC: D:\Source\sample.dll
test6.exe           pid: 10076  type: File           8AC: D:\Source\sample.dll
Windows 7 64位

正如Handle.exe所述,我的sample.dll被6个不同的进程锁定。 我想知道哪一行代码实际上保存了每个进程的sample.dll。 我的任务是修复我庞大应用程序中的句柄泄漏。所以我的问题并不是固定在程序的某个特定部分。 任务是我必须生成包含句柄泄漏的报告,并诊断是谁创建了它。 泄漏并非特定于文件,它扩展到所有系统资源,如文件、注册表项、事件、信号量、线程等

我使用windbg进行了转储,但我找不到如何诊断转储文件,尤其是处理泄漏。在我大约半天的搜索中,a找不到适合我问题的好教程或解决方案


是否有任何命令行工具或其他工具可以回答我的问题。

您使用了错误的调试工具。您想了解的是,它非常详细地介绍了如何使用调试器命令获取泄漏句柄的堆栈跟踪。问题也包括在内


您将看到经常提到的“Windows调试工具”。它不再是单独的下载,而是包含在Windows SDK安装中。

我认为您可以使用另一个工具找到罪魁祸首

它将使您的一天,唯一的问题是在处理创建速度非常慢的情况下-您不能记录超过十分之几分钟的系统活动。。。除非您的系统安装了大量内存

一旦您记录了事件(别忘了以管理员身份运行它,并在几分钟后停止它,通常我更喜欢在停止后分析捕获的数据),请转到菜单“工具”->“文件摘要”,并在那里找到访问的文件

双击文件(或文件夹视图中的目录,等等…双击“anywehere”)将在procmon视图中添加一个过滤器,并允许您分析系统中运行的任何进程执行的与此相关的每个操作


如果双击单个操作,还可以在该系统调用的上下文中查看堆栈的回溯,以及有关I/O(在这种特定情况下)操作的其他详细信息。

在没有可读调试信息(PDB)的编译应用程序中,这是不可能的。代码行与编译时生成的汇编语句之间没有固定的关系,因此通常不可能将语句跟踪回高级代码。使用完全解释的语言和一些混合的解释器运行时,这是可能的,但这远远不是通用的,而且即使是可能的。理论上可以是任意数量的线。你们到底想解决什么问题?@Ramhound在我上面的例子中,D:\Source\Sample.dll被6进程锁定。在我的应用程序中,这是由部分代码加载的,没有正确发布。还有类似的问题,比如句柄泄漏、文件、注册表项、事件等等。我的问题是代码的哪一部分锁定了句柄?我想要一个实用的解决方案通常,DLL加载是在程序代码之外处理的。您只需要包含一个dll,其余部分由编译器和加载程序负责。对于(非dll)外部资源泄漏,请正确实现try finally结构,以确保即使发生崩溃也能释放资源。短期锁发生在读取时,长期锁发生在打开文件进行写入或主动写入时。@Srikanth-每次从dll加载符号,然后调用该代码时,都会在dll上创建依赖项。你有这些进程的调试信息吗?谢谢,我已经更新了我的帖子,也是按照你的建议,我已经在使用windbg了,我不知道如何使用windbg进入代码级。由于windbg的结果始终是内核中对象引用表的内存位置。您可以设置筛选器和“删除筛选事件”,以允许procmon在不达到内存限制的情况下运行更长的时间。