Поделиться через


Трассировка и отладка в Visual C sharp

В этой статье описывается трассировка и отладка в Visual C# и приведены некоторые примеры действий для объяснения связанных сведений.

Исходная версия продукта: Visual C#
Исходный номер базы знаний: 815788

Итоги

Сведения о версии .NET в Microsoft Visual Basic см. в статье "Использование классов трассировки и отладки" в Visual Basic .NET.

В этой статье рассматривается система пространства имен библиотеки классов платформа .NET Framework. Диагностика и описание использования классов и Trace их использованияDebug. Эти классы доступны в платформа .NET Framework. Эти классы можно использовать для предоставления сведений о производительности приложения во время разработки приложений или после развертывания в рабочей среде. Эти классы являются только одной частью функций инструментирования, доступных в платформа .NET Framework.

Требования

В следующем списке описаны рекомендуемые аппаратные средства, программное обеспечение, сетевая инфраструктура и пакеты обновления.

  • Microsoft Windows
  • Microsoft Visual C#

В этой статье также предполагается, что вы знакомы с отладкой программы.

Описание техники

Действия, описанные в разделе "Создание примера" с разделом "Класс отладки", демонстрируют создание консольного приложения, использующего Debug класс для предоставления сведений о выполнении программы.

При запуске программы можно использовать методы Debug класса для создания сообщений, которые помогают отслеживать последовательность выполнения программы, обнаруживать неисправности или предоставлять сведения о измерении производительности. По умолчанию сообщения, создаваемые Debug классом, отображаются в окне вывода интегрированной среды разработки Visual Studio (IDE).

В примере кода WriteLine используется метод для создания сообщения, за которым следует терминатор строки. При использовании этого метода для создания сообщения каждое сообщение отображается в отдельной строке в окне вывода.

При использовании Assert метода Debug класса окно вывода отображает сообщение только в том случае, если указанное условие оценивается как false. Сообщение также отображается в модальном диалоговом окне для пользователя. Диалоговое окно содержит сообщение, имя проекта и .Debug Номер оператора Assert. Диалоговое окно также включает следующие три кнопки команд:

  • Прерывание: приложение перестает работать.

  • Повторите попытку: приложение вводит режим отладки.

  • Игнорировать: приложение продолжается. Пользователь должен щелкнуть одну из этих кнопок, прежде чем приложение сможет продолжить работу.

Вы также можете направлять выходные Debug данные из класса в назначения, отличные от окна вывода. Класс Debug имеет коллекцию Прослушивателей, содержащую Listener объекты.

Каждый объект прослушивателя отслеживает Debug выходные данные и направляет выходные данные в указанный целевой объект.

Каждый прослушиватель в коллекции прослушивателя получает все выходные данные, создаваемые классом Debug . TextWriterTraceListener Используйте класс для определения Listener объектов. Целевой TextWriterTraceListener объект для класса можно указать с помощью конструктора.

Ниже приведены некоторые возможные целевые показатели выходных данных:

  • Окно консоли с помощью System.Console.Out свойства.
  • Текстовый файл (.txt) с помощью инструкции System.IO.File.CreateText("FileName.txt") . После создания TextWriterTraceListener объекта необходимо добавить объект в Debugобъект. Коллекция прослушивателей для получения Debug выходных данных.

