JMÉNO
stap - překladač a řadič systemtap skriptůPOUŽITÍ
stap [ VOLBY ] JMÉNO_SOUBORU [ ARGUMENTY ]POPIS
Program stap je hlavním uživatelským rozhraním nástroje systemtap. Přijímá požadavky na sondování systému (probing) zapsané v jednoduchém skriptovacím jazyce, překládá je do jazyka C, výsledný kód zkompiluje a vytvoří jaderný modul, který následně zavede do běžícího linuxového jádra nebo dyninst instrumentačního nástroje, aby prováděl požadovanou analýzu zkoumaného systému. Skript může být čten ze souboru (JMÉNO_SOUBORU), ze standardního vstupu (v tom případě použijte "-" namísto JMÉNO_SOUBORU), z příkazové řádky (prostřednictvím přepínače -e SKRIPT, případně -E SKRIPT). Program běží dokud není přerušen uživatelem, nebo dokud skript nezavolá exit(), nebo dokud nedojde k nastřádání dostatečného množství tzv. měkkých chyb (soft errors).PŘEHLED DOKUMENTACE
Pro SystemTap existuje množství vzdělávacích, dokumentačních a referenčních materiálů jak v online podobě, tak i v rámci distribučních balíčků. Online dokumentace se nachází na projektovém webu https://sourceware.org/systemtap/man stránky | |
stap (tato stránka) | syntaxe jazyka, koncepty, funkce, volby |
stapprobes | sondážní body a jejich kontextové proměnné |
stapref | rychlá reference pro syntaxi jazyka |
stappaths | seznam důležitých umístění včetně knih a odkazů |
stap-prep | instalátor závislostí jako např. ladicích informací jádra |
tapset::* | vygenerovaný seznam tapsetů |
probe::* | vygenerovaný seznam tapsetových přezdívek |
function::* | vygenerovaný seznam tapsetových funkcí |
macro::* | vygenerovaný seznam tapsetových maker |
stapvars | vybrané globální proměnné definované v tapsetech |
staprun, stapdyn, stapbpf | programy pro spuštění zkompilovaných systemtap skriptů |
systemtap | systémová služba, analýza startu systému |
stap-server | kompilační server |
stapex | několik velmi jednoduchých příkladů |
knihy | |
Beginner's Guide | učebnice základů s praktickými ukázkami |
Tutorial | hutný úvod, cvičení |
Language Reference | podrobný manuál skriptovacího jazyka |
Tapset Reference | man stránky tapsetů v podobě knihy |
odkazy | |
example scripts | množství nástrojů pro správu systému, ukázkových skriptů a výukových hraček |
VOLBY
Příkaz stap akceptuje následující volby. Jakákoliv jiná volba vypíše seznam podporovaných voleb. Volby lze uvést na příkazové řádce, jak je obvyklé. Pokud existuje $SYSTEMTAP_DIR/rc, mohou být volby načteny odtud a interpretovány nejdříve. Pokud není $SYSTEMTAP_DIR nastavena, použije se $HOME/.systemtap jako výchozí.- -
- Načte skript ze standardního vstupu namísto ze souboru JMÉNO_SOUBORU, pokud ovšem není dáno -e SKRIPT.
- -h --help
- Zobrazí nápovědu.
- -V --version
- Zobrazí verzi.
- -p NUM
- Zastaví po dokončení procesní fáze NUM. Procesní fáze jsou očíslované 1-5 (parse, elaborate, translate, compile, run). Viz sekce ZPRACOVÁNÍ .
- -v
- Zvýší upovídanost pro všechny procesní fáze. Tuto volbu lze opakovat pro zvýšení množství informativního (?) výstupu.
- --vp ABCDE
- Zvýší upovídanost pro jednotlivé procesní fáze. Například, "--vp 002" přidá 2 jednotky upovídanosti procesní fázi 3. Kombinace "-v --vp 00004" přidá 1 jednotku upovídanosti všem procesním fázím, a další čtyři jednotky fázi 5.
- -k
- Zachová dočasný procesní adresář, který se jinak po dokončení skriptu smaže. To může být užitečné, chceme-li zkoumat vygenerovaný C kód, nebo jej znovu použít pro vytvoření jaderného modulu.
- -g
- Guru režim. Umožní použít potenciálně nebezpečné expertní konstrukce, jako například vložený (embedded) C kód v rámci systemtap skriptu.
- -P
- Režim prohledávání prologu (prologue-searching). Ekvivalentem je --prologue-searching=always. Aktivuje heuristiku pro obcházení problémů s nekonzistentními ladicími informacemi pro kontextové proměnné parametrů funkcí.
- -u
- Vypne optimalizace jako např. odstraňování nepotřebného kódu (a mnoho dalších) během 2., či 3. procesní fáze (elaboration, translation).
- -w
- Potlačí všechny varovné hlášení.
- -W
- Zachází s varováními stejně jako s chybami.
- -b
- Tzv. "bulk" režim pro přenos dat z jádra k uživateli. V tomto režimu jsou data pro jednotlivé CPU přenášena odděleně a zapisována do samostatných souborů. Pro jejich případné sloučení lze použít příkaz stap-merge.
- -t
- Sbírá různé časovací informace jako například počet aktivací (probe hits) pro jednotlivé sondy, průměrný čas strávený v jednotlivých sondách, atd.
- -s NUM
- Nastaví velikost bufferu pro přenos dat ze systemtap modulu k uživateli na NUM MB. Na víceprocesorovém systému v "bulk" režimu bude mít tuto velikost každý jednotlivý buffer.
- -I DIR
- Přidá DIR mezi cesty ve kterých se vyhledávají tapset skripty. Více informací obsahuje popis procesní fáze 2.
- -D NAME=VALUE
- Přidá danou direktivu do Makefile systemtap modulu. Toho lze využít například k předefinování různých omezení popsaných níže.
- -B NAME=VALUE
- Předá danou direktivu příkazu make při sestavování systemtap modulu. Toho lze využít k přidání nebo změně "kconfig" voleb.
- -a ARCH
- Použije režim křížového překladu (cross compilation) pro danou cílovou architekturu. Tato volba vyžaduje přístup ke kompilačnímu serveru a obvykle se používá spolu s volbami -B CROSS_COMPILE=arch-tool-prefix- a -r /build/tree.
- --modinfo NAME=VALUE
- Přidá pár klíč/hodnota ve formě makra MODULE_INFO do vygenerovaného modulu. Toho lze využít k nastavení nebo úpravě různých jaderných kontrol souvisejících s modulem.
- -G NAME=VALUE
- Nastavuje hodnotu globální proměnné NAME na VALUE při volání programu staprun. Tak lze nastavit hodnotu skalární globální proměnné skriptu.
- -R DIR
- Prohledává DIR na systemtap runtime zdroje. Výchozí hodnotu DIR lze zobrazit např. prostřednictvím "stap --help".
- -r /DIR
- Použije daný jaderný "build tree". Lze také nastavit prostřednictvím proměnné prostředí SYSTEMTAP_RELEASE .
- -r RELEASE
- Určí "release" jádra v rámci "build tree" /lib/modules/RELEASE/build. Lze též nastavit prostřednictvím proměnné prostředí SYSTEMTAP_RELEASE .
- -m MODULE
- Použije dané jméno pro vygenerovaný jaderný modul namísto obvyklého náhodně vygenerovaného jména. Takto vygenerovaný modul se pak navíc zkopíruje do aktuálního adresáře.
- -d MODULE
- Přidá do systemtap modulu ladicí informace o symbolech a informace pro odvíjení zásobníku pro daný MODULE. Tak lze umožnit symbolické tracebacky pro MODULE i když do něj není explicitně vložena sonda.
- --ldd
- Přidá do systemtap modulu ladicí informace pro všechny uživatelské spustitelné soubory nebo DSO knihovny, které ldd podezřívá z užitečnosti pro požadovanou analýzu. Totéž bude do systemtap modulu přidáno i pro moduly vyjmenované pomocí přepínačů -d. Upozornění: --ldd může systemtap modul značně zvětšit.
- --all-modules
- Ekvivalent pro "-dkernel" a "-d" pro každý z momentálně zavedených modulů. Upozornění: --all-modules může systemtap modul značně zvětšit.
- -o FILE
- Přesměruje výstup do souboru FILE. V bulk režimu se použije pro každou CPU samostatný soubor s prefixem FILE_ (FILE_cpu s -F) následovaným číslem CPU. Pro FILE je podporován strftime(3) formát.
- -c CMD
- Zavede a nastartuje systemtap modul, spustí příkaz CMD, a vše ukončí spolu s CMD. Vedlejším efektem je nastavení target() na pid CMD.
- -x PID
- Nastaví target() na PID. Takto lze psát skripty se zaměřením na daný proces. V tomto případě systemtap skript běží bez ohledu na životní cyklus procesu PID.
- -e SKRIPT
- Spustí SKRIPT. Příklad: stap -e "probe oneshot { log("hello") }"
- -E SKRIPT
- Spustí SKRIPT. Ten běží spolu s hlavním skriptem určeným pomocí -e nebo načteným ze souboru. Tuto volbu lze opakovat pro načtení většího počtu skriptů. Taktéž ji lze použít v kombinaci s -l/-L.
- -l PROBE
- Namísto obvyklého spuštění systemtap skriptu, tato volba vypíše všechny sondy které odpovídají parametru PROBE. PROBE může obsahovat zástupné symboly a přezdívky, ale ne seznam čárkou oddělených sondážních bodů. Pokud PROBE neodpovídá žádné dostupné sondě, bude výsledkem chyba.
- -L PROBE
- Podobá se "-l", ale navíc vypíše dostupné lokální proměnné.
- -F
- Bez -o tato volba zavede systemtap modul, spustí sondy a odpojí se od běžícího modulu. V kombinaci s volbou -o spustí staprun na pozadí jako démon a vypíše jeho pid.
- -S size[,N]
- Nastavuje maximální velikost výstupního souboru a případně také počet výstupních souborů. V případě, že dojde k překročení maximální velikosti výstupního souboru size , přepne systemtap svůj výstup do dalšího souboru. Pakliže počet výstupních souborů překročí N , systemtap odstraní nejstarší výstupní soubor. Druhý z argumentů lze vynechat.
- -T TIMEOUT
- Ukončit skript po uplynutí TIMEOUT sekund.
- --skip-badvars
- Ignoruje neidentifikovatelné nebo nedostupné kontextové proměnné a, aniž by došlo k chybě, nahradí jejich hodnotu nulou.
- --prologue-searching[=WHEN]
- Režim prologue-searching. Aktivuje heuristiku k vyrovnání se s nekvalitními ladicí informacemi pro kontextové proměnné funkčních parametrů. WHEN může být "never" (nikdy), "always" (vždy), nebo "auto" (tj. zapnuto na základě heuristiky). Když WHEN chybí, předpokládá se "always". Bez explicitní specifikace se předpokládá "auto".
- --suppress-handler-errors
- Zabalí všechny obslužné rutiny
do obálky podobné následujícímu
kódu:
try { ... } catch { next }
- --compatible VERSION
- Z uživatelského hlediska se tato volba pokouší napodobit chování systemtapu dané verze a umožnit tak běh starším skriptům. Viz též sekce ZASTARÁVÁNÍ.
- --check-version
- Tato volba slouží k ověření, zda aktivní skript obsahuje konstrukce závislé na verzi systemtapu. Viz též sekce ZASTARÁVÁNÍ.
- --clean-cache
- Tato volba smaže zastaralé položky v cache adresáři. To se normálně děje po úspěšném ukončení skriptu, ale tato volba vyčistí cache explicitně, a pak ukončí systemtap. Viz sekce CACHE.
- --color[=WHEN], --colour[=WHEN]
- Tato volba ovládá obarvování výstupu. WHEN může být "never" (nikdy), "always" (vždy), nebo "auto" (zapnuto pokud jde výstup do terminálu). Pokud WHEN chybí, předpokládá se "auto". Barvy lze měnit prostřednictvím proměnné prostředí SYSTEMTAP_COLORS. Formát je následující: klíč1=hodnota1:klíč2=hodnota2:klíč3=hodnota3 ...atd. Platné klíče jsou: "error", "warning", "source", "caret", a "token". Hodnotami jsou "Select Graphic Rendition" (SGR) parametry. Viz dokumentace k použitému terminálu. Příklad výchozího nastavení je: error=01;31:warning=00;33:source=00;34:caret=01:token=01. Pokud SYSTEMTAP_COLORS chybí, použije se výchozí nastavení. Pokud to je prázdné nebo chybné, obarvování se vypne.
- --disable-cache
- Tato volba vypne veškeré používání cache. Žádné soubory nebudou do cache adresáře zapsány, ani z něj čteny.
- --poison-cache
- Tato volba zachází se soubory v cache jako s neplatnými. Žádné soubory nebudou z cache čteny, ale nové soubory budou do cache zapsány na základě aktuálního běhu. Tato volba má pomoci hledat chybu v případě, kdy se cache systemtapu zdá fungovat chybně. Pokud tato volba pomohla, provděpodobně je v někde v systemtapu chyba, o které by vývojáři rádi věděli. Prosím, nahlašte ji.
- --privilege[=stapusr | =stapsys | =stapdev]
- Tato volba zkontroluje skript na přítomnost konstruktů, které nejsou povoleny pro zadanou úroveň oprávnění (viz NEPRIVILEGOVANÍ UŽIVATELÉ). Pokud skript nepovolené konstrukty obsahuje, kompilace skončí chybou. Pokud je stapusr nebo stapsys specifikováno při použití kompilačního serveru (viz --use-server), pak server zkontroluje skript a, pokud kompilace uspěje, server kryptograficky podepíše výsledný modul, kde specifikuje, že daný modul je bezpečný pro použití uživatelem s danou úrovní oprávnění. Pokud se --privilege nespecifikuje, -pN se také nespecifikuje s N < 5 a daný uživatel není root ani člen skupiny stapdev, pak stap automaticky přidá odpovídající --privilege volbu k již specifikovaným volbám.
- --unprivileged
- Ekvivalent pro --privilege=stapusr.
- --use-server[=HOSTNAME[:PORT] | =IP_ADDRESS[ :PORT] | =CERT_SERIAL]
- Specifikuje kompilační server(y) pro kompilaci, a/nebo - v kombinaci s --list-servers a --trust-servers (viz níže) pro výpis serverů. Pokud je tato volba použita bez parametrů v neprivilegovaném režimu (viz --privilege) , pak výchozí server, který bude pro kompilaci použit, bude některý z dostupných kompatibilních serverů "online SSL peer", a zároveň "module signer". Jinak bude jako výchozí server použit některý z dostupných kompatibilních serverů "online SSL peer". --use-server lze použít opakovaně a v tomto případě bude seznam použitelných serverů postupně rozšiřován v daném pořadí. Servery lze specifikovat pomocí hostaname, IP adresy, nebo seriálním číslem certifikátu (získaným prostřednictvím --list-servers). Poslední možnost je nejběžnější pro (od)nastavování důvěryhodnosti serveru. Viz --trust-servers níže. Pokud je server specifikován pomocí hostname nebo IP adresy, pak je volitelně možné určit i číslo portu. To je vhodné pro přístup k serverům, které nejsou na lokální síti, nebo pro specifikování konkrétního serveru. IP adresou může být jak IPv4, tak IPv6. Pokud existuje více než jedno rozhraní s danou link-local IPv6 adresou, pak je možné zvolit konkrétní rozhraní připojením znaku "%" a názvu rozhraní k adrese, například: "fe80::5eff:35ff:fe07:55ca%eth0". Pro určení čísla portu IPv6 adresy je nutné uzavřít adresu do hranatých závorek , aby došlo k oddělení adresy od čísla portu. Například: "[fe80::5eff:35ff:fe07:55ca]:5000" nebo "[fe80::5eff:35ff:fe07:55ca%eth0]:5000". Pokud --use-server nebylo specifikováno, -pN nebylo specifikováno s N < 5, a uživatel není root, není člen skupiny stapdev, ale je členem skupiny stapusr, pak stap automaticky přidá --use-server k již specifikovaným volbám.
- --use-server-on-error[=yes|=no]
- Požádá stap, aby zkusil kompilaci znovu s použitím kompilačního serveru, pokud lokální kompilace selže. Pokud tato volba není specifikována, pak se za výchozí považuje --use-server-on-error= no --use-server-on-error je ekvivalentem pro --use-server-on-error= yes. Kompilace může být přerušena pro určitý typ chyby, jako například nedostatek dat nebo zdrojů. K tomu může dojít i během rekompilace. Pro rekompilaci budou servery voleny automaticky tak, jako by byla použita volba --use-server bez parametrů.
- --list-servers[=SERVERS]
- Zobrazí stav požadovaných SERVERS, kde SERVERS je čárkou oddělený seznam atributů popisujících servery. Sjednocení atributů slouží k vygenerování seznamu serverů. Dostupné atributy jsou:
- all
- specifikuje všechny známé servery (důvěryhodné servery "SSL peer", důvěryhodné servery "module signer", servery ve stavu "online").
- specified
- určuje servery specifikované pomocí --use-server.
- online
- vybere ze seznamu jen ty servery, které jsou aktuálně ve stavu "online".
- trusted
- vybere ze seznamu jen důvěryhodné servery "SSL peer".
- signer
- vybere ze seznamu jen servery "module signer", viz --privilege.
- compatible
- vybere jen kompatibilní servery ve smyslu kernel release a architektury.
- Pokud není dán žádný argument, pak výchozí volbou je specified. Pokud žádné servery nebyly specifikovány pomocí --use-server, pak budou vypsány výchozí servery pro --use-server. Poznamenejme, že --list-servers používá avahi-daemon k detekci online serverů. Pokud tato služba není dostupná, pak --list-servers nebude detekovat žádné online servery. Aby --list-servers detekoval servery poslouchající na IPv6 adresách, musí konfigurační soubor avahi démona, /etc/avahi/avahi-daemon.conf , obsahovat "use-ipv6=yes". Po případné úpravě konfiguračního souboru je třeba službu restartovat.
- --trust-servers[=TRUST_SPEC]
- Nastavit nebo odvolat natavení důvěryhodnosti kompilačního serveru specifikovaného pomocí --use-server podle TRUST_SPEC, kde TRUST_SPEC je čárkou oddělený seznam typů důvěryhodnosti. Podporované typy jsou:
- ssl
- důvěřovat specifikovaným serverům jako "SSL peer".
- signer
- důvěřovat specifikovaným serverům jako "module signer" (viz --privilege). Jen root může nastavit signer.
- all-users
- důvěřovat specifikovaným serverům jako "SSL peer" pro všechny uživatele na localhostu. Výchozí chování je nastavit tento typ důvěřování jen pro aktuálního uživatele. Důvěra typu "module signer" se vždy vztahuje na všechny uživatele. Jen root může nastavit all-users.
- revoke
- ruší určenou relaci důvěry. Výchozí chování je zapnutí relace důvěry.
- no-prompt
- nežádat uživatele o potvrzení před provedením akce. Výchozí chování je požádat o potvrzení před provedením akce.
- Pokud žádný argument není nastaven, použije se výchozí hodnota ssl. Pokud pomocí --use-server, nebyly určené žádné servery, žádná relace důvěry nebude nastavena ani zrušena.
- Dokud se nespecifikuje no-prompt, uživatel bude požádán o potvrzení požadované akce.
- --dump-probe-types
- Vypíše všechny podporované typy sond a skončí. Pokud je též nastaveno --privilege=stapusr , pak tento seznam bude omezen tak, aby vidět byly pouze sondy, které má daný uživatel právo použít.
- --dump-probe-aliases
- Vypíše všechny přezdívky nalezené v tapset skriptech a skončí.
- --dump-functions
- Vypíše všechny veřejné funkce nalezené v tapset skriptech a skončí. Také vypíše jejich parametry a typy. Návratový typ "unknown" značí, že daná funkce nevrací hodnotu. Poznamenejme, že ne všechny návratové typy / typy parametrů je vždy možné při syntaktické analýze stanovit. Nestanovené typy budou též označeny jako "unknown". Funkce --dump-functions je náročná na paměť a proto nemusí správně fungovat s --use-server pokud na cílovém systému narazí na rlimit pro paměť procesu, například prostřednictvím konfiguračního souboru ~stap-server/.systemtap/rc, viz stap-server(8).
- --remote URL
- Provede skript na vzdáleném stroji. Tuto volbu je možné opakovat pro provedení skriptu na více strojích. Procesní fáze 1-4 se provedou lokálně, jak je běžné, a pak během fáze 5, se modul zkopíruje na specifikované stroje a na nich provede. Přijatelné URL jsou:
- [USER@]HOSTNAME, ssh://[USER@]HOSTNAME
- Tento režim využívá SSH, volitelně s využitím specifického uživatelského jména username. Pokud je použit uživatelský ssh_config, je třeba do něj přidat SendEnv LANG pro zachování nastavení lokalizace.
- libvirt://DOMAIN, libvirt://DOMAIN/LIBVIRT_URI
- Tento režim využívá ke
spuštění skriptu stapvirt v
doméně obsluhované libvirt démonem.
Volitelně je možno specifikovat LIBVIRT_URI pro
připojení ke specifickému driveru nebo
vzdálenému stroji. Například pro
připojení k místnímu privilegovanému
QEMU driveru použijte:
--remote libvirt://MyDomain/qemu:///system
- unix:PATH
- V tomto režimu dojde k připojení přes UNIX soket. Toho lze využít pro připojení přes QEMU virtio-serial port pro spuštění skriptu uvnitř běžícího virtuálního stroje.
- direct://
- Loopback režim pro spouštění na localhostu.
- --remote-prefix
- Oprefixuje každou řádku výstupu "N: ", kde N je index vzdáleného stroje ze kterého daný výstup pochází.
- --download-ladicíinfo[=OPTION]
- Podle OPTION zapne, vypne, nebo nastaví timeout pro funkci automatického stahování balíčků s ladicími informacemi, kterou nabízí ABRT. Přípustné hodnoty pro OPTION jsou:
- yes
- povolí automatické stahování bez časového omezení. Totéž jako --download-debuginfo bez parametru.
- no
- explicitně vypne automatické stahování Totéž jako nepoužití --download-debuginfo vůbec.
- ask
- ukáže výstup ABRTu a dotáže se uživatele, zda se má pokračovat v downloadu. Žádný timeout nebude nastaven.
- <timeout>
- specifikuje timeout jako pozitivní celé číslo vyjadřující maximální počet sekund pro download.
- --rlimit-as=NUM
- Určí maximální velikost virtuální paměti procesu v bajtech. Bez specifikace NUM nebude žádný limit nastaven.
- --rlimit-cpu=NUM
- Určí limit pro čas CPU v sekundách. Bez specifikace NUM není žádný limit nastaven.
- --rlimit-nproc=NUM
- Určí maximální počet procesů které může systemtap vytvořit. Bez specifikace NUM není žádný limit nastaven.
- --rlimit-stack=NUM
- Nastaví maximální velikost zásobníku v bajtech. Bez specifikace NUM není žádný limit nastaven.
- --rlimit-fsize=NUM
- Nastaví maximální velikost souboru, který je možno vytvořit, v bajtech. Bez specifikace NUM není žádný limit nastaven.
- --sysroot=DIR
- Nastaví "sysroot" adresář, kde budou umístěny cílové soubory (programy, knihovny atd.) Po nastavení -r RELEASE bude v adresáři "sysroot" hledán "build" adresář jádra, ovšem po nastavení -r /DIR nebude "sysroot" prohledáván na "build" adresář jádra.
- --sysenv=VAR=VALUE
- Nastaví alternativní hodnotu proměnné prostředí pokud se tato hodnota na vzdáleném systému liší. Předpokládá se, že proměnné vyjadřující cesty budou uvedeny jako relativní cesty vzhledem k --sysroot (pokud je nastaven).
- --suppress-time-limits
- Potlačí -DSTP_OVERLOAD*, -DMAXACTION a -DMAXTRYLOCK. Vyžaduje guru režim (-g).
- --runtime=MODE
- Nastaví runtime režim pro procesní fázi 5. Validní hodnoty jsou kernel (výchozí), dyninst a bpf. Viz sekce ALTERNATIVNÍ RUNTIME.
- --dyninst
- Zkratka pro --runtime=dyninst.
- --save-uprobes
- Na strojích, kde si SystemTap musí sestavit svůj vlastní modul "uprobes" (jádra před 3.5), tato volba instruuje SystemTap, aby po sestavení tento pomocný modul zachoval v aktuálním adresáři.
- --target-namespaces=PID
- Nastavuje cílový "namespace" (jmenný prostor procesů) na "namespace" do kterého patří PID. Volba souvisí s "namespace-aware" tapset funkcemi. Pokud cílový "namespace" není specifikován, použije se "namespace" v kterém běží stap.
- --monitor=INTERVAL
- Umožňuje zobrazovat informace o stavu modulu (čas běhu, jméno modulu, id uživatele, který modul aktivoval, informace o paměti, globální proměnné, seznam sond včetně jejich statistik). Je možno nastavit volitelný parametr INTERVAL, který určuje obnovovací frekvenci stavového okna v sekundách. Činnost modulu lze ovládat následujícími klávesami:
- r
- přenastaví všechny globální proměnné na jejich výchozí hodnoty nebo na nulu, pokud výchozí hodnota nebyla určena.
- s
- cyklicky mění hodnoty daného atributu za účelem změny třídění seznamu sond.
- t
- umožňuje aktivovat/deaktivovat sondu indexem.
- navigační-klávesy
- Klávesami j/k/Up/Down lze posouvat seznam sond. Klávesami d/u/PgDn/PgUp lze rolovat v statistice modulu.
ARGUMENTY
Všechny další argumenty z příkazové řádky se předají kompilátoru ke zpracování. Viz níže.SKRIPTOVACÍ JAZYK
Skriptovací jazyk systemtapu připomíná awk a C. Existují v něm dva hlavní konstrukty: sondy a funkce. V jejich rámci se používají příkazy a výrazy se syntaxí podobnou syntaxi jazyka C.OBECNÁ SYNTAXE
Bílé místo se ignoruje. Podporovány jsou komentáře tří typů:FÁZE PŘEDZPRACOVÁNÍ (PREPROCESSING)
Součástí lexikální analýzy je jednoduchá fáze předzpracování. V ní lze (ne)vyhodnocovat části kódu na základě podmínky. Příslušná syntaxe se obecně podobá ternárnímu operátoru: podmínka ? výraz1 : výraz2%( PODMÍNKA %? VÝRAZ-1 %) %( PODMÍNKA %? VÝRAZ-1 %: VÝRAZ-2 %)
%( kernel_v <= "2.6.5" %? **ERROR** %) # "invalid token sequence"
probe kernel.function ( %( kernel_v <= "2.6.12" %? "__mm_do_fault" %: %( kernel_vr == "2.6.13*smp" %? "do_page_fault" %: UNSUPPORTED %) %) ) { /* ... */ } %( arch == "ia64" %? probe syscall.vliw = kernel.function("vliw_widget") {} %)
MAKRA PREPROCESORU
Preprocesor přijímá jednoduchá makra a vyhodnocuje je v rámci samostatné procesní fáze před vyhodnocením podmínek.@define NAME %( BODY %) @define NAME(PARAM_1, PARAM_2, ...) %( BODY %)
@define foo %( x %) @define add(a,b) %( ((@a)+(@b)) %) @foo = @add(2,2)
// Následující kód způsobí chybu: %( CONFIG_UTRACE == "y" %? @define foo %( process.syscall %) %: @define foo %( **ERROR** %) %) // Následující kód bude fungovat správně: @define foo %( %( CONFIG_UTRACE == "y" %? process.syscall %: **ERROR** %) %)
KONSTANTY
V rámci tapset skriptů, nebo guru skriptů je možno přistupovat ke konstantním symbolům, jako jsou například makra jazyka C, prostřednictvím vestavěného operátoru @const(). Pokud je potřeba přidat příslušný #include dodatečného hlavičkového souboru, lze tak učinit prostřednictvím vloženého kódu jazyka C.@const("STP_SKIP_BADVARS")
PROMĚNNÉ
Identifikátory pro proměnné a funkce jsou alfanumerické sekvence, které mohou obsahovat _ a $. Nesmí začínat číslicí (stejně jako v C). Proměnné jsou lokální vzhledem ke svému bloku (funkce nebo sondy) a jejich životnost je spojena s tímto blokem.var1 = 5 var2 = "bar" array1 [pid()] = "name" # jednoduchý číselný klíč pole array2 ["foo",4,i++] += 5 # n-tice jako klíč pole if (["hello",5,4] in array2) println ("yes") # test na členství
global var1, var2, var3=4
private global var1=2 private var2
global tiny_array[10], normal_array, big_array[50000]
global wrapped_array1%[10], wrapped_array2%
PŘÍKAZY
Příkazy umožňují procedurální řízení běhu skriptu. Mohou se vyskytovat uvnitř funkcí a obslužných rutin sond. Celkový počet příkazů, které je v reakci na nějakou událost možno spustit, je omezen na hodnotu definovanou makry MAXACTION_* ve vygenerovaném C-kódu a pohybuje se kolem 1000.- EXP
- Vyhodnotit řetězcový, nebo číselný výraz a zahodit hodnotu.
- { STMT1 STMT2 ... }
- Vykonat každý příkaz v sekvenci v tomto bloku. Poznamenejme, že oddělovače a znaky pro ukončení příkazu nejsou mezi jednotlivými příkazy nezbytné.
- ;
- Prázdný příkaz, nedělat nic. Je užitečný jako volitelný oddělovač mezi příkazy ke zlepšení detekce syntaktických chyb a k upřesnění některých syntaktických nejednoznačností gramatiky.
- if (EXP) STMT1 [ else STMT2 ]
- Porovnat číselný výraz EXP s nulou. Pak vykonat příkaz STMT1 (EXP není nula), nebo příkaz STMT2 (EXP je nula).
- while (EXP) STMT
- Dokud má číselný výraz EXP nenulovou hodnotu, spouštěj STMT.
- for (EXP1; EXP2; EXP3) STMT
- Vykoná EXP1 jako inicializaci. Dokud EXP2 má nenulovou hodnotu, bude vykonávat STMT a iterační výraz EXP3.
- foreach (VAR in ARRAY [ limit EXP ]) STMT
- Cyklení přes každý prvek globálního pole ARRAY s přiřazením aktuálního prvku proměnné VAR. Pole není v rámci STMT dovoleno měnit. Přidáním operátoru + nebo - za identifikátor VAR nebo ARRAY, se zajistí iterování přes setříděné pole jedním, nebo druhým směrem. Pokud pole obsahuje statistické agregátory, pak přidáním požadovaného operátoru @operator mezi ARRAY a symbol + nebo - určíme třídicí agregační funkci. Viz příklad níže v sekci STATISTIKA. Výchozí je @count. S využitím volitelného klíčového slova limit lze maximální počet iterací omezit na EXP. Poznamenejme, že EXP se vyhodnocuje na začátku smyčky.
- foreach ([VAR1, VAR2, ...] in ARRAY [ limit EXP ]) STMT
- Podobně jako výše, ovšem v tomto případě je klíčem pole n-tice hodnot. Třídicí příponu lze použít maximálně na jednom z prvků n-tice.
- foreach ([VAR1, VAR2, ...] in ARRAY [INDEX1, INDEX2, ...] [ limit EXP ]) STMT
- Podobně jako výše, ovšem iterovat se bude pouze přes prvky, kde klíč vyhovuje dané hodnotě. Pro určení indexu lze použít znak *, se kterým bude zacházeno jako se zástupným symbolem.
- foreach (VAR0 = VAR in ARRAY [ limit EXP ]) STMT
- Tato varianta foreach uchová aktuální hodnotu při každé iteraci ve VAR0, takže bude odpovídat ARRAY[VAR]. Tohle analogicky funguje s n-ticí klíčů. Třídicí přípony na VAR0 mají stejný význam jako na ARRAY.
- foreach (VAR0 = VAR in ARRAY [INDEX1, INDEX2, ...] [ limit EXP ]) STMT
- Podobné jako výše, ovšem iteruje se pouze přes prvky, kde klíče vyhovují daným hodnotám. Pro určení indexu lze použít znak * se kterým bude zacházeno jako se zástupným symbolem.
- break, continue
- Ukončit, nebo znovu iterovat vnitřní smyčku. Aplikovatelné na while nebo for nebo foreach.
- return EXP
- Vrátit hodnotu EXP z funkce. Příkaz return není ve funkci povinný. Pokud se vynechá, bude funkce mít speciální návratový datový typ "unknown".
- next
- Ihned ukončí obslužnou rutinu sondy. To je obzvlášť užitečné u přezdívek, které používají filtrovací podmínky.
- try { STMT1 } catch { STMT2 }
- Vykonej příkazy v prvním bloku STMT1. Pokud při tom dojde k chybě běhu, ukonči STMT1 a začni provádět STMT2. Případné chyby v STMT2 se budou propagovat do vnějšího catch bloku, pokud tam takový je.
- try { STMT1 } catch(VAR) { STMT2 }
- Podobně jako v předchozím případě, ale navíc se chybová hláška, jakožto řetězec, uchová v proměnné VAR.
- delete ARRAY[INDEX1, INDEX2, ...]
- Odstraní z pole prvky určené n-ticí klíčů. Pokud n-tice klíčů obsahuje symbol * na místě indexu, bude s * zacházeno jako jako se zástupným symbolem. Není chybou pokusit se smazat prvek, který neexistuje.
- delete ARRAY
- Smazat všechny prvky pole ARRAY.
- delete SCALAR
- Maže hodnotu SCALAR. Celočíselné proměnné budou vynulovány, řetězcové proměnné nastaveny na "", a statistické proměnné budou nastaveny do výchozího prázdného stavu.
VÝRAZY
SystemTap podporuje množství operátorů, které mají syntaxi a sémantiku velmi podobnou jejich C a awk protějškům. Aritmetické operace se provádějí v souladu s pravidly jazyka C pro celá čísla se znaménkem. Dělení nulou nebo přetečení rozsahu se detekuje a způsobí chybu.- binární numerické operátory
- * / % + - >> << & ^ | && ||
- binární operátory nad řetězci
- . (spojení řetězců)
- číselné přiřazovací operátory
- = *= /= %= += -= >>= <<= &= ^= |=
- řetězcové přiřazovací operátory
- = .=
- unární číselné operátory
- + - ! ~ ++ --
- operátory pro srovnávání čísel, řetězců a práci s regulárními výrazy
- < > <= >= == != =~ !~
- ternární operátor
- podmínka ? exp1 : exp2
- seskupovací operátor
- ( exp )
- volání funkce
- fn ([ arg1, arg2, ... ])
- operátor testující členství v poli
- exp in array
REGULÁRNÍ VÝRAZY
Skriptovací jazyk systemtapu podporuje práci s regulárními výrazy. Základní operace testující (ne)shodu řetězce s regulárním výrazem:exp =~ regex exp !~ regex
if ("an example string" =~ "str(ing)") { matched(0) // -> vrací "string", t.j. celý odpovídající řetězec matched(1) // -> vrací "ing", t.j. první odpovídající podřetězec ngroups() // -> vrací 2, t.j. počet odpovídajících skupin řetězců }
SONDY
Hlavním syntaktickým konstruktem skriptovacího jazyka jsou sondy (probes). Sondy spojují abstraktní události s bloky příkazů a vytvářejí tak obslužné rutiny událostí. Obecná syntaxe je následující:probe PROBEPOINT [, PROBEPOINT] { [STMT ...] } probe PROBEPOINT [, PROBEPOINT] if (CONDITION) { [STMT ...] }
probe syscall.read = kernel.function("sys_read") { fildes = $fd if (execname() == "init") next # přeskočit zbytek sondy }
probe syscall.read += kernel.function("sys_read") { if (tracethis) println ($fd) }
probe syscall.read { printf("reading fd=%d\n", fildes) if (fildes > 10) tracethis = 1 }
FUNKCE
Systemtap skripty mohou definovat funkce. Ty mohou přijímat libovolný počet skalárních (celočíselných nebo řetězcových) parametrů, a vrací jednu skalární funkční hodnotu. Příklad funkce:function thisfn (arg1, arg2) { return arg1 + arg2 }
function thatfn:string (arg1:long, arg2) { return sprint(arg1) . arg2 }
private function three:long () { return 3 }
TISK
Existuje několik funkcí, se kterými překladač zachází neobvykle. Poznamenejme, že data jsou generována v jaderném modulu a před tiskem musí být přenesena do uživatelského prostoru. Tyto funkce formátují hodnoty pro pohodlný tisk do výstupního proudu systemtapu. Varianty funkce- print, sprint
- Výpis jedné nebo více hodnot libovolného typu spojených dohromady.
- println, sprintln
- vypisují hodnoty stejně jako print a sprint, ale navíc připojují znak nového řádku.
- printd, sprintd
- Přijímají řetězcový oddělovač a dvě nebo více hodnot libovolného typu, a vytisknou je proložené tímto oddělovačem. Oddělovačem musí být řetězcový literál - konstanta.
- printdln, sprintdln
- Vytisknou hodnoty proložené oddělovačem podobně jako printd a sprintd, ale zároveň připojí znak konce řádku.
- printf, sprintf
- přijímají formátovací řetězec s množinou hodnot odpovídajících typů a všechny je vytisknou. Formátovacím řetězcem musí být řetězcový literál - konstanta.
- %b
- Vypisuje binární blob dané hodnoty namísto ASCII textu. Specifikátor "width" určuje počet bajtů k vypsání. Validní specifikace jsou: %b %1b %2b %4b %8b. Výchozí je (%b), t.j. 8 bajtů.
- %c
- Znak.
- %d,%i
- Celé číslo se znaménkem.
- %m
- Bezpečně čte paměť jádra na dané adrese, vrací její obsah. Volitelný specifikátor přesnosti (ne šířky pole) určuje počet bajtů k přečtení. Výchozí hodnota je 1 bajt. %10.4m vytiskne 4 bajty paměti v rámci 10 znaků širokého pole.
- %M
- Stejné jako %m, ale výstup je hexadecimální. Minimální šířka výstupu je určitelná volitelným specifikátorem r - výchozí hodnota je 1 bajt (2 hexadecimální znaky). %10.4M vytiskne 4 bajty paměti jako 8 hexadecimálních znaků v rámci 10 znaků širokého pole.
- %o
- Oktalové číslo bez znaménka.
- %p
- Ukazatel bez znaménka.
- %s
- Řetězec.
- %u
- Desítkové číslo bez znaménka.
- %x
- Hexadecimální hodnota bez znaménka, malá písmena.
- %X
- Hexadecimální hodnota bez znaménka, velká písmena.
- %%
- Vypíše znak %.
a = "alice", b = "bob", p = 0x1234abcd, i = 123, j = -1, id[a] = 1234, id[b] = 4567 print("hello") Vypíše: hello println(b) Vypíše: bob\n println(a . " is " . sprint(16)) Vypíše: alice is 16 foreach (name in id) printdln("|", strlen(name), name, id[name]) Vypíše: 5|alice|1234\n3|bob|4567 printf("%c is %s; %x or %X or %p; %d or %u\n",97,a,p,p,p,j,j) Vypíše: a is alice; 1234abcd or 1234ABCD or 0x1234abcd; -1 or 18446744073709551615\n printf("2 bytes of kernel buffer at address %p: %2m", p, p) Vypíše: 2 byte of kernel buffer at address 0x1234abcd: <binary data> printf("%4b", p) Vypíše (these values as binary data): 0x1234abcd printf("%#o %#x %#X\n", 1, 2, 3) Vypíše: 01 0x2 0X3 printf("%#c %#c %#c\n", 0, 9, 42) Vypíše: \000 \t *
STATISTIKA
Často je výhodné sbírat statistická data způsobem, který netrpí problémy s exkluzivním zamykáním globálních proměnných, kde se data udržují. Systemtap nabízí řešení ve formě speciálního operátoru pro uchovávání statistických dat a sady agregačních pseudofunkcí.foo <<< 1 stats[pid()] <<< memsize
$ stap -e \ > 'global x probe oneshot { for(i=1;i<=5;i++) x<<<i println(@variance(x)) }' 12 $ stap -e \ > 'global x probe oneshot { for(i=1;i<=5;i++) x<<<i println(@variance(x,1)) }' 2 $ python3 -c 'import statistics; print(statistics.variance([1, 2, 3, 4, 5]))' 2.5 $
probe timer.profile { x[1] <<< pid() x[2] <<< uid() y <<< tid() } global x // pole global y // skalár probe end { foreach ([i] in x @count+) { printf ("x[%d]: avg %d = sum %d / count %d\n", i, @avg(x[i]), @sum(x[i]), @count(x[i])) println (@hist_log(x[i])) } println ("y:") println (@hist_log(y)) }
PŘETYPOVÁNÍ
Jakmile se ukazatel uloží do celočíselné proměnné v rámci systemtap skriptu, překladač ztrácí informaci o typu, která je potřebná k dereferencování.(viz KONTEXTOVÉ PROMĚNNÉ man stránky stapprobes(3stap)). Použitím operátoru @cast() sdělujeme kompilátoru, jak má interpretovat takové číslo jakožto typovaný ukazatel. Příklad:
@cast(p, "type_name"[, "module"])->member
@cast(tv, "timeval", "<sys/time.h>")->tv_sec @cast(task, "task_struct", "kernel<linux/sched.h>")->tgid @cast(task, "task_struct", "kernel<linux/sched.h><linux/fs_struct.h>")->fs->umask
probe foo { if ($var->type == 1) { value = @cast($var->data, "type1")->bar } else { value = @cast($var->data, "type2")->baz } print(value) }
EMBEDDED C
V guru režimu přijímá překladač vložený C kód v uživatelských skriptech. Takový kód je uzavřen mezi značkami %{ a %} a je doslovně, bez analýzy, vložen do vnější úrovně vygenerovaného kódu systemtap modulu. Protože je vložen do vnější úrovně, je možné takto definovat #include direktivy a různé pomocné definice použitelné ve zbytku kódu. Dalším místem, kde je vložené C povoleno, je tělo funkce. V tomto případě bude tělo systemtap funkce doslovně tvořeno vloženým C kódem uzavřeným mezi značky %{ a %}. Takto vložený C kód může vykonávat libovolnou rozumnou a bezpečnou činnost. Existuje množství nedokumentovaných a komplexních omezení ohledně atomicity, souběžnosti, spotřeby zdrojů a časových omezení, takže jde o pokročilou techniku. Paměťová umístění vyhrazená pro vstupní a výstupní hodnoty jsou zpřístupněna pomocí maker STAP_ARG_* a STAP_RETVALUE. Chyby lze signalizovat pomocí STAP_ERROR, výstup pomocí STAP_PRINTF a návratovou hodnotu lze předat prostřednictvím STAP_RETURN. Zde je několik příkladů:function integer_ops (val) %{ STAP_PRINTF("%d\n", STAP_ARG_val); STAP_RETVALUE = STAP_ARG_val + 1; if (STAP_RETVALUE == 4) STAP_ERROR("wrong guess: %d", (int) STAP_RETVALUE); if (STAP_RETVALUE == 3) STAP_RETURN(0); STAP_RETVALUE ++; %} function string_ops (val) %{ strlcpy (STAP_RETVALUE, STAP_ARG_val, MAXSTRINGLEN); strlcat (STAP_RETVALUE, "one", MAXSTRINGLEN); if (strcmp (STAP_RETVALUE, "three-two-one")) STAP_RETURN("parametr měl být be three-two-"); %} function no_ops () %{ STAP_RETURN(); /* funkce bez návratové hodnoty */ %}
function add_one (val) { return val + %{ 1 %} } function add_string_two (val) { return val . %{ /* string */ "two" %} }
- /* pure */
- znamená, že C kód nemá žádné vedlejší efekty a může být v rámci optimalizace zcela zahozen pokud nemá vazby na zbytek kódu.
- /* stable */
- znamená, že C kód má vždy stejnou hodnotu (při vyvolání v rámci libovolné obslužné rutiny sondy), takže opakovaná volání mohou být nahrazena zapamatovanou hodnotou. Takové funkce nesmí přijímat parametry a musí být /*pure*/.
- /* unprivileged */
- znamená, že C kód je tak bezpečný, že ho mohou používat i neprivilegovaní uživatelé.
- /* myproc-unprivileged */
- znamená, že C kód je tak bezpečný, že ho mohou používat i neprivilegovaní uživatelé, ovšem jen při analýze svých vlastních uživatelských procesů.
- /* guru */
- znamená, že C kód je tak nebezpečný, že vyžaduje použití guru režimu -g.
- /* unmangled */
- ve vložené C funkci zpřístupní zastaralou (pre-1.8) syntaxi pro přístup k funkčním parametrům. V tomto případě lze uvnitř funkce kromě STAP_ARG_foo a STAP_RETVALUE použít také THIS->foo a THIS->__retvalue .
- /* unmodified-fnargs */
- ve vložené C funkci znamená, že parametry nejsou uvnitř těla funkce měněny.
- /* string */
- ve vložené C funkci znamená, že výraz má typ const char * a mělo by s ním být nakládáno jako s řetězcovou hodnotou namísto numerické (což je výchozí chování).
BUILT-INS
Skripty instalované v umístění definovaném ve stappaths(7) poskytují množství vestavěných sondážních bodů. Ty jsou popsány v man stránce stapprobes(3stap).ZPRACOVÁNÍ SKRIPTU
Systemtap zpracovává skript v pěti procesních fázích: "parse", "elaborate", "translate", "compile" a "run". Překladač zahájí fázi 1 lexikální analýzou uživatelského skriptu spolu se všemi tapset skripty (což jsou soubory s příponou *.stp) nalezenými v tapset adresáři. Adresáře vyjmenované prostřednictvím -I jsou následně zpracovány také, a to v guru režimu. Adresářová struktura se prohledává do hloubky. Některé podadresáře jsou specifické pro verzi jádra (volba -R ), a podle ní jsou (nebo nejsou) prohledávány, takže skripty specifičtější pro danou verzi jádra mohou předefinovat své méně specifické protějšky. Například pro verzi jádra 2.6.12-23.FC3 by byly prohledávány následující adresáře: 2.6.12-23.FC3/*.stp, 2.6.12/*.stp, 2.6/*.stp, a nakonec *.stp v tomto pořadí. Pokud překlad skončí na konci fáze 1 (-p1), pak překladač na standardní výstup vypíše derivační strom (parse tree). Ve fázi 2 překladač analyzuje vstupní skript, aby vyhodnotil symboly a datové typy. Odkazy na proměnné, funkce a přezdívky, které se nepodaří vyhodnotit lokálně, se vyhodnotí proti tapset skriptům. Pokud je určitý symbol nalezen v tapset skriptu, pak daný tapset bude celý přidán do fronty pro zpracování překladačem. Tento iterativní proces skončí jakmile jsou vyhodnoceny všechny symboly s využitím dané podmnožiny tapset skriptů. Dále se ověří validnost sondážních bodů. Sondy, které se odkazují k umístěním ve zdrojovém kódu ("synchronní sondážní body") vyžadují, aby byly nainstalovány příslušné ladicí informace. V obslužných rutinách sond se naleznou cílové proměnné (ty, které začínají znakem "$") a dekódují se jejich "run-time" lokace.NEOBVYKLÉ UKONČENÍ
Je dobré neukončovat stap proces násilím, například prostřednictvím signálu SIGKILL, protože proces stapio (potomek procesu stap) a systemtap modul by se nemusely korektně ukončit. Pokud se to přecejen stane, pošlete všem zbývajícím stapio procesům SIGTERM nebo SIGINT a použijte rmmod pro odstranění systemtap modulu z jádra.PŘÍKLADY
Viz stapex(3stap) , kde se nachází několik krátkých příkladů, nebo viz adresář "examples" v RPM balíčcích "systemtap-client", či "systemtap-testsuite", kde se nachází rozsáhlá sbírka příkladů. Viz stappaths(7stap) pro podrobný popis konkrétních umístění. Příklady jsou také zveřejněny na webové stránce projektu systemtap.CACHE
Překladač systemtapu ukládá do cache výstup fáze 3 (tj. vygenerovaný C kód) a výstup fáze 4 (tj. zkompilovaný jaderný modul) pokud tyto fáze skončí bez chyb. Obsah cache se použije pokud se znovu překládá stejný skript a za předpokladu, že platí stejné podmínky (verze jádra, verze systemtapu atp.). Cache se nachází v adresáři $SYSTEMTAP_DIR/cache . Velikost cache lze omezit umístěním souboru cache_mb_limit do cache adresáře, přičemž tento soubor obsahuje ASCII číselnou hodnotu limitu, která vyjadřuje velikost cache v MiB. Pokud tento soubor neexistuje, vytvoří se nový s výchozí hodnotou 256. Jde o měkký limit v tom smyslu, že cache bude promazána až po určité době. Dočasně tedy může velikost cache překročit stanovený limit. Zmíněnou periodu je možno nastavit prostřednictvím souboru cache_clean_interval_s umístěného opět v cache adresáři. Předpokládá se, že tento soubor obsahuje ASCII celé číslo vyjadřující časový interval pro promazávání cache v sekundách. Pokud tento soubor neexistuje, vytvoří se nový s výchozí hodnotou 300.BEZPEČNOST A OCHRANA SOUKROMÍ
Systemtap může být použit jako mocný administrativní nástroj. Může zpřístupnit privátní uživatelské informace v rámci interních jaderných struktur. To se netýká dyninst runtime, viz ALTERNATIVNÍ RUNTIME .OPRÁVNĚNÍ
Aby bylo možné spustit systemtap modul v rámci výchozí kernel runtime, musí uživatel splnit jednu z následujících podmínek:- •
- být root.
- •
- být členem skupin stapdev a stapusr
- •
- být členem skupin stapsys a stapusr ; nebo
- •
- být členem skupiny stapusr .
- •
- Modul byl podepsán kompilačním serverem "trusted signer", tj. systemtap kompilačním serverem, který podepsal modul klientovi, který použil volbu --privilege. Viz stap-server(8).
- •
- Modul byl sestaven s použitím jedné z voleb --privilege=stapsys nebo --privilege=stapusr.
- •
- Modul je umístěn v adresáři /lib/modules/VERSION/systemtap. Tento adresář musí být vlastněn uživatelem root a nesmí být otevřený pro zápis všem.
- •
- Modul byl podepsán kompilačním serverem "trusted signer", tj. systemtap kompilačním serverem, který podepsal modul klientovi, který použil volbu --privilege. Podrobnější informace viz stap-server(8).
- •
- Modul byl přeložen s volbou --privilege=stapusr.
SECUREBOOT
Pokud má systém v rámci UEFI firmware zapnutý SecureBoot, všechny jaderné moduly musejí být kryptograficky podepsány. (Některá jádra dovolují vypnout SecureBoot za běhu kombinací kláves SysRq-X. Poté nemusí být moduly podepsané.) Kompilační server systemtapu může podepisovat moduly klíčem MOK (Machine Owner Key) který sdílí s daným systémem. Pro více informací viz následující wiki:LIMITY NA ZDROJE
Mnoho omezení pro využívání prostředků systému se nachází ve formě maker ve vygenerovaném C kódu systemtap modulu. Ty lze předefinovat prostřednictvím přepínače -D. Seznam zmíněných maker:- MAXNESTING
- Maximální počet zanořených funkčních volání. Výchozí hodnota se určuje při analýze skriptu. Skripty založené na rekurzi obdrží 10 bonusových slotů.
- MAXSTRINGLEN
- Maximální délka řetězce. Výchozí hodnota je 128 znaků.
- MAXTRYLOCK
- Maximální počet iterací při čekání na uvolnění zámku na globální proměnné před tím, než se vyhlásí deadlock a sonda se přeskočí. Výchozí hodnota je 1000 iterací.
- MAXACTION
- Maximální počet příkazů, které mohou být vykonány během jednoho hitu sondy (s vypnutými přerušeními). Výchozí hodnota je 1000.
- MAXACTION_INTERRUPTIBLE
- Maximální počet příkazů, které mohou být vykonány během jedné aktivace (probe hit) sondy, která se provádí s povolenými přerušeními. (jako např. sondy begin a end). Výchozí hodnota je 10 * MAXACTION.
- MAXBACKTRACE
- Maximální počet zásobníkových rámců, které budou zpracovány při výpisu backtrace. Relevantní tapset je [u]context-unwind.stp, a výchozí hodnota je 20.
- MAXMAPENTRIES
- Maximální počet
řádků v každém jednom
globálním poli. Výchozí hodnota je 2048.
Jednotlivá pole mohou být deklarována s
odlišným limitem. Příklad:
global big[10000],little[5]
global big%
- MAXERRORS
- Maximální množství měkkých chyb, které ještě nezpůsobí ukončení skriptu. Výchozí hodnotou je 0, tedy skript skončí při první měkké chybě. Poznamenejme, že --suppress-handler-errors tento limit vypíná.
- MAXSKIPPED
- Maximální počet přeskočených sond, který ještě nevede k ukončení skriptu. Výchozí hodnotou je 100. Pozn., že systemtap lze spustit s přepínačem -t (timing), který zobrazí podrobnosti ohledně počtu přeskočených sond. Při použití -DINTERRUPTIBLE=1 se nebudou brát v potaz sondy přeskočené kvůli re-entranci. Dále poznamenejme, že --suppress-handler-errors vypíná i tento limit.
- MINSTACKSPACE
- Minimální množství volného místa na zásobníku jádra dostatečné pro start sondy. Výchozí hodnota 1024 bajtů. Tato hodnota by měla být dostačující pro vlastní potřebu obslužné rutiny včetně malé rezervy.
- MAXUPROBES
- Maximální množství současně zamčených uživatelských sond (uprobes). Výchozí hodnota je o něco málo vyšší, než počet uživatelských sond ve skriptu. Tato hodnota musí být relativně velká, protože jednotlivé uživatelské sondy (každá z nich okupuje přibližně 46 bajtů), se alokují pro každý proces a pro každou odpovídající sondu ve skriptu.
- STP_MAXMEMORY
- Maximální velikost paměti (v kilobajtech), kterou je systemtap modul oprávněn použít. Výchozí hodnota je neomezená. Limit zahrnuje velikost modulu samotného plus dodatečné alokace. Zahrnuty jsou jen přímé alokace provedené systemtap runtime. Nepřímé alokace, které provádějí např, "kprobes", "uprobes", atd., nejsou započteny.
- STP_OVEROAD_THRESHOLD, STP_OVERLOAD_INTERVAL
- Maximální počet cyklů, které lze strávit v sondách za daný čas (též vyjádřený v cyklech). Při překročení této podmínky dojde k přetížení a skript se zastaví. Výchozí hodnoty jsou 5e+8 a 1e+9, což odpovídá max. 50% povolenému vytížení.
- STP_PROCFS_BUFSIZE
- Velikost procfs bufferů pro čtení (v bajtech). Výchozí hodnota je MAXSTRINGLEN. Tento limit lze nastavit specificky pro jednotlivé sondy pomocí syntaxe .maxsize(MAXSIZE) .
NEPRIVILEGOVANÍ UŽIVATELÉ
Systemtap umožňuje přístup k interním datům jádra a tedy potenciálně k soukromým datům uživatele. Z tohoto důvodu je plný přístup k systemtapu omezen na uživatele root a na uživatele, kteří jsou členy skupin stapdev a stapusr.- •
- záměrném poškozování systému.
- •
- záměrném poškozování systému.
- •
- získání přístupu k neveřejným / soukromým informacím.
- •
- snižování výkonu procesů vlastněných jinými uživateli systému. Určitému vlivu na výkon celého systému nelze zabránit, neboť sondy neprivilegovaného uživatele budou v příslušný čas aktivní. Nicméně hlavním cílem zde je, aby neprivilegovaný uživatel nežádoucím nezpůsobem zasahoval do procesů jiných uživatelů.
OMEZENÍ NA SONDY
Člen skupin stapusr a stapsys má přístup ke všem sondám. Člen pouze skupiny stapusr může použít následující sondy:- •
- begin, begin(n)
- •
- end, end(n)
- •
- error(n)
- •
- never
- •
- process.*, s tím, že cílový proces je jeho vlastní.
- •
- timer.{jiffies,s,sec,ms,msec,us,usec,ns,nsec}(n)*
OMEZENÍ SKRIPTOVACÍHO JAZYKA
Následující vlastnosti skriptovacího jazyka jsou pro neprivilegovaného uživatele nedostupné:- •
- jakákoliv funkcionalita podmíněná guru režimem (-g).
- •
- vložený C kód.
RUNTIME OMEZENÍ
Neprivilegovaných uživatelů se týkají také následující omezení runtime:- •
- Lze použít jen výchozí runtime kód (viz -R).
- •
- Analýza procesů vlastněných jinými uživateli není dovolena.
- •
- Přístup do paměti jádra není dovolen ani pro zápis, ani pro čtení.
OMEZENÍ NA VOLBY PŘÍKAZOVÉ ŘÁDKY
Některé volby příkazové řádky poskytují přístup k funkcionalitě, která nesmí být přístupná žádnému neprivilegovanému uživateli. Konkrétně- •
- Nesmí nastavit -g .
- •
- Následující volby
nesmějí být použity klientem
kompilačního serveru:
-a, -B, -D, -I, -r, -R
OMEZENÍ NA PROMĚNNÉ PROSTŘEDÍ
Neprivilegovaní uživatelé nesmějí nastavit následující proměnné prostředí:SYSTEMTAP_RUNTIME SYSTEMTAP_TAPSET SYSTEMTAP_DEBUGINFO_PATH
OMEZENÍ NA TAPSETY
Obecně jsou tapset funkce přístupné členům skupiny stapusr pokud nepřistupují k informacím, které by neměl právo získat libovolný uživatelský program běžící s identitou daného uživatele.cpu:long () exit () str_replace:string (prnt_str:string, srch_str:string, rplc_str:string)
print_usyms (stk:string) user_int:long (addr:long) usymname:string (addr:long)
ALTERNATIVNÍ RUNTIME BACKENDY
Jak již bylo zmíněno, systemtap používá jako výchozí tzv. "kernel runtime backend", který pracuje na principu jaderného modulu. To přináší výše zmíněná bezpečnostní úskalí. Systemtap nově obsahuje dva prototypy nových "backendů", které lze aktivovat volbami --runtime=dyninst a --runtime=bpf.stap --runtime=dyninst -c "stap -V" \ -e "probe process.function("main") { println("hi from dyninst!") }"
# setsebool allow_execstack 1
NÁVRATOVÝ KÓD
V případě úspěšného běhu vrátí příkaz stap kód 0 (exit code). V opačném případě se na standardní chybový výstup může vypsat chybová hláška a stap vrátí nenulový kód. Pro zvýšení upovídanosti použijte -v nebo -vp N .ZASTARÁVÁNÍ
Během vývoje systemtapu dochází občas ve skriptovacím jazyce k nekompatibilním změnám, takže staré skripty mohou přestat fungovat. V takovém případě může pomoci volba --compatible VERSION kde se určí poslední známá verze systemtapu, se kterou daný skript fungoval.SOUBORY
- Důležité soubory a jim příslušné cesty dokumentuje manuálová stránka stappaths (7).
VIZ TAKÉ
stapprobes(3stap), function::*(3stap), probe::*(3stap), tapset::*(3stap), stappaths(7), staprun(8), stapdyn(8), systemtap(8), stapvars(3stap), stapex(3stap), stap-server(8), stap-prep(1), stapref(1), awk(1), gdb(1)