C# 有没有一种方法可以从VS中的调试器转储流
我正在使用VS2010,在我当前的项目中,我正在使用C#中的许多流。我已经编写了一些流转储实用程序,用于编写特定类型的流以进行调试,但我似乎在调试时遇到了一些问题,需要查看正在调试的流,但我没有将转储调用放在那里。似乎我应该能够以某种方式使用VS转储流,或者告诉它在调试器中对流调用我的转储方法之一。有一个wy来做这个吗C# 有没有一种方法可以从VS中的调试器转储流,c#,visual-studio,stream,C#,Visual Studio,Stream,我正在使用VS2010,在我当前的项目中,我正在使用C#中的许多流。我已经编写了一些流转储实用程序,用于编写特定类型的流以进行调试,但我似乎在调试时遇到了一些问题,需要查看正在调试的流,但我没有将转储调用放在那里。似乎我应该能够以某种方式使用VS转储流,或者告诉它在调试器中对流调用我的转储方法之一。有一个wy来做这个吗 我正在处理的流有一些文本描述一个数据块,然后是该数据块的字节,因此查看描述很有用。我的转储方法通常只转储这些信息,然后跳过blob。也许您可以编写一个可视化工具? MSDN在此处
我正在处理的流有一些文本描述一个数据块,然后是该数据块的字节,因此查看描述很有用。我的转储方法通常只转储这些信息,然后跳过blob。也许您可以编写一个可视化工具?
MSDN在此处解释了如何进行调试:您可以在调试时使用即时窗口调用转储函数:
MikeDsDumpFxn(whateverStreamIsActiveInThisContext)
如果函数返回一个字符串,它将在即时窗口中打印结果。在即时窗口中键入:
System.Diagnostics.Debug.WriteLine((new System.IO.StreamReader(stream)).ReadToEnd());
如果流中有二进制数据,可以尝试使用
即时窗口中的以下行将其转储到文件中:
var lastPos = stream.Position;
stream.Seek(0, SeekOrigin.Begin)
File.WriteAllBytes("filepath.bin", new BinaryReader(stream).ReadBytes((int)stream.Length))
stream.Seek(lastPos, SeekOrigin.Begin)
很明显,水流必须是可寻的,以防止倾倒时改变水流位置的副作用(在最后一行中恢复)
如果流没有Length
属性,则可以使用类似的解决方案:
非常好,这是一个很好的解决方案,允许我将转储函数作为调试程序的一部分。您可能需要System.Diagnostics.Debug.WriteLine((new System.IO.StreamReader(stream)).ReadToEnd())请注意,这将占用调用,因此您应该知道您可能无法继续当前调试会话。
var lastPos = stream.Position;
var ms = new MemoryStream();
stream.Seek(0, SeekOrigin.Begin)
stream.CopyTo(ms)
File.WriteAllBytes("filepath.bin", ms.ToArray())
stream.Seek(lastPos, SeekOrigin.Begin)