Создание примера с помощью класса отладки

  1. Запустите Visual Studio или Visual C# Express Edition.

  2. Создайте проект консольного приложения Visual C# с именем conInfo. Класс1 создается в Visual Studio .NET. Program.cs создается в Visual Studio 2005.

  3. Добавьте следующее пространство имен в начале класса 1 или Program.cs.

    using System.Diagnostics;
    
  4. Чтобы инициализировать переменные для хранения сведений о продукте, добавьте следующие операторы объявления в метод Main:

    string sProdName = "Widget";
    int iUnitQty = 100;
    double dUnitCost = 1.03;
    
  5. Укажите сообщение, которое класс создает в качестве первого входного параметра WriteLine метода. Нажмите сочетание клавиш CTRL+ALT+O, чтобы убедиться, что окно вывода отображается.

    Debug.WriteLine("Debug Information-Product Starting ");
    
  6. Для удобства чтения используйте Indent метод для отступа последующих сообщений в окне вывода:

    Debug.Indent();
    
  7. Чтобы отобразить содержимое выбранных переменных, используйте WriteLine следующий метод:

    Debug.WriteLine("The product name is " + sProdName);
    Debug.WriteLine("The available units on hand are" + iUnitQty.ToString());
    Debug.WriteLine("The per unit cost is " + dUnitCost.ToString());
    
  8. Можно также использовать WriteLine метод для отображения пространства имен и имени класса для существующего объекта. Например, следующий код отображает System.Xml.XmlDocument пространство имен в окне вывода:

    System.Xml.XmlDocument oxml = new System.Xml.XmlDocument();
    Debug.WriteLine(oxml);
    
  9. Чтобы упорядочить выходные данные, можно включить категорию как необязательный, второй входной параметр WriteLine метода. Если указать категорию, формат сообщения окна вывода — "категория: сообщение". Например, в первой строке следующего кода отображается поле "Поле: имя продукта — мини-приложение" в окне вывода:

    Debug.WriteLine("The product name is " + sProdName,"Field");
    Debug.WriteLine("The units on hand are" + iUnitQty,"Field");
    Debug.WriteLine("The per unit cost is" + dUnitCost.ToString(),"Field");
    Debug.WriteLine("Total Cost is " + (iUnitQty * dUnitCost),"Calc");
    
  10. Окно вывода может отображать сообщения только в том случае, если указанное условие имеет значение true, используя WriteLineIf метод Debug класса. Условие, которое необходимо оценить, является первым входным параметром WriteLineIf метода. Второй параметр WriteLineIf — это сообщение, которое отображается только в том случае, если условие в первом параметре оценивается как true.

    Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear");
    Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");
    
  11. Используйте метод Debug Assert класса, чтобы окно вывода отображалось сообщение, только если указанное условие оценивается как false:

    Debug.Assert(dUnitCost > 1, "Message will NOT appear");
    Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");
    
  12. TextWriterTraceListener Создайте объекты для окна консоли (tr1) и текстового файла с именем Output.txt (tr2), а затем добавьте каждый объект в коллекцию прослушивателей отладки:

    TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
    Debug.Listeners.Add(tr1);
    
    TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("Output.txt"));
    Debug.Listeners.Add(tr2);
    
  13. Для удобства чтения используйте Unindent метод, чтобы удалить отступ для последующих сообщений, создаваемых классом Debug . При совместном использовании Indent Unindent методов средство чтения может различать выходные данные как группы.

    Debug.Unindent();
    Debug.WriteLine("Debug Information-Product Ending");
    
  14. Чтобы убедиться, что каждый Listener объект получает все выходные данные, вызовите метод Flush для Debug буферов классов:

    Debug.Flush();
    

Использование класса trace

Класс также можно использовать Trace для создания сообщений, отслеживающих выполнение приложения. Debug Классы Trace используют большинство методов для создания выходных данных, включая следующие:

  • WriteLine
  • WriteLineIf
  • Отступ
  • Юниндент
  • Assert
  • Краска

Классы можно использовать Trace Debug отдельно или вместе в одном приложении. В проекте Trace конфигурации решения отладки оба и Debug выходные данные активны. Проект создает выходные данные обоих из этих классов ко всем Listener объектам. Однако проект конфигурации решения выпуска создает только выходные Trace данные из класса. Проект конфигурации решения выпуска игнорирует Debug вызовы методов класса.

Trace.WriteLine("Trace Information-Product Starting ");
Trace.Indent();

Trace.WriteLine("The product name is "+sProdName);
Trace.WriteLine("The product name is"+sProdName,"Field" );
Trace.WriteLineIf(iUnitQty > 50, "This message WILL appear");
Trace.Assert(dUnitCost > 1, "Message will NOT appear");

Trace.Unindent();
Trace.WriteLine("Trace Information-Product Ending");

Trace.Flush();

Console.ReadLine();

Убедитесь, что он работает

  1. Убедитесь, что отладка — это текущая конфигурация решения.

  2. Если окно Обозреватель решений не отображается, нажмите сочетание клавиш CTRL+ALT+L, чтобы отобразить это окно.

  3. Щелкните правой кнопкой мыши conInfo и выберите пункт "Свойства".

  4. В левой области страницы свойств conInfo в папке "Конфигурация" убедитесь, что стрелка указывает на отладку.

    Примечание.

    В Visual C# 2005 и Visual C# 2005 Express Edition щелкните "Отладка " на странице conInfo .

  5. Над папкой "Конфигурация" в раскрывающемся списке "Конфигурация" нажмите кнопку "Активный ( отладка) или отладка" и нажмите кнопку "ОК". В Visual C# 2005 и Visual C# 2005 Express Edition щелкните Active (Debug) или Debug в раскрывающемся списке "Конфигурация" на странице отладки и нажмите кнопку "Сохранить" в меню "Файл".

  6. Нажмите клавиши CTRL+ALT+O, чтобы отобразить окно вывода.

  7. Нажмите клавишу F5, чтобы запустить код. Когда появится диалоговое окно "Сбой утверждения", нажмите кнопку "Игнорировать".

  8. В окне консоли нажмите клавишу ВВОД. Программа должна завершиться, и окно вывода должно отобразить выходные данные, похожие на следующие:

    Debug Information-Product Starting
    The product name is Widget
    The available units on hand are100
    The per unit cost is 1.03
    System.Xml.XmlDocument
    Field: The product name is Widget
    Field: The units on hand are100
    Field: The per unit cost is1.03
    Calc: Total Cost is 103
    This message WILL appear
    ---- DEBUG ASSERTION FAILED ----
    ---- Assert Short Message ----
    Message will appear since dUnitcost < 1 is false
    ---- Assert Long Message ----
    
    at Class1.Main(String[] args) <%Path%>\class1.cs(34)
    
    The product name is Widget
    The available units on hand are100
    The per unit cost is 1.03
    Debug Information-Product Ending
    Trace Information-Product Starting
    The product name is Widget
    Field: The product name isWidget
    This message WILL appear
    Trace Information-Product Ending
    
  9. Окно консоли и файл Output.txt должны отображать следующие выходные данные:

    The product name is Widget
    The available units on hand are 100
    The per unit cost is 1.03
    Debug Information-Product Ending
    Trace Information-Product Starting
    The product name is Widget
    Field: The product name is Widget
    This message WILL appear
    Trace Information-Product Ending
    

