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:
- 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).
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/,
<[email protected]>.
error::reporting(7stap),
https://sourceware.org/systemtap/wiki/HowToReportBugs