error::sdt - chyby značek <sys/sdt.h>
Značky
<sys/sdt.h>
používané v systemtapu jsou navrženy podle dtrace
USDT API, ale mají odlišnou implementaci.
Přidávají do "text" segmentu
uživatelského programu NOP instrukci a do ELF poznámky
související metadata, která popisují vlastnosti
značky, jako její jméno a parametry. Tyto značky
jsou rozpoznatelné různými nástroji.
Dokáže je konzumovat nejen systemtap, ale např. i GDB.
Značky nesou informace o typech svých parametrů, a lze do
nich vložit spolehlivé sondážní body
nezávislé na ladicích informacích DWARF.
Dohledávání parametrů je komplikované:
Protože jsou použity gcc inline-assembly directivy,
ukládají značky STAP_PROBE / DTRACE_PROBE pro
každý operand asm výraz. Kompilátoru se
předá volné asm omezení "nor",
které obvykle funguje dobře. Toto řešení
obvykle nenutí kompilátor pracovat s registry, což by
instrumentovaný program zpomalilo. Ovšem ne vždy toto
řešení funguje zcela bez chyb.
- chyba vyhodnocení za běhu
- GCC může emitovat řetězce
které assembler korektně zpracuje (v kontextu
kompilovaného programu), ale ladicí nástroj
může mít s jejich interpretací
potíž. Například se operand může
odkazovat k lokálnímu symbolu, který se do
finálního ELF souboru nedostane. Takový operand je
pak nedostupný. Pokus o přístup k
příslušnému parametru pak obvykle
skončí chybou "SDT asm not understood".
- příliš komplikovaný
výraz
- GCC může generovat validní, ale
příliš složitou adresaci založenou na
komplexních datových typech a složité
pointerové aritmetice. Systemtap a/nebo GDB nemusejí
být schopny takové výrazy správně
analyzovat a v případě systemtapu bude pak
výsledkem chyba "SDT asm not understood".
- příliš restriktivní
omezení
- GCC nemusí být schopné program s
"nor" omezením přeložit kvůli
nedostatku registrů nebo z jiného důvodu. V
takovém případě může nastat
chyba jako např. "asm operand has impossible
constraints".
Tyto problémy je v zásadě možno obejít
dvěma cestami.
- změnit omezení
- Při kompilaci instrumentovaného programu
nastavte makro STAP_SDT_ARG_CONSTRAINT na jiné
omezení. Různé možnosti uvádí
GCC manuál. Například na mnoha architekturách
"r" způsobí předávání
operandů přes registry a "g" ponechá
operandy v zásadě bez omezení.
- použijte debuginfo
- Pokud se instrumentovaný program zkompiluje,
může být řešením ponechat v
něm <sys/sdt.h> značky, ale vyhnout se extrakci
parametrů z nich. V nejhorším připadě
odstraňte <sys/sdt.h> makra zcela. Pokud byly ladicí
informace vygenerovány a jsou k dispozici, systemtap se
může odkazovat ke kontextovým proměnným
namísto k parametrům značek STAP_PROBE.
stap(1),
stapprobes(3stap),
error::dwarf(7stap),
http://gcc.gnu.org/onlinedocs/gcc/Constraints.html,
http://sourceware.org/systemtap/wiki/UserSpaceProbeImplementation,
error::reporting(7stap)