Przejdź do treści

Debugowanie

Czym jest debugowanie

Debugowanie to proces, podczas którego możesz wykrywać i naprawiać błędy obecne w kodzie.

Każdy program .NET może działać w dwóch różnych trybach.

  • Tryb wydania – zwykle używany w środowiskach produkcyjnych. Podczas korzystania z niego .NET włącza różne optymalizacje kompilatora i just-in-time, które poprawiają szybkość wykonywania kodu i zmniejszają jego zużycie pamięci.
  • Tryb debugowania – używany głównie w środowiskach programistycznych i testowych. Wszystkie optymalizacje są wyłączone i możesz dołączyć debugery .NET do swojego kodu.

Podczas pracy z bibliotekami i aplikacjami .NET debugowanie obejmuje następujące elementy:

  • Uruchamianie kodu w trybie debugowania
  • Dołączanie debugera .NET do kodu
  • Ustawianie punktów przerwania kodu w celu wskazania, czy przepływ wykonania powinien zostać wstrzymany
  • Śledzenie przepływu wykonania kodu z zaplanowanymi przerwami w punktach przerwania

Definiowanie debugerów .NET

Debugery .NET to programy, które wykorzystują interfejsy API środowiska uruchomieniowego. Te interfejsy API z kolei umożliwiają kontrolowanie przepływu wykonywania procesów .NET. Innymi słowy, mogą wstrzymać wykonywanie w danych punktach przerwania i przechowywać różne stany (w tym wartości, które poszczególne zmienne przechowują podczas tych stanów).

Buduj algorytmy w trybie debugowania

Jak omówiliśmy powyżej, debugowanie cBota lub wskaźnika wiąże się z zbudowaniem tego rozszerzenia w trybie debugowania. Domyślnie, gdy klikniesz przycisk Build w interfejsie użytkownika cTrader, Twoje rozszerzenie działa w trybie wydania, aby umożliwić optymalizację kodu.

Aby zbudować swojego cBota lub wskaźnik w trybie debugowania, musisz użyć interfejsu wiersza poleceń .NET CLI lub zewnętrznych środowisk IDE, takich jak Visual Studio. W tej dokumentacji pokazujemy proces debugowania w taki sposób, w jaki występuje w Visual Studio. Jednak proces ten można również odtworzyć w innych środowiskach IDE z niewielkimi zmianami.

Zainstaluj najnowszą wersję Visual Studio na swoim komputerze i wykonaj następujące czynności:

  • Otwórz swój wskaźnik lub cBota w Visual Studio, wybierając opcję Edit in Visual Studio z menu rozwijanego Edit in... u góry okna edytora kodu.

  • W menu nad edytorem kodu Visual Studio wybierz Debug.

Image title

  • Zbuduj swojego cBota lub wskaźnik w trybie debugowania.

Debuguj cBota lub wskaźnik

Teraz, gdy wiesz, jak zbudować cBota lub wskaźnik w trybie debugowania, skupimy się na tym, jak faktycznie go debugować.

  • Zmień prawa dostępu swojego wskaźnika lub cBota na FullAccess.

  • Dołącz debuger do uruchomionego procesu swojego wskaźnika lub cBota. Możesz to zrobić, wywołując metodę 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");
    }    
}

Uwaga

Metoda System.Diagnostics.Debugger.Launch() musi zostać wywołana w metodzie OnStart() (dla cBota) lub w metodzie Initialize() (dla wskaźnika).

  • Uruchom nową instancję swojego cBota lub wskaźnika. Jeśli instancja jest już uruchomiona, wybierz ją w interfejsie użytkownika. Powinieneś zostać przekierowany do Visual Studio z monitem o wybranie debugera. Zrób to i kliknij OK.

Image title

Po rozpoczęciu debugowania możesz ustawić punkty przerwania, (wejść do) linii kodu i zobaczyć stos wywołań oraz wartości zmiennych.

Aby uzyskać kompletny przewodnik dotyczący debugowania w Visual Studio, sprawdź dokumentację debugowania Visual Studio.

Użyj dyrektywy preprocesora DEBUG

Możesz również użyć dyrektywy preprocesora DEBUG w kodzie swojego cBota lub wskaźnika, aby kontrolować przepływ wykonywania.

Dyrektywa #if DEBUG jest przydatna, gdy chcesz uruchomić tylko blok lub linię kodu w trybie debugowania.

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
}

W powyższym przykładzie linia kodu „Not Debugging" nie zostanie skompilowana, jeśli zbudujesz swojego cBota w trybie debugowania.

Dodatkowe informacje na temat dyrektyw preprocesora C# są dostępne w tej dokumentacji.