在旧版c#代码中查找文件锁

时间:2014-03-23 21:05:44

标签: c# debugging file-locking

我有一个有趣的问题 - 我继承了一个很大的代码库(棕色字段)。

应用程序按计划运行并接收大量数据文件(文本),处理它们,然后导出报告并进行清理。

已经发现了一个错误,即在之后尝试清理时,某些文件仍处于locked状态,即使所有文件活动都已超出范围。这会阻止应用程序在清理期间删除它们。

在这个应用程序中使用了数百个IO和流对象等,我想知道从哪里开始寻找保存审查其使用的每个实例。

在c#托管代码中调查文件锁的有哪些好工具,以及如何使用它们?

2 个答案:

答案 0 :(得分:1)

您可以使用SysInternals中的ProcMon监控文件访问(读/写)。 它不是特定于c#,而是一种可用于许多其他事物的通用工具。请注意,您可以将结果导出到csv并稍后进行调查。

您可以使用以下指南之一:

修改

我没有为此目的找到任何东西,所以如果我是你,我将继承所使用的蒸汽,并用记录逻辑包装它。

此日志记录流对象(例如名为LogStream)将在每个方法入口之前写入日志,调用base.function()并在完成后写入另一个日志。

这样您就可以根据需要监控文件访问。例如,使用Guid.NewGuid()将每个流实例记录为Id,使用System.Threading.Thread.CurrentThread.ManagedThreadId等记录线程ID。

通过这种方式,您可以识别实例并慢慢调查调用。

要开始的一点是检查流打开和关闭是否有相同的数字,例外可能会避免其中一个Dispose()来电。

答案 1 :(得分:1)

当您忘记处置拥有文件句柄的父对象时,通常会发生这种情况。例如。你忘了给FileStream调用Close / Dispose。然后,在下一个完整GC期间不再引用文件句柄时,终结器将清理文件句柄。

如果您已在最终确定队列中准备好SafeFileHandles,则可以使用Windbg进行检查。可以跟踪这些事物的分析器例如是YourKit可以在启用探针时搜索在终结器中关闭的文件,并为您提供创建调用堆栈,使您能够在代码中搜索有问题的行。 查看YourKit的过程检查选项卡以查找探针检查。