ERROR::SDT(7stap) ERROR::SDT(7stap)

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.

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".
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".
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.

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í.
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)