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.
Použijte projektovou bugzillu, nebo mailing list.
http://sourceware.org/systemtap/,
<systemtap@sourceware.org>.
error::reporting(7stap),
https://sourceware.org/systemtap/wiki/HowToReportBugs