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

Мне нужно отредактировать таблицу стилей 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 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам