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

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

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

Сводка

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

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

Требования

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

  • Microsoft Windows
  • Microsoft Visual C#

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

Описание метода

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

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

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

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

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

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

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

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

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

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

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

  • Окно консоли с помощью System.Console.Out свойства .
  • Текстовый (.txt) файл с помощью инструкции System.IO.File.CreateText("FileName.txt") . После создания TextWriterTraceListener объекта необходимо добавить его в Debug. Коллекция прослушивателей для получения 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 параметра метода. Если указать категорию, формат сообщения окна вывода будет "category: message". Например, в первой строке следующего кода в окне Выходные данные отображается сообщение "Поле: название продукта — Мини-приложение".

    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), а затем добавьте каждый объект в коллекцию Debug Listeners:

    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 используют большинство одинаковых методов для получения выходных данных, в том числе следующие:

  • WriteLine
  • WriteLineIf
  • Indent
  • Юниндент
  • Assert
  • Флеш

Классы Trace и можно использовать по отдельности Debug или вместе в одном приложении. В проекте конфигурации решения отладки активны и TraceDebug выходные данные. Проект создает выходные данные из обоих этих классов для всех 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 щелкните Активный (Отладка) или Отладка в раскрывающемся списке Конфигурация на странице Отладка , а затем нажмите кнопку Сохранить в меню Файл .

  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 объекта для одного и того же целевого Debug объекта в Trace классы и каждая строка выходных данных дублируется независимо от того, создает ли Debug выходные данные или Trace .

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

Ссылки