ERROR::DWARF(7stap) ERROR::DWARF(7stap)

error::dwarf - chyby v souvislosti s ladicími informacemi formátu DWARF

Systemtap někdy spoléhá na ladicí informace k lokalizaci umístění sond, nebo k lokalizaci umístění zkoumaných (či instrumentovaných) proměnných, stejně jako to dělá symbolický debugger. Tyto ladicí informace lze získat analýzou zdrojového kódu a překladač je umí uchovávat v rámci formátu DWARF. Pokud systemtap ladicí informace potřebuje, ale překladač je neuchoval, dojde při zpracování skriptu k chybě během procesní fáze 2.

Obvyklé příčiny tohoto typu chyb:

Překladače GCC 4.5 a starší generovaly ladicí informace omezené kvality. Vývojářům bylo doporučováno sestavovat s použitím -O0 -g, tedy s vypnutím optimalizace. GCC 4.5 přineslo koncept "variable-tracking assignments", což umožňuje generovat kvalitní ladicí informace i s použitím optimalizací -O2 -g. Není to dokonalé, ale jde o značné zlepšení. Poznamenejme, že chyba GCC PR51358 způsobuje, že ladicí informace získané při -O0 -g jsou ve skutečnosti horší kvality, než ladicí informace vygenerované s -O2 -g.

Dalším souvisejícím problémem je kvalita ladicích informací pro oblast prologu (PR15123), kdy program sestavený s CFLAGS=-mfentry (obvykle jádro, kvůli ftrace) poskytuje nedostatek přesných ladicích informací v souvislosti se vstupem do funkce. To se týká zejména GCC verze 4.8 a starší. Pokud je to možné, kompilujte s -grecord-gcc-switches a spusťte systemtap s $PR15123_ASSUME_MFENTRY=1.

"inline" funkce
Dokonce i moderní GCC má problémy s parametry "inline" funkcí. Může být nutné upravit systemtap skript a vložit sondy na mírně odlišná místa. Zkuste použít sondu .statement() , namísto .function() , a případně ji posuňte o několik řádek níže směrem do těla "inline" funkce. Nebo zkuste vložit sondu do místa volání "inline" funkce. Také je možno využít konstrukce if @defined($var) { ... } k ověření dostupnosti kontextové proměnné před jejím použitím.
Optimalizovaný kód často zahrnuje smíchání instrukcí z různých zdrojů. V takovém případě může být nemožné umístit sondu na potřebné místo. To se týká zejména sond .statement vkládaných na dané číslo řádku. Systemtap může doporučit přesunutí sondy na přilehlý řádek, ale ani to nemusí stačit. Zvažte zavedení sondy na místo určené zástupným symbolem, nebo rozsahem řádků.
Systemtap používá pro zpracování ladicích informací knihovnu elfutils. Je možné, že ladicí informace jsou zdánlivě dostupné, ale ne ve formátu přijatelném pro nainstalovanou kopii elfutils. Například lokální GCC může produkovat komprimované ladicí informace (.zdebug_* ELF sekce, nebo .xz soubory), zatímco nainstalovaná kopie elfutils nemá zapnuté příslušné dekompresní schopnosti. Bohužel není snadné odhalit, zda toto je skutečné jádro problému který se snažíme vyřešit. Pokud si sestavujete vlastní elfutils, ujistěte se, že všechny dekompresní knihovny/hlavičky jsou v době překladu dostupné.
Některé nástroje mohou generovat ladicí informace v podobě nepoužitelné pro systemtap. Příčinou může být například jaderná volba CONFIG_DEBUG_INFO_SPLIT (.dwo soubory). Dobrých výsledků se lze dosáhnout při použití obvyklého ELF/DWARF formátu (případně oddělených ladicích informací (stripped debuginfo) jak je obvyklé v distribuci Fedora).

Pro snížení závislosti na ELF/DWARF ladicích informacích zvažte použití staticky zakompilované instrumentace jako jsou sondážní body typu "tracepoint" pro jádro, nebo značky <sys/sdt.h> pro uživatelské programy. Jde o řešení s relativně nízkými náklady na systémové zdroje (v případě sdt.h, jedna NOP instrukce na značku), přičemž dostupnost parametrů/dat je téměř garantována. To vše bez závislosti na ladicích informacích.

stap(1),
http://dwarfstd.org/,
http://sourceware.org/systemtap/wiki/TipContextVariables,
http://gcc.gnu.org/wiki/Var_Tracking_Assignments,
warning::debuginfo(7stap),
error::reporting(7stap)

Použijte projektovou bugzillu, nebo mailing list. http://sourceware.org/systemtap/, <systemtap@sourceware.org>.

error::reporting(7stap), https://sourceware.org/systemtap/wiki/HowToReportBugs