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

# [JMÉNO](#JM)

error::sdt - chyby značek &lt;sys/sdt.h&gt;

# [POPIS](#POPIS)

Značky **&lt;sys/sdt.h&gt;**

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](#chyba)

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](#p)

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í](#p~2)

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í](#zm)

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](#pou)

Pokud se instrumentovaný program zkompiluje, může být řešením ponechat v něm &lt;sys/sdt.h&gt; značky, ale vyhnout se extrakci parametrů z nich. V nejhorším připadě odstraňte &lt;sys/sdt.h&gt; 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ÉŽ](#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)
```

---

Document: error::sdt(7stap) from systemtap 5.6-r1 (Chainguard OS)
Source: https://sourceware.org/git/systemtap.git
