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.