ERROR::SDT(7stap) | ERROR::SDT(7stap) |
JMÉNO
error::sdt - chyby značek <sys/sdt.h>
POPIS
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.
VIZ TÉŽ
stap(1), stapprobes(3stap), error::dwarf(7stap), http://gcc.gnu.org/onlinedocs/gcc/Constraints.html, http://sourceware.org/systemtap/wiki/UserSpaceProbeImplementation, error::reporting(7stap)