Как проверять потоки XML из отладчика в Visual Studio 2003

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

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

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

Это функция, которая получает XML в виде потока, который затем передается в какой-то объект преобразования XSLT. Я пробовал смотреть на объекты записи и 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!
}

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


person Andrew M    schedule 06.05.2009    source источник


Ответы (2)


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

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

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

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

person PeterAllenWebb    schedule 29.05.2009
comment
Для тех, кто столкнется с этим ответом от Google (как и я), также имейте в виду, что вам может потребоваться сбросить указатель Stream на начало, если он уже был прочитан. Это можно сделать с помощью xmlStream.Position = 0; или xmlStream.Seek(0, SeekOrigin.Begin);. Поскольку наблюдаемое выражение не обновляется автоматически после этого, я бы рекомендовал выполнять обе команды из окна Immediate. - person Steve Chambers; 09.05.2013

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

person Andrew M    schedule 06.05.2009