Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается трассировка и отладка в 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
выходных данных.
Создание примера с помощью класса отладки
Запустите Visual Studio или Visual C# Express Edition.
Создайте проект консольного приложения Visual C# с именем conInfo. Класс1 создается в Visual Studio .NET. Program.cs создается в Visual Studio 2005.
Добавьте следующее пространство имен в начале класса 1 или Program.cs.
using System.Diagnostics;
Чтобы инициализировать переменные для хранения сведений о продукте, добавьте следующие операторы объявления в метод Main:
string sProdName = "Widget"; int iUnitQty = 100; double dUnitCost = 1.03;
Укажите сообщение, которое класс создает в качестве первого входного параметра
WriteLine
метода. Нажмите сочетание клавиш CTRL+ALT+O, чтобы убедиться, что окно вывода отображается.Debug.WriteLine("Debug Information-Product Starting ");
Для удобства чтения используйте
Indent
метод для отступа последующих сообщений в окне вывода:Debug.Indent();
Чтобы отобразить содержимое выбранных переменных, используйте
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());
Можно также использовать
WriteLine
метод для отображения пространства имен и имени класса для существующего объекта. Например, следующий код отображаетSystem.Xml.XmlDocument
пространство имен в окне вывода:System.Xml.XmlDocument oxml = new System.Xml.XmlDocument(); Debug.WriteLine(oxml);
Чтобы упорядочить выходные данные, можно включить категорию как необязательный, второй входной параметр
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");
Окно вывода может отображать сообщения только в том случае, если указанное условие имеет значение true, используя
WriteLineIf
методDebug
класса. Условие, которое необходимо оценить, является первым входным параметромWriteLineIf
метода. Второй параметрWriteLineIf
— это сообщение, которое отображается только в том случае, если условие в первом параметре оценивается как true.Debug.WriteLineIf(iUnitQty > 50, "This message WILL appear"); Debug.WriteLineIf(iUnitQty < 50, "This message will NOT appear");
Используйте метод
Debug
Assert класса, чтобы окно вывода отображалось сообщение, только если указанное условие оценивается как false:Debug.Assert(dUnitCost > 1, "Message will NOT appear"); Debug.Assert(dUnitCost < 1, "Message will appear since dUnitcost < 1 is false");
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);
Для удобства чтения используйте
Unindent
метод, чтобы удалить отступ для последующих сообщений, создаваемых классомDebug
. При совместном использованииIndent
Unindent
методов средство чтения может различать выходные данные как группы.Debug.Unindent(); Debug.WriteLine("Debug Information-Product Ending");
Чтобы убедиться, что каждый
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();
Убедитесь, что он работает
Убедитесь, что отладка — это текущая конфигурация решения.
Если окно Обозреватель решений не отображается, нажмите сочетание клавиш CTRL+ALT+L, чтобы отобразить это окно.
Щелкните правой кнопкой мыши conInfo и выберите пункт "Свойства".
В левой области страницы свойств conInfo в папке "Конфигурация" убедитесь, что стрелка указывает на отладку.
Примечание.
В Visual C# 2005 и Visual C# 2005 Express Edition щелкните "Отладка " на странице conInfo .
Над папкой "Конфигурация" в раскрывающемся списке "Конфигурация" нажмите кнопку "Активный ( отладка) или отладка" и нажмите кнопку "ОК". В Visual C# 2005 и Visual C# 2005 Express Edition щелкните Active (Debug) или Debug в раскрывающемся списке "Конфигурация" на странице отладки и нажмите кнопку "Сохранить" в меню "Файл".
Нажмите клавиши CTRL+ALT+O, чтобы отобразить окно вывода.
Нажмите клавишу F5, чтобы запустить код. Когда появится диалоговое окно "Сбой утверждения", нажмите кнопку "Игнорировать".
В окне консоли нажмите клавишу ВВОД. Программа должна завершиться, и окно вывода должно отобразить выходные данные, похожие на следующие:
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
Окно консоли и файл 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);