table of contents
ERROR::DWARF(7stap) | ERROR::DWARF(7stap) |
JMÉNO¶
error::dwarf - chyby v souvislosti s ladicími informacemi formátu DWARF
POPIS¶
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:
- verze překladače
- 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.
- záměna pořadí instrukcí
- 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ů.
- konfigurace elfutils
- 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é.
- konfigurace ladicích informací
- 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).
ALTERNATIVY¶
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.
VIZ TÉŽ¶
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)
CHYBY¶
Použijte projektovou bugzillu, nebo mailing list. http://sourceware.org/systemtap/, <systemtap@sourceware.org>.
error::reporting(7stap), https://sourceware.org/systemtap/wiki/HowToReportBugs