Ste*_*idi 3 .net io file-locking sos ioexception
我正在调试一个定期引发的测试IOException,注意到一个文件因为被另一个进程使用而无法删除.我怀疑这个过程确实是我的测试工具,并且进程中的其他一些线程在我预期时没有处理它的文件资源.
有没有一个工具可以用来确定哪个线程阻挡了阻碍锁?如果我可以识别线程,那么我可以检查它的调用堆栈,并至少尝试确定资源尚未处理的原因.该SOS调试工具看起来很有希望,但我不认为这会从我的调查中删除的猜测相当数量的任何特征.
一种想法是识别本机OS线程ID,然后可以通过SOS将其映射到托管线程ID.我将如何完成前者?
您可以使用SysInternals工具中的Process Explorer.http://technet.microsoft.com/en-us/sysinternals/bb896653 只需打开它并搜索您的文件名.它会告诉你什么进程锁定它.
编辑:
哦,我只是重新阅读,并注意到你要求具体的线程.我不知道ProcessExplorer是否可以做到这一点.抱歉!
编辑2:
第二个答案,扩展了agent-j的答案:
如果您可以编辑代码并在其周围添加try/catch以获取IOException,您还可以记录堆栈跟踪,因为它听起来就像您要检查的那样:
catch(IOException)
{
LogMessage( string.Format(
"Managed Thread Id: {0}",
System.Threading.Thread.CurrentThread.ManagedThreadId) );
LogMessage( string.Format(
"Stack Trace: {0}",
new System.Diagnostics.StackTrace(true).ToString()) );
}
Run Code Online (Sandbox Code Playgroud)
编辑3
使用上面的方法,您还可以记录进程中所有线程的线程和堆栈跟踪,从而更容易查看日志并找出事后发生的情况.更新的代码:
catch(IOException)
{
foreach (var thread in System.Diagnostics.Process.GetCurrentProcess().Threads)
{
LogMessage(string.Format(
"Managed Thread Id: {0}",
thread.ManagedThreadId));
LogMessage(string.Format(
"Stack Trace: {0}",
new System.Diagnostics.StackTrace(thread, true).ToString()));
}
}
Run Code Online (Sandbox Code Playgroud)