..::Lad∞nφ 1 - makra::..

V mnoha uΦebnicφch programovßnφ narazφte na odkazy na debuger a lad∞nφ. Bohu₧el mßlokde najdete alespo≥ zb∞₧nΘ vysv∞tlenφ jak se lad∞nφ provßdφ. Proto jsem se rozhodl napsat aspo≥ to co o lad∞nφ vφm jß. V tomto Φlßnku se budeme zab²vat makry urΦen²mi pro lad∞nφ.

Poznßmka: Pokud nepou₧φvßte aplikaci s podporou MFC musφte sami vlo₧it hlaviΦkov² soubor afx.h

ASSERT a VERIFY

Pokud sestavφte aplikaci jako debug tak se tyto dv∞ makra chovajφ stejn∞. Rozdφl je a₧, kdy₧ aplikaci sestavφte jako release.

Nejd°φve si popφÜeme jak se chovajφ v re₧imu debug (pro makro ASSERT, v tomto p°φpad∞ je VERIFY je stejnΘ).

Poznßmka: Program musφte spustit pomocφ F5 (ladit) namφsto CTRL+F5 (spustit).

Makro ASSERT mß jeden parametr a to hodnotu typu BOOL. Pokud je parametr TRUE, nestane se nic, ale pokud je FALSE p°eruÜφ se provßd∞nφ programu a zobrazφ se podobnΘ dialogovΘ okno jako je na nßsledujφcφm obrßzku, ve kterΘm se vypφÜe ve kterΘm souboru a na kterΘm °ßdku doÜlo k vyvolßnφ ladφcφho p°eruÜenφ.

Kdy₧ stisknete tlaΦφtko Opakovat p°epne se vßÜ program do debugeru na °ßdek s ASSERT, jak vidφte na nßsledujφcφm obrßzku.

Debuger m∙₧ete ukonΦit pomocφ panelu nßstroj∙ nebo menu (Debug).

Te∩ si popφÜeme jak se tyto dv∞ makra chovajφ v re₧imu release.

Poznßmka: Tentokrßt musφte aplikaci spustit pomocφ CTRL+F5 (spustit) a ne pomocφ F5 (lad∞nφ), proto₧e v aplikaci ji₧ nejsou zahrnuty informace pro lad∞nφ. Program sice po odkliknutφ upozorn∞nφ lze spustit v ladφcφm m≤du (F5), ale nemß to ₧ßdn² smysl (pokud neznßte opravdu dob°e asembler).

Makro ASSERT se ·pln∞ vypustφ a z makra VERIFY z∙stane jeho parametr. NejlepÜφ je ukßzat si jejich chovßnφ na p°φkladu.

P°edpoklßdejme, ₧e mßme nadefinovanou funkci s takov²mto prototypem:

BOOL Funkce();

Potom nßm z

ASSERT(Funkce());

po p°ekladu nez∙stane nic a z

VERIFY(Funkce());

z∙stane

Funkce();

Makro TRACE

Poznßmka: Makro TRACE se mi poda°ilo zprovoznit jen se zapnut²m pou₧φvßnφm MFC. Musφte vlo₧it hlaviΦkov² soubor afx.h

Makro TRACE je obdoba klasickΘ funkce printf, ale narozdφl od nφ nevypisuje na obrazovku, ale do v²stupnφho okna ve Visual C++. Stejn∞ jako makro ASSERT se p°i p°ekladu jako release vypouÜtφ.
Aby TRACE fungovalo musφte aplikaci spustit pomocφ F5 (lad∞nφ) a mφt nainstalovßnu podporu pro TRACE, tj. program tracer.exe, kter² je standartnφ souΦßstφ MS Visual C++.

Pokud mßte tedy v programu pou₧ito TRACE a spustφte jej v ladφcφm re₧imu (F5), zφskßte po ukonΦenφ programu jeho v²stup v okn∞ Visual C++ mezi standartnφmi v²stupy, jak m∙₧ete vid∞t na nßsledujφcφm obrßzku.

Makro ASSERT_VALID

Toto makro mß smysl jen kdy₧ u₧φvßte MFC. ZjiÜ¥uje zda ukazatel je platn²m ukazatelem na inicializovanΘho potomka t°φdy CObject. Jinak se chovß stejn∞ jako makro ASSERT. Proto je vhodnΘ pro hlφdßnφ zda nßhodou nebyla n∞jakß t°φda smazßna z pam∞ti.

P°φklad pou₧itφ:

CObject* pObj;

ASSERT_VALID(pObj);    // P°eruÜφ aplikaci, proto₧e je ukazatel neinicializovan²

pObj = new CObject;

ASSERT_VALID(pObj);    // Neud∞lß nic proto₧e pObj je platn² ukazatel na inicializovan² ukazatel na CObject