Pokud už jste nějaký debugger používali, umíte už používat i debugger v Code::Blocks. Pokud je tento debugger první, se kterým přicházíte do styku, proniknete do toho rychleji, když si přečtete také kapitolu Ladění. Jsou v ní popsány základní principy této činnosti.
Při ladění v Code::Blocks se držte tohoto postupu:
Poznámky k ladění v různých verzích Code::Blocks jsou popsány ve článku Debugging with Code::Blocks.
V názvech adresářů a vašich projektů nepoužívejte mezery ani diakritiku! Pokud se v cestě k vašemu projektu vyskytují mezery, je velice pravděpodobné, že některé nástroje, zejména debugger, nebudou schopny s vaším projektem pracovat. Viz poznámka na oficiálních stránkách C::B.
Při sledování proměnných je potřeba mít na paměti, že debugger umí zobrazovat pouze jednoduché datové typy a struktury. U ukazatelů (a tedy i některých polí) se standardně zobrazuje pouze číselná hodnota adresy.
Chceme-li sledovat, na co ukazatel ukazuje, je potřeba debuggeru napovědět a sledovat výraz s dereferenčním operátorem (např. *ukazatel, místo pouhé proměnné ukazatel). Pokud ukazatel ukazuje na začátek pole, je potřeba nad sledovaným výrazem vyvolat kontextovým menu dialog Edit watch a zaškrtnout volbu pro sledování pole a zadat rozsah (nezapomeňte, že pole v C/C++ si obecně samy nepamatují svou velikost).
Pohledy na proměnné v seznamu argumentů a v seznamu lokálních proměnných nelze takto editovat. Vložte sledovanou proměnnou do okna Watches znovu jako sledovaný výraz a pak můžete jak používat dereferenční (i všechny ostatní) operátory, tak měnit kontextovým menu i samotný formát pohledu na data (Edit watch).
Sledování vícerozměrných polí představuje problém. Je třeba si uvědomit, že jazyky C/C++ takový typ neznají. Místo toho používají jednorozměrná pole, jejímiž prvky mohou být další jednorozměrná pole (řádky).
C::B nemá problém se zobrazením lokálních polí s konstantní velikostí. Problémem jsou ale dynamická pole, u nichž debugger nemá žádnou informaci o rozměrech. Při sledování je tedy potřeba sledovat vícerozměrné pole po řádcích (rozměr řádku se pak zadá editací pohledu Edit watch) nebo po samostatných prvcích.
Obecně se lépe sledují vícerozměrná pole vyrobená dynamicky na hromadě pomocí malloc či new (přes dvojité a vícenásobné ukazatele). Vícerozměrná lokální automatická pole (s rozměry specifikovanými pomocí proměnné) se sledují nejhůře. Musíte sledovat vhodně přetypovaný výraz.
Zvláštní problém představují vícerozměrná automatická pole, která předáváte jako argument funkce. Například parametr array funkce z ukázky 1 debugger zobrazit neumí. Při pokusu zobrazit jej jako pole vám debugger zobrazí hlášení "Cannot perform pointer math on incomplete types, try casting to a known type, or void *.". Nejde o problém C::B, toto hlášení pochází od GDB.
Řešením tohoto problému je přetypování sledovaného výrazu na ukazatel na pole pevné délky. Předpokládejme, že funkci voláme s polem o rozměrech 3 řádky a 2 sloupce, tedy printArray(3, 2, array)
a pole array bylo skutečně vytvořeno s těmito rozměry. Budeme tedy sledovat výraz ((int (*)[2]) array)
. V našem případě je rozměr pole dvě, protože rozměr řádku pole (počet sloupců) je také roven dvěm (proměnná col
). Pohled na tento výraz následně pomocí kontextového menu Edit watch… upravíme jako pohled na tříprvkové pole (počet řádků). Viz obrázek 10.