Как проверить потоки XML из отладчика в Visual Studio 2003 - PullRequest
11 голосов
/ 06 мая 2009

Мне нужно отредактировать таблицу стилей XSLT, но я слепой, потому что входные данные XML существуют только в нескольких потоках. Я могу отладить код, но не могу понять, как вывести содержимое потоков в текст, на который я могу смотреть (и запускать XSLT вручную, пока я их редактирую).

Код является частью большой старой унаследованной системы, я могу изменить его в среде отладки, если это абсолютно необходимо, но он работает в службе Windows, подключенной к группе MSMQ. Поэтому по разным причинам я бы предпочел использовать отладчик для просмотра XML без необходимости сначала изменять код.

Код значительно упрощен, это что-то вроде этого: (C # - но помните, что это .net 1.1 в VS 2003.)

Это функция, которая получает 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!
}

Вся помощь очень ценится.

Ответы [ 2 ]

14 голосов
/ 29 мая 2009

Вы можете просто добавить это выражение в окно просмотра после того, как MemoryStream будет готов:

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

Следующие выражения не должны быть простыми значениями переменных. Они могут быть сложными выражениями, но они будут иметь побочные эффекты. Как вы заметили, это прервет выполнение, поскольку содержимое потока будет считано полностью. Вы можете воссоздать поток после прерывания с помощью другого выражения, если вам нужно перезапустить выполнение.

Такая ситуация часто возникает при отладке кода с помощью потоков, поэтому я избегаю их для простых, автономных задач. К сожалению, для больших систем не всегда легко узнать заранее, следует ли делать код ориентированным на поток или нет, поскольку это во многом зависит от того, как он будет использоваться. Однако во многих случаях я считаю использование потоков преждевременной оптимизацией.

1 голос
/ 06 мая 2009

ОК, мне не удалось использовать отладчик без изменения кода. Я добавил в следующем фрагменте, который позволяет мне либо установить точку останова, либо использовать 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 в отладчике, даже если он нарушает ход выполнения, но пока что это лучшее, что мне удалось.

...