Примечание.

Файл Output.txt находится в том же каталоге, что и исполняемый файл conInfo (conInfo.exe). Как правило, это папка \bin, в которой хранится источник проекта. По умолчанию это C:\Documents and Settings\User login\My Documents\Visual Studio Projects\conInfo\bin. В Visual C# 2005 и Visual C# 2005 Express Edition файл Output.txt находится в папке: C:\Documents and Settings\User login\My Documents\Visual Studio 2005\Projects\conInfo\conInfo\bin\Debug

Полный список кода

using System;
using System.Diagnostics;

class Class1
{
    [STAThread]
    static void Main(string[] args)
    {
        string sProdName = "Widget";
        int iUnitQty = 100;
        double dUnitCost = 1.03;
        Debug.WriteLine("Debug Information-Product Starting ");
        Debug.Indent();
        Debug.WriteLine("The product name is "+sProdName);
        Debug.WriteLine("The available units on hand are"+iUnitQty.ToString());
        Debug.WriteLine("The per unit cost is "+ dUnitCost.ToString());

        System.Xml.XmlDocument oxml = new System.Xml.XmlDocument();
        Debug.WriteLine(oxml);

        Debug.WriteLine("The product name is "+sProdName,"Field");
        Debug.WriteLine("The units on hand are"+iUnitQty,"Field");
        Debug.WriteLine("The per unit cost is"+dUnitCost.ToString(),"Field");
        Debug.WriteLine("Total Cost is "+(iUnitQty * dUnitCost),"Calc");

        Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear");
        Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");

        Debug.Assert(dUnitCost > 1, "Message will NOT appear");
        Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");

        TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
        Debug.Listeners.Add(tr1);

        TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("Output.txt"));
        Debug.Listeners.Add(tr2);

        Debug.WriteLine("The product name is "+sProdName);
        Debug.WriteLine("The available units on hand are"+iUnitQty);
        Debug.WriteLine("The per unit cost is "+dUnitCost);
        Debug.Unindent();
        Debug.WriteLine("Debug Information-Product Ending");
        Debug.Flush();

        Trace.WriteLine("Trace Information-Product Starting ");
        Trace.Indent();

        Trace.WriteLine("The product name is "+sProdName);
        Trace.WriteLine("The product name is"+sProdName,"Field" );
        Trace.WriteLineIf(iUnitQty > 50, "This message WILL appear");
        Trace.Assert(dUnitCost > 1, "Message will NOT appear");

        Trace.Unindent();
        Trace.WriteLine("Trace Information-Product Ending");

        Trace.Flush();

        Console.ReadLine();
    }
}

Устранение неполадок

  • Если тип конфигурации решения — Release, Debug выходные данные класса игнорируются.

  • После создания TextWriterTraceListener класса для определенного целевого объекта TextWriterTraceListener получает выходные данные из Trace классов и Debug классов. Это происходит независимо от того, используется Add ли метод Trace класса или Debug класса для добавления TextWriterTraceListener в Listeners класс.

  • При добавлении Listeners объекта для одного и того же целевого объекта в Trace Debug классах каждая строка выходных данных дублируется независимо от того, создает ли Debug выходные данные или Trace создает их.

    TextWriterTraceListener myWriter = new TextWriterTraceListener(System.Console.Out);
    Debug.Listeners.Add(myWriter);
    
    TextWriterTraceListener myCreator = new TextWriterTraceListener(System.Console.Out);
    Trace.Listeners.Add(myCreator);
    

Ссылки