问题 如何在Visual Studio 2003中检查调试器中的XML流


我必须编辑一个XSLT样式表,但我是盲目的,因为XML输入只是在一堆流中短暂存在。我可以调试代码,但无法弄清楚如何将流的内容输出到我可以看到的文本中(并在我编辑它们时手动运行XSLT)。

代码是一个很大的遗留系统的一部分,我可以在调试环境中修改它,如果绝对必要,但它运行在一个连接到一堆MSMQ的Windows服务中。因此,出于各种原因,我宁愿能够使用调试器来查看XML,而无需先更改代码。

代码大大简化了,就像这样:( C# - 但请记住它在VS 2003中的.net 1.1。)

这是将XML作为流获取的函数,然后将其提供给某种XSLT转换对象。我已经尝试在监视窗口和即时窗口中查看writer和xmlStream对象,但无法理解如何查看实际的XML。

private MemoryStream GetXml()
{
    MemoryStream xmlStream;
    xmlStream = new MemoryStream();
    XmlWriter writer = new XmlTextWriter(xmlStream, Encoding.UTF8);
    writer.WriteStartDocument();
    //etc etc...
    writer.WriteEndDocument();
    writer.Flush();
    xmlStream.Position = 0;
    return xmlStream; //Goes off to XSLT transform thingy!
}

所有人都非常感谢。


6758
2018-05-06 16:17


起源



答案:


在MemoryStream准备就绪后,您可以简单地将此表达式添加到监视窗口:

(new StreamReader(xmlStream)).ReadToEnd();

监视表达式不需要是简单的变量值。它们可以是复杂的表达,但它们会产生副作用。正如您所指出的,这将中断执行,因为流内容将被完全读出。如果需要重新开始执行,可以在中断后使用另一个表达式重新创建流。

当使用流来调试代码时,这种情况经常出现,因此我将它们用于简单,自包含的任务。不幸的是,对于大型系统而言,事先并不容易知道是否应该使代码流面向,因为它在很大程度上取决于它的使用方式。但是,我认为在许多情况下使用流是不成熟的优化。


14
2018-05-29 16:13



对于那些遇到谷歌这个答案的人(就像我做的那样),请记住,如果已经从中读取过,可能需要将Stream指针重置为开头。这可以使用 xmlStream.Position = 0; 要么 xmlStream.Seek(0, SeekOrigin.Begin);。由于观看的表达式在执行此操作后不会自动更新,因此我建议从立即窗口执行这两个命令。 - Steve Chambers


答案:


在MemoryStream准备就绪后,您可以简单地将此表达式添加到监视窗口:

(new StreamReader(xmlStream)).ReadToEnd();

监视表达式不需要是简单的变量值。它们可以是复杂的表达,但它们会产生副作用。正如您所指出的,这将中断执行,因为流内容将被完全读出。如果需要重新开始执行,可以在中断后使用另一个表达式重新创建流。

当使用流来调试代码时,这种情况经常出现,因此我将它们用于简单,自包含的任务。不幸的是,对于大型系统而言,事先并不容易知道是否应该使代码流面向,因为它在很大程度上取决于它的使用方式。但是,我认为在许多情况下使用流是不成熟的优化。


14
2018-05-29 16:13



对于那些遇到谷歌这个答案的人(就像我做的那样),请记住,如果已经从中读取过,可能需要将Stream指针重置为开头。这可以使用 xmlStream.Position = 0; 要么 xmlStream.Seek(0, SeekOrigin.Begin);。由于观看的表达式在执行此操作后不会自动更新,因此我建议从立即窗口执行这两个命令。 - Steve Chambers


好的,我没有成功使用调试器而没有修改代码。我在下面的代码片段中添加了,它允许我放入断点或使用debugview。

private MemoryStream GetXml()
{
    MemoryStream xmlStream;
    xmlStream = new MemoryStream();
    XmlWriter writer = new XmlTextWriter(xmlStream, Encoding.UTF8);
    writer.WriteStartDocument();
    //etc etc...
    writer.WriteEndDocument();
    writer.Flush();
    xmlStream.Position = 0;

    #if DEBUG
    string temp;
    StreamReader st=new StreamReader(xmlStream);
    temp=st.ReadToEnd();
    Debug.WriteLine(temp);
    #endif

    return xmlStream; //Goes off to XSLT transform thingy!
}

我仍然宁愿简单地以某种方式查看调试器中的xmlstream对象,即使它破坏了执行流程,但同时这是我管理的最好的。


1
2018-05-06 17:50