Libcwd - Libcwd

Libcwd je knihovna v C ++, napsaná uživatelem Carlo Wood, přidat run-time ladění podpora pro C ++ aplikace, zejména pro kód vyvinutý pomocí Sbírka překladačů GNU. Funkčnost, kterou knihovna přidává do aplikace, lze rozdělit do tří kategorií:

  1. Ostream -výstup ladicího výstupu.
  2. Přístup za běhu k informacím o ladění.
  3. Run-time přístup k alokace paměti správa.

Podporované platformy

I když se samotný kód knihovny snaží být přísný ISO C ++ a vyhovět POSIX pokud je to možné, k dosažení bodů 2 a 3 je zapotřebí spíše specializovaný kód, specifický pro architekturu, na které aplikace běží. Libcwd se z tohoto důvodu omezuje na úzkou architekturu: Musí být kompilován s Překladač GNU a požaduje, aby byl objektový kód 32 nebo 64 bitů ELF a kompilátor vygeneroval ladicí informace DWARF-2.

Kompilace libcwd vede ke dvěma knihovnám: jedné, která je bezpečné pro vlákna (libcwd_r) a verze (libcwd) bez podpory vláken. Verze bezpečná pro vlákna závisí na ještě více specifických detailech architektury (jmenovitě knihovně GNU C). Výsledkem je, že plně vybavený libcwd je v zásadě vhodný pouze pro vývoj na Linux platformy.

Libcwd však může být nakonfigurován zrušit podporu podprocesů, ladění alokace paměti a / nebo čtení informací o ladění ELF a DWARF-2 - dokud nezůstane pouze podpora výstupu ladění ostream. Tímto způsobem jej lze použít k vývoji aplikace na linuxu, dokud nebude robustní, a stále mít výstup ladění na jiných platformách (POSIX), i když tam není k dispozici plnohodnotný libcwd - za předpokladu, že není nutná žádná bezpečnost vláken pro výstup ladění na těchto platformách: dvě nebo více podprocesů, které zapisují výstup ladění do stejného ostreamu, mohou způsobit poněkud chaotický výstup, kde výstup jednoho řádku začíná uprostřed druhého, bez podpory vláken.

Výstup ladění založený na Ostream

Libcwd poskytuje několik maker, která jsou snadno rozšiřitelná, což uživateli umožňuje v podstatě dělat cokoli, co lze běžně dělat s ostreamy. Pokud však chcete pouze zapsat výstup ladění, postačí dvě makra: Dout a DoutFatal. Ten se má použít pro fatální výstup ladění, po kterém je třeba aplikaci ukončit. Například:

  -li (chyba)    DoutFatal(DC::fatální, "Došlo k neodstranitelné chybě.");

Rozdíl s Doutem je v tom, že když je aplikace kompilována bez ladicího kódu, je makro Dout () nahrazeno ničím, zatímco DoutFatal () je nahrazeno kódem, který vytiskne jeho výstup a ukončí se (způsobem, který může uživatel definovat).

Jednoduchý výstup ladění se zapisuje pomocí Dout, a to následovně:

  Dout(DC::oznámení, „volal z“ << location_ct(CALL_ADDR));

kde druhý parametr může obsahovat '<<' pro zápis libovolného typu nebo objektu do výstupního proudu ladění (v tomto případě location_ct).

'Dc :: fatal' a 'dc :: notice' jsou ladicí 'kanály', které lze zapnout nebo vypnout. Uživatel může kromě. Vytvářet a používat libovolný počet vlastních ladicích kanálů výchozí. Je také možné vytvořit více než jen výchozí ladicí výstupní objekt ostream 'libcw_do', a tak zapsat výstup do více než jednoho ostream. Každý ladicí objekt, představující ostream, lze zase samostatně zapnout a vypnout.

Přístup za běhu k informacím o ladění

Tyto informace zahrnují možnost vyhledat umístění zdrojového souboru a čísla řádku a názvy funkcí. Ve výsledku je například možné napsat výstup ladění, který vytiskne, kdo je volající dané funkce, nebo vytisknout název aktuální funkce, i když je tato funkce složitou šablonou. Například,

 PERSIST: Je volán PersistXML :: serialize_builtin  ("M_hostname", @ 0xbfc1f214).

Přístup za běhu ke správě alokace paměti

Libcwd udržuje interní správu přidělování paměti. To umožňuje člověku dělat věci jako únik paměti kontrola, tisk přehledu přidělené paměti (velmi výkonným způsobem, který umožňuje filtrovat na cokoli: regulární výrazy pro názvy knihoven, názvy funkcí (demangled nebo ne) a / nebo časové intervaly, během nichž byly přiděleny).

Knihovna také poskytuje několik globálních funkcí, které lze volat z ladicího programu, jako je gdb, což umožňuje vývojáři rychle zjistit, na kterou alokaci daný ukazatel ukazuje. Například,

 (gdb) volání cwdebug_alloc (0x8a19450) 0x8a19450 bodů uvnitř alokace paměti, která začíná na 0x8a19448 start: 0x8a19448 velikost: 12 typ: char ** description: Pole argumentů příkazového řádku předaných libcw_app_ct :: options_done_event. umístění: libcw_app.cc:304 ve funkci: libcw_app_ct :: libcw_init (int, char * const *) když: 00: 31: 09.888760 (gdb) l libcw_app.cc:304

externí odkazy