warning::buildid - chyby ověření build-id
Systemtap skript prochází několika fázemi
zpracování, které nemusejí nutně
následovat bezprostředně po sobě. Někdy je
nutné ověřit některé invarianty.
Jedním z nich je build-id, které zaručuje, že
pokud systemtap skript běží proti
uživatelským programům, jde o ty jejich verze, proti
kterým byl systemtap skript skutečně zkompilován.
Build-id je údaj, který moderní (2007+)
překladače přidávají do
binárních souborů jako ELF značku
NT_GNU_BUILD_ID. Build-id lze zobrazit příkazem
readelf -n.
Na build-id jsou citlivé jen skripty, které
provádějí hlubokou analýzu binárních
souborů a jejich ladicích informací.
Například skripty, které používají
sondy
.function nebo
.statement , nebo skripty, které
generují backtrace. Jiné skripty mohou spoléhat
například na sondy
process.mark nebo
kernel.trace,
které nepotřebují ladicí informace, a ty pak na
build-id citlivé nejsou. Viz sekci LADICÍ INFORMACE
FORMÁTU DWARF manuálové stránky
stapprobes(3stap).
Systemtap uchovává kopii relevantních build-id
uvnitř svých jaderných modulů. Za běhu
modulu pak dojde ke srovnání uloženého build-id se
skutečnou hodnotou, která je pro daný obraz
binárního souboru uložena v paměti. V
případě neshody se vypíše chybová
hláška a systemtap odmítne do daného
binárního souboru vložit sondy. To je
důležité z bezpečnostního hlediska, kdy by
vložení sond na nesprávná místa mohlo
způsobit pád programu.
Nesoulad build-id může být způsoben
různými příčinami. Tou hlavní je
situace, kdy je verze nebo architektura zkoumaného
binárního souboru odlišná od verze nebo
architektury souboru, proti kterému byl systemtap modul
vytvořen. Například je možné, že
systemtap modul byl sestaven na stroji s mírně odlišnou
verzí nebo jinou distribucí OS. Mohlo dojít k
"rebuildu" jádra při zachování
čísla verze. Mohlo také například
dojít k "upgrade" jádra, po kterém obraz v
paměti není v souladu s obsahem souborů na disku. Nebo v
případě, že Vaše distribuce
používá samostatné "debuginfo"
balíčky, nemusí verze "debuginfo"
balíčku přesně odpovídat verzi
hlavního balíčku.
Pokud má nesoulad build-id známou příčinu, a
je zřejmé, že nedojde ke škodám, je
možno test na build-id obejít volbou
-DSTP_NO_BUILDID_CHECK.
http://fedoraproject.org/wiki/Releases/FeatureBuildId,
stap(1),
stapprobes(3stap),
warning::debuginfo(7stap),
error::reporting(7stap)