有没有办法从 VS 中的调试器中转储流

Posted

技术标签:

【中文标题】有没有办法从 VS 中的调试器中转储流【英文标题】:Is there a way to dump a stream from the debugger in VS 【发布时间】:2010-12-20 10:32:39 【问题描述】:

我正在使用 VS 2010,并且在我当前的项目中使用 C# 处理大量流。我已经编写了一些流转储实用程序来写出某些类型的流以用于调试目的,但我似乎在调试时不断绊倒,需要查看我正在调试的流,但我没有把我的在那里转储电话。似乎我应该能够仅使用 VS 以某种方式转储流,或者告诉它在调试器中的流上调用我的转储方法之一。有没有办法做到这一点?

我正在使用的流有一些描述数据块的文本,然后是块的字节,因此查看描述很有用。我的转储方法通常只是将这些信息转储出去,然后跳过 blob。

【问题讨论】:

【参考方案1】:

在即时窗口中输入:

System.Diagnostics.Debug.WriteLine((new System.IO.StreamReader(stream)).ReadToEnd());

【讨论】:

您可能需要System.Diagnostics.Debug.WriteLine((new System.IO.StreamReader(stream)).ReadToEnd()); 请注意,这会消耗调用,因此您应该知道您可能无法继续当前的调试会话。【参考方案2】:

也许你可以写一个可视化工具? MSDN 在这里解释了如何:http://msdn.microsoft.com/en-us/library/e2zc529c.aspx

【讨论】:

非常好,这是一个很棒的解决方案,可以让我的转储函数成为调试器的一部分【参考方案3】:

您可以在调试时使用即时窗口调用转储函数:

MikeDsDumpFxn(whateverStreamIsActiveInThisContext)

如果你的函数返回一个字符串,它会在即时窗口中直接打印出来。

【讨论】:

【参考方案4】:

如果流中有二进制数据,可以尝试使用immediate window 中的以下行将其转储到文件中:

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 属性,您可以使用类似的解决方案to the one done here:

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)

【讨论】:

以上是关于有没有办法从 VS 中的调试器中转储流的主要内容,如果未能解决你的问题,请参考以下文章

gdb 调试远程核心转储

Visual Studio C++ 调试器:没有十六进制转储?

vs2005调试的时候老是弹出来“没有可用于当前位置可用的源代码”,这个问题怎么解决??

从 python 调试 VS2010 中的 c++ dll

VS如何在调试时进入到dll文件

如何在 Visual Studio 中调试/分析 BSOD 转储?