Перейти к содержанию

Отладка

Что такое отладка

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

Любая программа .NET может работать в двух разных режимах.

  • Режим выпуска — обычно используется в производственных средах. При его использовании .NET обеспечивает различные оптимизации компилятора и JIT-компиляции, которые повышают скорость выполнения вашего кода и уменьшают его объем в памяти.
  • Режим отладки — в основном используется в средах разработки и тестирования. Все оптимизации отключены, и вы можете подключить отладчики .NET к своему коду.

При работе с библиотеками и приложениями .NET отладка включает в себя следующее:

  • Запуск вашего кода в режиме отладки
  • Подключение отладчика .NET к вашему коду
  • Установка точек останова в коде, чтобы указать, должен ли поток выполнения приостановиться
  • Отслеживание потока выполнения кода с запланированными паузами в точках останова

Определение отладчиков .NET

Отладчики .NET — это программы, которые используют API среды выполнения. Эти API, в свою очередь, позволяют управлять потоком выполнения процессов .NET. Другими словами, они могут приостанавливать выполнение в заданных точках останова и сохранять различные состояния (включая значения, которые содержат отдельные переменные в этих состояниях).

Сборка алгоритмов в режиме отладки

Как мы обсуждали выше, отладка сиБота или индикатора подразумевает сборку этого расширения в режиме отладки. По умолчанию, когда вы нажимаете кнопку Build в интерфейсе cTrader, ваше расширение запускается в режиме релиза для включения оптимизации кода.

Чтобы собрать свой сиБот или индикатор в режиме отладки, вам нужно использовать либо .NET CLI, либо внешние IDE, такие как Visual Studio. В этой документации мы показываем процесс отладки так, как он происходит в Visual Studio. Однако этот процесс также может быть воспроизведен в других IDE с незначительными изменениями.

Установите последнюю версию Visual Studio на свой компьютер и выполните следующие действия:

  • Откройте свой индикатор или сиБот в Visual Studio, выбрав опцию Edit in Visual Studio в выпадающем меню Edit in... в верхней части окна редактора кода.

  • В меню над редактором кода Visual Studio выберите Debug.

Image title

  • Соберите свой сиБот или индикатор в режиме отладки.

Отладка сиБота или индикатора

Теперь, когда вы знаете, как собрать сиБот или индикатор в режиме отладки, мы сосредоточимся на том, как его фактически отлаживать.

  • Измените права доступа вашего индикатора или сиБота на FullAccess.

  • Подключите отладчик к запущенному процессу вашего индикатора или сиБота. Вы можете сделать это, вызвав метод System.Diagnostics.Debugger.Launch().

1
2
3
4
5
6
7
8
9
protected override void OnStart()
{
    var result = System.Diagnostics.Debugger.Launch();

    if (result is false)
    {
        Print("Debugger launch failed");
    }    
}
1
2
3
4
5
6
7
8
9
protected override void Initialize()
{
    var result = System.Diagnostics.Debugger.Launch();

    if (result is false)
    {
        Print("Debugger launch failed");
    }    
}

Примечание

Метод System.Diagnostics.Debugger.Launch() должен быть вызван в методе OnStart() (для сиБота) или в методе Initialize() (для индикатора).

  • Запустите новый экземпляр вашего сиБота или индикатора. Если экземпляр уже запущен, выберите его в интерфейсе. Вы должны быть перенаправлены в Visual Studio с запросом на выбор отладчика. Сделайте это и нажмите OK.

Image title

После начала отладки вы можете устанавливать точки останова, (пошагово) проходить строки кода и просматривать стек вызовов и значения переменных.

Полное руководство по отладке в Visual Studio см. в документации по отладке Visual Studio.

Использование директивы препроцессора DEBUG

Вы также можете использовать директиву препроцессора DEBUG в коде вашего сиБота или индикатора для управления потоком выполнения.

Директива #if DEBUG полезна, когда вы хотите запустить только блок или строку кода в режиме отладки.

1
2
3
4
5
6
7
8
9
protected override void OnStart()
{
#if DEBUG
    System.Diagnostics.Debugger.Launch();
    Print("Debugging");
#else
    Print("Not Debugging");
#endif
}

В приведенном выше примере строка кода "Not Debugging" не будет скомпилирована, если вы соберете свой сиБот в режиме отладки.

Дополнительная информация о директивах препроцессора C# доступна в этой документации.