Debugging in C++ folosind CLion si GDB

  1. Instanțiati un proiect nou cu sursele voastre și executabilul engine-ului (halite).
  2. In fisierul “MyBot.cpp” sau unde este functia main, introducem urmatoarele linii:
    • #include <zconf.h>
    • inaintea functiei main: volatile int ready = 0;
    • la inceputul functiei main: while (!ready) sleep(1);
  3. In “CMakeLists.txt” ne asiguram ca vom compila cu -g in configuratia de Debug (si cu optimizari cand nu facem debug)
  4. Facem o noua configurație de rulare in CLion.
    • Run → Edit Configurations
    • Apăsam pe +, apoi selectam Application
    • Punem ce nume vrem (eg. Debug), la target lasam cum e (eg. MyBot), la executable selectam halite (executabilul engine-ului).
    • La Program arguments puteti pune ce ați pune daca ați executa ./halite din terminal (dimensiunea hartii, seed, botii rulati etc.).
      • Neapărat să puneți flag-ul -t (pentru ca engine-ul să ignore timeout-ul)
      • Botul vostru va avea calea cmake-build-debug/MyBot (sau în loc de MyBot ce nume are executabilul vostru în urma compilării).
      • Exemplu: -d “30 30” ./cmake-build-debug/MyBot ./cmake-build-debug/RandomBot -t
  5. O dată facută configurația, rulați și ar trebui să apară în terminalul din CLion că se pornește meciul, dar se blochează la inițializarea jucătorilor. Acum dati Ctrl+Alt+5 sau Run → Attach to Local Process și căutați MyBot (sau numele executabilului botului vostru).
    1. Dacă dă fail atașarea la proces, rulați comanda următoare într-un terminal echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope. Mai multe detalii găsiți aici.

Acum ar trebui să apară în partea de jos un panou de debug cu 4 tab-uri (Frames, Variables, Console si GDB), iar in stânga acestui panou ar trebui să vedeți niște iconițe ca la un player video, dați pe cea de pauză (linii verticale) și apoi în tab-ul GDB executați comanda set ready = 1

  1. Acum înainte să dați din nou play din debugger, puneti un breakpoint unde vreți in cod, și dacă se ajunge acolo programul ar trebui să se oprească în punctul respectiv.

Recomandări:

  • Asigurați-vă că porțiunea de cod de la linia 1 nu este activă în varianta finală.
  • Rulati un singur bot in modul debug (cu liniile mentionate la punctul 1) pentru ca altfel trebuie sa dati attach la fiecare proces ca sa setati ready = 1
  • Puteți seta conditii pentru breakpoint, astfel ca programul sa se oprească doar cand anumite variabile din cod au valorile potrivite (de exemplu sa se opreasca la un breakpoint doar dupa tura 200 a jocului)
  • Daca vă puteți atașa la proces, dar breakpoint-uri ce sigur ar trebui să fie atinse, nu sunt atinse, sau programul pare că se oprește la altă linie, probabil ați uitat să scoateți -O2 sau să adaugați -g la flag-urile de compilare.
pa/halite-debugging.txt · Last modified: 2022/03/14 11:48 by radu.iacob
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0