strace(1)
NAMN
strace — spåra systemanrop och signaler
SYNOPSIS
strace [-ACdffhikkqqrtttTvVwxxyyYzZ] [-a kolumn] [-b execve]
[-e uttryck]... [-I n] [-o fil] [-O overhead] [-p pid]...
[-P sökväg]... [-s strstorlek] [-S sortering] [-U kolumner]
[-X format] [--seccomp-bpf]
[--stack-trace-frame-limit=gräns] [--syscall-limit=gräns]
[--secontext[=format]] [--tips[=format]]
{ -p pid | [-DDD] [-E var[=värde]]... [-u användarnamn]
kommando [argument] }
strace -c [-dfwzZ] [-b execve] [-e uttryck]... [-I n] [-O overhead]
[-p pid]... [-P sökväg]... [-S sortering] [-U kolumner]
[--seccomp-bpf] [--syscall-limit=gräns] [--tips[=format]]
{ -p pid | [-DDD] [-E var[=värde]]... [-u användarnamn]
kommando [argument] }
strace --tips[=format]
BESKRIVNING
I sitt enklaste användningsfall kör strace det angivna kommandot tills det avslutas. Programmet fångar upp och registrerar de systemanrop som görs av en process samt de signaler som processen tar emot. Namnet på varje systemanrop, dess argument och dess returvärde skrivs till standard fel eller till den fil som anges med flaggan -o.
strace är ett användbart verktyg för diagnostik, utbildning och felsökning. Systemadministratörer, diagnostiker och felsökare har stor nytta av det när de ska lösa problem med program där källkoden inte är lättillgänglig, eftersom det inte krävs någon omkompilering för att spåra programmet. Studenter, hackare och nyfikna användare kan lära sig mycket om ett system och dess systemanrop genom att spåra även vanliga program. Programmerare kan använda verktyget eftersom systemanrop och signaler sker i gränssnittet mellan användarutrymme och kärna; en noggrann granskning av denna gräns är mycket användbar för att isolera fel, göra rimlighetskontroller och försöka fånga kapplöpningssituationer.
Varje rad i spårningen innehåller systemanropets namn, följt av dess argument inom parentes och dess returvärde. Ett exempel från spårning av kommandot:
cat /dev/null
är:
open("/dev/null", O_RDONLY) = 3
Fel anges normalt med returvärdet -1 och kompletteras med errno-symbolen och feltexten:
open("/foo/bar", O_RDONLY) = -1 ENOENT (No such file or directory)
Signaler skrivs ut som en signalsymbol och en avkodad siginfo-struktur. Ett utdrag från spårning och avbrott av kommandot:
sleep 666
är:
sigsuspend([] <unfinished ...>
--- SIGINT {si_signo=SIGINT, si_code=SI_USER, si_pid=...} ---
+++ killed by SIGINT +++
Om ett systemanrop håller på att köras samtidigt som ett annat anrop görs från en annan tråd eller process försöker strace bevara ordningen mellan dessa händelser och markerar det pågående anropet som unfinished. När anropet återvänder markeras det som resumed.
[pid 28772] select(4, [3], NULL, NULL, NULL <unfinished ...>
[pid 28779] clock_gettime(CLOCK_REALTIME, {tv_sec=1130322148, tv_nsec=3977000}) = 0
[pid 28772] <... select resumed> ) = 1 (in [3])
Avbrott av ett omstartbart systemanrop genom leverans av en signal hanteras på ett annat sätt, eftersom kärnan avslutar systemanropet och ordnar så att det omedelbart körs igen efter att signalhanteraren har slutförts.
read(0, 0x7ffff72cf5cf, 1) = ? ERESTARTSYS (To be restarted)
--- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} ---
rt_sigreturn({mask=[]}) = 0
read(0, "", 1) = 0
Argument skrivs ut i symbolisk form där det är möjligt. Följande exempel visar ett skal som utför utmatningsomdirigeringen:
>>xyzzy
open("xyzzy", O_WRONLY|O_APPEND|O_CREAT, 0666) = 3
Här avkodas det andra och tredje argumentet till open(2) genom att flaggargumentet delas upp i sina tre bitvis OR-kombinerade beståndsdelar, och lägesvärdet skrivs ut oktalt enligt tradition. Där traditionell eller inbyggd användning skiljer sig från ANSI eller POSIX föredras de senare formerna. I vissa fall har utdata från strace visat sig vara mer läsbar än själva källkoden.
Pekare till strukturer derefereras och deras medlemmar visas när det är lämpligt. I de flesta fall formateras argument på ett så C-liknande sätt som möjligt. Till exempel fångas kärnan i kommandot:
ls -l /dev/null
som:
lstat("/dev/null", {st_mode=S_IFCHR|0666, st_rdev=makedev(0x1, 0x3), ...}) = 0
Lägg märke till hur argumentet struct stat derefereras och hur varje medlem visas symboliskt. Observera särskilt hur medlemmen st_mode avkodas till en bitvis OR-kombination av symboliska och numeriska värden. Lägg också märke till att det första argumentet till lstat(2) i detta exempel är indata till systemanropet, medan det andra argumentet är utdata. Eftersom utdataargument inte ändras om systemanropet misslyckas kan argument inte alltid derefereras. Om exemplet med "ls -l" upprepas med en fil som inte finns fås exempelvis:
lstat("/foo/bar", 0xb004) = -1 ENOENT (No such file or directory)
I detta fall visas pekarens värde, eftersom strukturen den pekar på inte fylldes i på grund av felet.
Systemanrop som strace inte känner igen skrivs ut i råformat, med det hexadecimala systemanropsnumret föregånget av "syscall_":
syscall_0xbad(0x1, 0x2, 0x3, 0x4, 0x5, 0x6) = -1 ENOSYS (Function not implemented)
Teckenpekare derefereras och skrivs ut som C-strängar. Icke utskrivbara tecken i strängar representeras normalt med vanliga C-escape-sekvenser. Endast de första strsize byten av strängar skrivs ut, som standard 32 byte. Längre strängar får en ellips efter det avslutande citattecknet. Här är en rad från "ls -l" där biblioteksrutinen getpwuid(3) läser lösenordsfilen:
read(3, "root::0:0:System Administrator:/"..., 1024) = 422
Strukturer markeras med klammerparenteser, medan pekare till grundläggande typer och arrayer skrivs med hakparenteser och kommatecken mellan elementen. Här är ett exempel från kommandot id(1) på ett system med kompletterande grupp-ID:n:
getgroups(32, [100, 0]) = 2
Bitmängder visas också med hakparenteser, men elementen separeras endast med mellanslag. Här förbereder skalet körning av ett externt kommando:
sigprocmask(SIG_BLOCK, [CHLD TTOU], []) = 0
Här är det andra argumentet en bitmängd med två signaler, SIGCHLD och SIGTTOU. I vissa fall är bitmängden så full att det är mer värdefullt att skriva ut de element som inte är satta. Då föregås bitmängden av ett tilde-tecken:
sigprocmask(SIG_UNBLOCK, ~[], NULL) = 0
Här representerar det andra argumentet den fulla mängden av alla signaler.
FLAGGOR
Allmänt
-e uttryck
Ändrar vilka händelser som ska spåras eller hur de ska spåras genom att ange ett kvalificerande uttryck. Uttryckets format är:
[kvalificerare=][!]värde[,värde]...
där kvalificerare är en av:
trace t trace-fds trace-fd fd fds abbrev a verbose v raw x signal signals s read reads r write writes w fault inject status quiet silent silence q secontext decode-fds decode-fd decode-pids decode-pid kvm
och värde är en symbol eller ett tal som beror på kvalificeraren. Standardkvalificeraren är trace. Ett utropstecken negerar mängden värden. Till exempel är:
-e open
likvärdigt med:
-e trace=open
vilket betyder att endast systemanropet open spåras. Däremot betyder:
-e trace=!open
att alla systemanrop utom open spåras. Dessutom kan specialvärdena all och none användas för att spåra alla respektive inga händelser.
Observera att vissa skal använder utropstecken för historikexpansion även inom citerade argument. I sådana fall måste utropstecknet escapats med omvänt snedstreck.
Start
-E var=värde --env=var=värde
Kör kommandot med miljövariabeln var=värde satt vid körning.
-E var --env=var
Tar bort var från de ärvda miljövariablerna innan kommandot körs.
-p pid --attach=pid
Ansluter till processen med process-ID pid och börjar spåra den. Spårningen kan avbrytas när som helst med en tangentbordsavbrottssignal, exempelvis CTRL-C. strace svarar då genom att koppla loss sig från de spårade processerna och låta dem fortsätta köra.
Flera -p-flaggor kan användas för att ansluta till flera processer utöver kommandot, vilket är valfritt om minst en -p-flagga anges.
En enskild -p-flagga kan ta emot flera process-ID:n separerade med komma, mellanslag, tabulator eller nyrad. Därför stöds syntaxer som:
-p "$(pidof PROG)" -p "$(pgrep PROG)"
-u användarnamn --user=användarnamn
Kör kommandot med användar-ID, grupp-ID och kompletterande grupper för användarnamn. Denna flagga är endast användbar när den körs som root, eftersom den gör det möjligt att köra setuid- och/eller setgid-binärer korrekt. Om denna flagga inte används körs setuid- och setgid-program utan sina effektiva privilegier.
-u UID:GID --user=UID:GID
Alternativ syntax där programmet startas med exakt angivna användar- och grupp-ID:n och med en tom lista över kompletterande grupper. I detta fall görs inga uppslagningar av användar- eller gruppnamn.
--argv0=namn
Sätter det körda kommandots argv[0] till namn. Detta är användbart för att spåra flerfunktionsprogram som tolkar argv[0], till exempel busybox eller kmod.
Spårning
-b systemanrop --detach-on=systemanrop
Kopplar loss från den spårade processen om det angivna systemanropet nås. För närvarande stöds endast nyckelordet execve, vilket omfattar systemanropen execve(2) och execveat(2). Flaggan är användbar när man spårar en flertrådad process med -f utan att även spåra dess potentiellt mycket komplexa barnprocesser.
-D --daemonize --daemonize=grandchild
Kör spårarprocessen som barnbarn till den spårade processen, inte som dess förälder. Detta minskar den synliga effekten av strace genom att hålla den spårade processen som ett direkt barn till den anropande processen.
-DD --daemonize=pgroup --daemonize=pgrp
Kör spårarprocessen som barnbarn till den spårade processen i en separat processgrupp. Förutom att minska den synliga effekten av strace förhindrar detta också att strace avslutas av en kill(2)-signal som skickas till hela processgruppen.
-DDD --daemonize=session
Kör spårarprocessen som barnbarn till den spårade processen i en separat session, även kallat "äkta daemonisering". Förutom att minska den synliga effekten av strace förhindrar detta också att strace avslutas när sessionen avslutas.
-f --follow-forks
Spårar barnprocesser när de skapas av redan spårade processer som resultat av systemanropen fork(2), vfork(2) och clone(2). Observera att om processen PID är flertrådad kommer -f -p PID att ansluta till alla dess trådar, inte bara den där thread_id = PID.
--output-separately
Om flaggan --output=filnamn används skrivs spårningen för varje process till en separat fil med namnet:
filnamn.pid
där pid är process-ID:t.
-ff --follow-forks --output-separately
Kombinerar effekterna av --follow-forks och --output-separately. Detta är inte kompatibelt med -c, eftersom inga räknare per process sparas.
Använd strace-log-merge(1) för att få en sammanslagen vy över loggfilerna.
-I avbrytbarhet --interruptible=avbrytbarhet
Styr när strace kan avbrytas av signaler, exempelvis genom att trycka CTRL-C.
1, anywhere
Inga signaler blockeras.
2, waiting
Fatala signaler blockeras medan systemanrop avkodas. Detta är standard.
3, never
Fatala signaler blockeras alltid. Detta är standard om -o FIL PROG används.
4, never_tstp
Fatala signaler och SIGTSTP (CTRL-Z) blockeras alltid. Detta är användbart för att göra att:
strace -o FIL PROG
inte stoppas av CTRL-Z. Detta är standard om -D används.
--syscall-limit=gräns
Kopplar loss alla spårade processer efter att gräns systemanrop har fångats. Systemanrop som filtreras bort med --trace, --trace-path eller --status räknas inte när antalet fångade systemanrop följs.
--kill-on-exit
Använder ptrace-flaggan PTRACE_O_EXITKILL på alla spårade processer, vilket skickar signalen SIGKILL till en spårad process om spåraren avslutas. Detta förhindrar att spårade processer lämnas kvar när spåraren avslutas, eftersom de inte kopplas loss vid städning. --kill-on-exit är inte kompatibel med -p eller --attach.
Filtrering
-e trace=systemanropsmängd -e t=systemanropsmängd --trace=systemanropsmängd
Spårar endast den angivna mängden systemanrop. systemanropsmängd definieras som:
[!]värde[,värde]
och värde kan vara ett av följande:
systemanrop
Spårar ett specifikt systemanrop, angivet med namn. Se syscalls(2) som referens, men se även avsnittet NOTERINGAR.
? värde
Ett frågetecken före kvalificeringen undertrycker fel om inga matchande systemanrop hittas.
värde@64
Begränsar systemanropsspecifikationen som beskrivs av värde till 64-bitars personligheten.
värde@32
Begränsar systemanropsspecifikationen som beskrivs av värde till 32-bitars personligheten.
värde@x32
Begränsar systemanropsspecifikationen som beskrivs av värde till x32-personligheten.
all
Spårar alla systemanrop.
/ regex
Spårar endast de systemanrop som matchar regex. POSIX Extended Regular Expression-syntax kan användas, se regex(7).
%file file
Spårar alla systemanrop som tar ett filnamn som argument. Detta kan ses som en förkortning för ungefär:
--trace=open,stat,chmod,unlink,...
vilket är användbart för att se vilka filer processen refererar till. Dessutom säkerställer förkortningen att man inte råkar glömma ett anrop som newfstatat(2). Syntaxen utan föregående procenttecken, alltså:
--trace=file
är föråldrad.
%process process
Spårar systemanrop som hör ihop med processers livscykel, exempelvis skapande, exec och avslutning. Syntaxen utan föregående procenttecken är föråldrad.
%net %network network
Spårar alla nätverksrelaterade systemanrop. Syntaxen utan föregående procenttecken är föråldrad.
%signal signal
Spårar alla signalrelaterade systemanrop. Syntaxen utan föregående procenttecken är föråldrad.
%ipc ipc
Spårar alla IPC-relaterade systemanrop. Syntaxen utan föregående procenttecken är föråldrad.
%desc desc
Spårar alla systemanrop som är relaterade till filbeskrivare. Syntaxen utan föregående procenttecken är föråldrad.
%memory memory
Spårar alla systemanrop som är relaterade till minnesmappning. Syntaxen utan föregående procenttecken är föråldrad.
%creds
Spårar systemanrop som läser eller ändrar användar- och gruppidentifierare eller capability-mängder.
%stat
Spårar varianter av stat-systemanrop.
%lstat
Spårar varianter av lstat-systemanrop.
%fstat
Spårar varianter av fstat-, fstatat- och statx-systemanrop.
%%stat
Spårar systemanrop som används för att begära filstatus: stat, lstat, fstat, fstatat, statx och deras varianter.
%statfs
Spårar systemanropen statfs, statfs64, statvfs, osf_statfs och osf_statfs64. Samma effekt kan uppnås med det reguljära uttrycket:
--trace=/^(.*_)?statv?fs
%fstatfs
Spårar systemanropen fstatfs, fstatfs64, fstatvfs, osf_fstatfs och osf_fstatfs64. Samma effekt kan uppnås med:
--trace=/fstatv?fs
%%statfs
Spårar systemanrop relaterade till filsystemstatistik, inklusive statfs-liknande, fstatfs-liknande och ustat. Samma effekt kan uppnås med:
--trace=/statv?fs|fsstat|ustat
%clock
Spårar systemanrop som läser eller ändrar systemklockor.
%pure
Spårar systemanrop som alltid lyckas och saknar argument. För närvarande omfattar listan bland annat:
arc_gettls(2) getdtablesize(2) getegid(2) getegid32(2) geteuid(2) geteuid32(2) getgid(2) getgid32(2) getpagesize(2) getpgrp(2) getpid(2) getppid(2) get_thread_area(2) gettid(2) get_tls(2) getuid(2) getuid32(2) getxgid(2) getxpid(2) getxuid(2) kern_features(2) metag_get_tls(2)
Flaggan -c är användbar för att avgöra vilka systemanrop som kan vara värda att spåra. Exempel:
--trace=open,close,read,write
betyder att endast dessa fyra systemanrop spåras. Var försiktig när du drar slutsatser om gränsen mellan användare och kärna om endast en delmängd systemanrop övervakas. Standard är:
--trace=all
-e trace-fd=mängd -e trace-fds=mängd -e fd=mängd -e fds=mängd --trace-fds=mängd
Spårar endast systemanrop som arbetar med den angivna delmängden icke-negativa filbeskrivare. Observera att denna flagga även filtrerar bort alla systemanrop som inte alls arbetar med filbeskrivare.
Detta filter kombineras med filtret --trace-path. Ett systemanrop spåras om det matchar något av filtren.
-e signal=mängd -e signals=mängd -e s=mängd --signal=mängd
Spårar endast den angivna delmängden signaler. Standard är:
--signal=all
Exempel:
--signal=!SIGIO --signal=!io
gör att SIGIO-signaler inte spåras.
-e status=mängd --status=mängd
Skriver endast ut systemanrop med den angivna returstatusen. Standard är:
--status=all
När kvalificeraren status används kanske den kronologiska ordningen mellan händelser inte bevaras. Detta beror på att strace måste vänta tills ett systemanrop är färdigt innan det kan avgöra om det ska skrivas ut.
mängd kan innehålla följande element:
successful
Spårar systemanrop som returnerade utan felkod. Flaggan -z har effekten:
--status=successful
failed
Spårar systemanrop som returnerade med en felkod. Flaggan -Z har effekten:
--status=failed
unfinished
Spårar systemanrop som inte returnerade. Detta kan till exempel hända på grund av ett execve-anrop i en annan tråd i samma trådgrupp.
unavailable
Spårar systemanrop som returnerade, men där strace misslyckades med att hämta felstatusen.
detached
Spårar systemanrop där strace kopplade loss innan retur.
-P sökväg --trace-path=sökväg
Spårar endast systemanrop som använder sökväg. Flera -P-flaggor kan användas för att ange flera sökvägar. Detta filter kombineras med filtret --trace-fds; ett systemanrop spåras om det matchar något av dem.
-z --successful-only
Skriver endast ut systemanrop som returnerade utan felkod.
-Z --failed-only
Skriver endast ut systemanrop som returnerade med felkod.
Utdataformat
-a kolumn --columns=kolumn
Justerar returvärden till en viss kolumn. Standard är kolumn 40.
-e abbrev=systemanropsmängd -e a=systemanropsmängd --abbrev=systemanropsmängd
Förkortar utdata genom att inte skriva ut varje medlem i stora strukturer. Syntaxen för systemanropsmängd är densamma som för --trace. Standard är:
--abbrev=all
Flaggan -v har effekten:
--abbrev=none
-e verbose=systemanropsmängd -e v=systemanropsmängd --verbose=systemanropsmängd
Derefererar strukturer för den angivna mängden systemanrop. Syntaxen är densamma som för --trace. Standard är:
--verbose=all
-e raw=systemanropsmängd -e x=systemanropsmängd --raw=systemanropsmängd
Skriver ut råa, oavkodade argument för den angivna mängden systemanrop. Syntaxen är densamma som för --trace. Flaggan gör att alla argument skrivs ut hexadecimalt. Detta är användbart om avkodningen inte är betrodd, eller om det faktiska numeriska värdet på ett argument behövs. Se även flaggan -X raw.
-e read=mängd -e reads=mängd -e r=mängd --read=mängd
Gör en fullständig hexadecimal och ASCII-dump av all data som läses från filbeskrivarna i den angivna mängden. Exempel:
--read=3,5
visar all indataaktivitet på filbeskrivarna 3 och 5. Detta är oberoende av den normala spårningen av systemanropet read(2), som styrs av:
--trace=read
-e write=mängd -e writes=mängd -e w=mängd --write=mängd
Gör en fullständig hexadecimal och ASCII-dump av all data som skrivs till filbeskrivarna i den angivna mängden. Exempel:
--write=3,5
visar all utdataaktivitet på filbeskrivarna 3 och 5. Detta är oberoende av den normala spårningen av systemanropet write(2), som styrs av:
--trace=write
-e quiet=mängd -e silent=mängd -e silence=mängd -e q=mängd --quiet=mängd --silent=mängd --silence=mängd
Undertrycker olika informationsmeddelanden. Standard är:
--quiet=none
mängd kan innehålla följande element:
attach
Undertrycker meddelanden om anslutning och frånkoppling, exempelvis:
[ Process NNNN attached ] [ Process NNNN detached ]
exit
Undertrycker meddelanden om processavslutning, exempelvis:
+++ exited with SSS +++
path-resolution
Undertrycker meddelanden om upplösning av sökvägar som anges med -P.
personality
Undertrycker meddelanden om ändringar av processens personlighet.
thread-execve superseded
Undertrycker meddelanden om att en process ersätts av execve(2) i en annan tråd.
-e decode-fds=mängd --decode-fds=mängd
Avkodar olika information som hör ihop med filbeskrivare. Standard är:
--decode-fds=none
mängd kan innehålla följande element:
path
Skriver ut filsökvägar. Aktiverar även utskrift av den spårade processens aktuella arbetskatalog när konstanten AT_FDCWD används.
socket
Skriver ut protokollspecifik information för socketar.
dev
Skriver ut tecken- och blockenhetsnummer.
eventfd
Skriver ut detaljer om eventfd-objekt kopplade till eventfd-filbeskrivare.
pidfd
Skriver ut PID:er kopplade till pidfd-filbeskrivare.
signalfd
Skriver ut signalmasker kopplade till signalfd-filbeskrivare.
-e decode-pids=mängd --decode-pids=mängd
Avkodar olika information som hör ihop med process-ID:n, och även tråd-ID:n, processgrupp-ID:n och sessions-ID:n. Standard är:
--decode-pids=none
mängd kan innehålla följande element:
comm
Skriver ut kommandonamn kopplade till tråd- eller process-ID:n.
pidns
Skriver ut tråd-, process-, processgrupps- och sessions-ID:n i straces PID-namnrymd om den spårade processen finns i en annan PID-namnrymd.
-e kvm=vcpu|vcpu+ --kvm=vcpu|vcpu+
Skriver ut avslutningsorsaken för kvm vcpu, eller hela strukturen kvm_run inklusive orsaken om vcpu+ används. Kräver Linuxkärna 4.16.0 eller senare.
Utdata för vcpu+ använder prefixen:
VCPU:CPU#< VCPU:CPU#>
Rader som börjar med det första prefixet visar strukturens tillstånd före anropet av KVM_RUN, medan rader som börjar med det andra visar tillståndet efter anropet av KVM_RUN.
-e namespace=new --namespace=new
Skriver ut de nya namnrymder som den spårade processen går in i. Följande systemanrop stöds:
clone(2) clone3(2) setns(2) unshare(2)
-i --instruction-pointer
Skriver ut instruktionspekaren vid tidpunkten för systemanropet.
-n --syscall-number
Skriver ut systemanropsnumret.
-N --arg-names
Skriver ut systemanropens argumentnamn.
-k --stack-trace[=symbol]
Skriver ut exekveringsstacken för de spårade processerna efter varje systemanrop.
-kk --stack-trace=source
Skriver ut exekveringsstacken och källkodsinformation för de spårade processerna efter varje systemanrop. Denna flagga förutsätter att målprogrammet har kompilerats med lämpliga debugflaggor, exempelvis:
-g
för gcc, eller:
-g -gdwarf-aranges
för clang.
--stack-trace-frame-limit=gräns
Skriver ut högst detta antal stackramar vid backtrace av ett systemanrop. Standard är 256. Använd denna flagga tillsammans med --stack-trace eller -k.
-o filnamn --output=filnamn
Skriver spårningsutdata till filen filnamn i stället för till stderr. Formen:
filnamn.pid
används om -ff anges. Om argumentet börjar med | eller ! behandlas resten av argumentet som ett kommando, och all utdata skickas via pipe till detta kommando. Detta är praktiskt för att skicka felsökningsutdata till ett program utan att påverka omdirigeringarna för de körda programmen. Att skicka utdata via pipe till ett kommando är för närvarande inte kompatibelt med -ff.
-A --output-append-mode
Öppnar filen som anges med -o i append-läge.
-q --quiet --quiet=attach,personality
Undertrycker meddelanden om anslutning, frånkoppling och personlighetsändringar. Detta sker automatiskt när utdata omdirigeras till en fil och kommandot körs direkt i stället för att anslutas till.
-qq --quiet=attach,personality,exit
Undertrycker meddelanden om anslutning, frånkoppling, personlighetsändringar och processers slutstatus.
-qqq --quiet=all
Undertrycker alla meddelanden som kan undertryckas.
-r --relative-timestamps[=precision]
Skriver en relativ tidsstämpel vid inträde i varje systemanrop. Detta registrerar tidsskillnaden mellan början av efterföljande systemanrop. precision kan vara:
s ms us ns
för sekunder, millisekunder, mikrosekunder eller nanosekunder. Standard är us. Observera att eftersom -r använder den monotona klockan kan dess mätningar skilja sig från tidsskillnader som rapporteras av -t, som använder väggklockan.
-s strstorlek --string-limit=strstorlek
Anger maximal strängstorlek som ska skrivas ut. Standard är 32. Observera att filnamn inte betraktas som strängar och alltid skrivs ut i sin helhet.
--absolute-timestamps[=[[format:]format],[[precision:]precision]] --timestamps[=[[format:]format],[[precision:]precision]]
Prefixar varje rad i spårningen med väggklockans tid i angivet format och med angiven precision. format kan vara ett av följande:
none
Ingen tidsstämpel skrivs ut. Kan användas för att åsidosätta en tidigare inställning.
time
Väggklocketid. Formatsträngen för strftime(3) är %T.
unix
Antal sekunder sedan epoken. Formatsträngen för strftime(3) är %s.
precision kan vara:
s ms us ns
Standardargumenten är:
format:time,precision:s
-t --absolute-timestamps
Prefixar varje rad i spårningen med väggklockans tid.
-tt --absolute-timestamps=precision:us
Skriver väggklockans tid med mikrosekundprecision.
-ttt --absolute-timestamps=format:unix,precision:us
Skriver väggklockans tid som sekunder sedan epoken, med mikrosekundprecision.
-T --syscall-times[=precision]
Visar tiden som spenderas i systemanrop. Detta registrerar tidsskillnaden mellan början och slutet av varje systemanrop. precision kan vara:
s ms us ns
Standard är us.
-v --no-abbrev
Skriver ut oförkortade versioner av anrop som rör miljö, stat, termios med mera. Dessa strukturer är mycket vanliga, så standardbeteendet är att visa en rimlig delmängd av deras medlemmar. Använd denna flagga för att se alla medlemmar i full detalj.
--strings-in-hex[=alternativ]
Styr användningen av hexadecimala escape-sekvenser när strängar skrivs ut. Flaggan ändrar standardbeteendet för escape-sekvenser.
Normalt, när varken denna flagga eller -x används, inför strace escape-sekvenser i två situationer: för att representera icke utskrivbara och icke-ASCII-tecken, alltså tecken med teckenkoder under 32 eller över 127, eller för att göra utdata entydig, till exempel genom att escap:a citattecken som omger en sträng eller vinkelparenteser som används i filbeskrivarsökvägar.
När ett tecken måste escap:as prioriterar strace symboliska C-standardsekvenser om sådana finns:
\t \n \v \f \r
För andra tecken som behöver escap:as används normalt oktal representation av tecknets bytevärde. Denna flagga gör det möjligt att använda hexadecimala escape-sekvenser i stället.
alternativ kan vara ett av följande:
none
Hexadecimala tal används inte alls i utdata. När en escape-sekvens behövs används oktala tal.
non-ascii-chars
Hexadecimala tal används i stället för oktala i escape-sekvenserna.
non-ascii
Strängar som innehåller icke-ASCII-tecken skrivs ut med escape-sekvenser med hexadecimala tal.
all
Alla strängar skrivs ut med escape-sekvenser med hexadecimala tal.
När flaggan anges utan argument antas all.
-x --strings-in-hex=non-ascii
Skriver ut alla icke-ASCII-strängar i hexadecimalt strängformat.
-xx --strings-in-hex[=all]
Skriver ut alla strängar i hexadecimalt strängformat.
-X format --const-print-style=format
Anger formatet för utskrift av namngivna konstanter och flaggor. Stödda värden är:
raw
Rå numerisk utdata utan avkodning.
abbrev
Skriver ut en namngiven konstant eller en mängd flaggor i stället för det råa talet om de hittas. Detta är standardbeteendet för strace.
verbose
Skriver ut både råvärdet och den avkodade strängen som en kommentar.
-y --decode-fds --decode-fds=path
Skriver ut sökvägar kopplade till filbeskrivarargument och till konstanten AT_FDCWD.
-yy --decode-fds=all
Skriver ut all tillgänglig information kopplad till filbeskrivare: protokollspecifik information för socket-filbeskrivare, block- eller teckenenhetsnummer för enhetsfilbeskrivare och PID:er kopplade till pidfd-filbeskrivare.
--pidns-translation --decode-pids=pidns
Om strace och den spårade processen finns i olika PID-namnrymder skrivs PID:er även ut i straces namnrymd.
-Y --decode-pids=comm
Skriver ut kommandonamn för PID:er.
--secontext[=format] -e secontext=format
När SELinux är tillgängligt och inte avstängt skriver detta ut SELinux-kontexter för processer, filer och filbeskrivare inom hakparenteser. Argumentet format är en kommaseparerad lista med följande element:
full
Skriver ut hela kontexten: användare, roll, typ, nivå och kategori.
mismatch
Skriver även ut den kontext som finns registrerad i SELinux-databasen om den aktuella kontexten skiljer sig. Den senare skrivs ut efter två utropstecken:
!!
Standardvärdet för --secontext är:
!full,mismatch
vilket endast skriver ut typen i stället för full kontext och inte kontrollerar kontextavvikelser.
--always-show-pid
Visar PID-prefix även för processen som startades av strace. Detta är underförstått när både -f och -o anges.
Statistik
-c --summary-only
Räknar tid, anrop och fel för varje systemanrop och rapporterar en sammanfattning när programmet avslutas, samtidigt som vanlig utdata undertrycks. Detta visar systemtid, alltså CPU-tid spenderad i kärnan, vilket är oberoende av väggklocketid. Om -c används med -f sparas endast sammanlagda totaler för alla spårade processer.
-C --summary
Som -c, men skriver även ut vanlig utdata medan processerna kör.
-O overhead --summary-syscall-overhead=overhead
Anger overhead för spårning av systemanrop till overhead. Detta är användbart för att åsidosätta standardheuristiken, som uppskattar tiden som spenderas i själva mätprocessen när systemanrop tidsmäts med -c. Noggrannheten i heuristiken kan bedömas genom att tidsmäta ett visst program utan spårning med time(1) och jämföra den ackumulerade systemanropstiden med totalen som produceras med -c.
Formatet för overhead beskrivs i avsnittet Formatbeskrivning för tidsangivelser.
-S sortering --summary-sort-by=sortering
Sorterar histogramutdata som skrivs ut av -c enligt angivet kriterium. Giltiga värden är bland annat:
time time-percent time-total total-time min-time shortest time-min max-time longest time-max avg-time time-avg calls count errors error name syscall syscall-name nothing none
Standard är time.
-U kolumner --summary-columns=kolumner
Konfigurerar vilka kolumner som visas i anropssammanfattningen och i vilken ordning. Argumentet kolumner är en kommaseparerad lista med ett eller flera av följande värden:
time-percent eller time
Procentandel av den kumulativa tiden som förbrukades av ett visst systemanrop.
total-time eller time-total
Total systemtid, eller väggklocketid om -w används, som förbrukades av ett visst systemanrop.
min-time, shortest eller time-min
Kortaste observerade anropstid.
max-time, longest eller time-max
Längsta observerade anropstid.
avg-time eller time-avg
Genomsnittlig anropstid.
calls eller count
Antal anrop.
errors eller error
Antal fel.
name, syscall eller syscall-name
Systemanropets namn.
Standardvärdet är:
time-percent,total-time,avg-time,calls,errors,name
Om fältet name inte uttryckligen anges läggs det till som sista kolumn.
-w --summary-wall-clock
Sammanfattar väggklocketiden för varje systemanrop, mätt från dess början till dess slut. Standard är att sammanfatta systemtid.
Manipulering
--inject=systemanropsmängd[:error=errno|:retval=värde][:signal=sig][:syscall=systemanrop][:delay_enter=fördröjning][:delay_exit=fördröjning][:poke_enter=@argN=DATA,@argM=DATA...][:poke_exit=@argN=DATA,@argM=DATA...][:when=uttryck]
Utför manipulering av systemanrop för den angivna mängden systemanrop.
Syntaxen för systemanropsmängd är densamma som för flaggan --trace.
Minst en av åtgärderna error, retval, signal, delay_enter, delay_exit, poke_enter eller poke_exit måste anges. error och retval är ömsesidigt uteslutande.
Om error=errno anges injiceras ett fel i systemanropet. Detta görs genom att systemanropsnumret ersätts med -1, vilket representerar ett ogiltigt systemanrop, och felkoden sätts till angivet errno. Detta beteende kan åsidosättas med syscall=. errno kan vara ett symboliskt namn som ENOSYS eller ett numeriskt värde i intervallet 1..4095.
Om retval=värde anges injiceras ett lyckat returvärde. Systemanropsnumret ersätts på samma sätt som med error=, men i stället för ett fel returneras det angivna lyckade värdet till den anropande processen.
Om signal=sig anges med antingen ett symboliskt värde som SIGSEGV eller ett numeriskt värde inom intervallet 1..SIGRTMAX, levereras signalen vid inträde i varje systemanrop i den angivna systemanropsmängden.
Om delay_enter=fördröjning eller delay_exit=fördröjning anges utförs fördröjningsinjektion: den spårade processen fördröjs med den angivna tidsperioden vid inträde i respektive utträde ur systemanropet. Formatet för fördröjning beskrivs i avsnittet Formatbeskrivning för tidsangivelser.
Om poke_enter eller poke_exit anges skrivs minne i den spårade processen över vid platser som pekas ut av systemanropsargumenten argN och argM, från arg1 till arg7. Data anges i hexadecimalt format, exempelvis:
poke_enter=@arg1=0000DEAD0000BEEF
poke_enter ändrar minnet vid inträde i systemanropet, medan poke_exit gör det vid utträde.
Injektionsåtgärderna är oberoende. Exempelvis levererar enbart signal= en signal utan att ändra systemanropets resultat eller fördröja det. På motsvarande sätt injicerar enbart error= ett systemanropsfel utan att lägga till signal eller fördröjning.
Om signal= anges tillsammans med error= eller retval= utförs både fel- eller returvärdesinjektion och signalleverans.
Om syscall=systemanrop anges injiceras det angivna systemanropet i stället för standardvärdet -1. Det angivna systemanropet måste sakna sidoeffekter. För närvarande stöds endast systemanrop från mängden %pure.
Om inte underuttrycket when= anges görs injektion i varje anrop av varje systemanrop i systemanropsmängden.
Formatet för underuttrycket är:
första[..sista][+[steg]]
första är det första anropsnumret i intervallet, sista är det sista anropsnumret i intervallet och steg är steget mellan två efterföljande anrop. Följande kombinationer är användbara:
första
Injicerar endast i anrop nummer första för varje systemanrop i mängden.
första.. sista
Injicerar i anrop från första till och med sista för varje systemanrop i mängden.
första +
Injicerar i varje anrop med början vid nummer första för varje systemanrop i mängden.
första + steg
Injicerar i anrop nummer första, första+steg, första+steg+steg och så vidare.
första.. sista + steg
Samma som föregående, men endast anrop med nummer upp till och med sista beaktas.
Exempel: för att få vart tredje och efterföljande chdir-systemanrop att misslyckas med ENOENT, använd:
--inject=chdir:error=ENOENT:when=3+
Det giltiga intervallet för talen första och steg är 1..65535, och för sista är det 1..65534.
Ett injektionsuttryck kan innehålla högst en fel- eller returvärdesspecifikation, alltså antingen error= eller retval=, och högst en signal=-specifikation. Om ett injektionsuttryck innehåller flera when=-specifikationer gäller den sista.
Redovisningen av systemanrop som omfattas av injektion görs per systemanrop och per spårad process.
Systemanropsinjektion kan kombineras med andra systemanropsfilter. Exempel:
-P /dev/urandom --inject=file:error=ENOENT
-e inject=argument
Detta är likvärdigt med:
--inject=argument
--fault=systemanropsmängd[:error=errno][:when=uttryck]
Utför systemanropsfelinjektion för den angivna mängden systemanrop.
Detta är en genväg för den mer generella flaggan --inject=, med standardvärdet ENOSYS för errno.
-e fault=argument
Detta är likvärdigt med:
--fault=argument
Övrigt
-d --debug
Visar viss felsökningsutdata från strace självt på standard fel.
-F
Denna flagga är föråldrad. Den finns kvar endast för bakåtkompatibilitet och kan komma att tas bort i framtida versioner. Flera -F-flaggor motsvarar en enda -f. Flaggan ignoreras helt om den används tillsammans med en eller flera -f-flaggor.
-h --help
Skriver ut en hjälpsammanfattning.
--seccomp-bpf
Försöker använda seccomp-bpf, se seccomp(2), för att få kärnan att stoppa den spårade processen endast för de systemanrop som faktiskt spåras.
Flaggan har ingen effekt om inte -f eller --follow-forks också anges. --seccomp-bpf är inte kompatibel med --syscall-limit eller -b/--detach-on. Den kan inte heller användas på processer som ansluts med -p/--attach.
Ett försök att aktivera systemanropsfiltrering med seccomp-bpf kan misslyckas av flera skäl, till exempel om det finns för många systemanrop att filtrera, om seccomp-API:t inte är tillgängligt eller om strace självt spåras. Om uppsättningen av seccomp-bpf-filter misslyckas fortsätter strace som vanligt och stoppar spårade processer vid varje systemanrop.
När --seccomp-bpf aktiveras och -p/--attach inte används aktiveras även --kill-on-exit.
Observera att om den spårade processen har ett annat seccomp-filter som returnerar ett åtgärdsvärde med högre prioritet än SECCOMP_RET_TRACE, kommer strace --seccomp-bpf inte att meddelas. Det betyder att om ett annat seccomp-filter exempelvis inaktiverar systemanropet eller dödar den spårade processen, kommer strace --seccomp-bpf inte alls känna till detta systemanropsförsök.
--tips[=[[id:]id],[[format:]format]]
Visar strace-tips, trick och justeringar innan programmet avslutas. id kan vara ett icke-negativt heltal för att skriva ut ett specifikt tips. Observera att dessa ID:n inte garanteras vara stabila. Det kan också vara random, vilket är standard, och då skrivs ett slumpmässigt tips ut.
format kan vara ett av följande:
none
Inget tips skrivs ut. Kan användas för att åsidosätta en tidigare inställning.
compact
Skriver ut tipset precis så stort att all text får plats.
full
Skriver ut tipset i full form.
Standard är:
id:random,format:compact
-V --version
Skriver ut versionsnumret för strace och listan över aktiverade valfria funktioner.
Formatbeskrivning för tidsangivelser
Tidsvärden anges som decimala flyttal i ett format som accepteras av strtod(3), eventuellt följda av ett suffix som anger tidsenheten:
s
Sekunder.
ms
Millisekunder.
us
Mikrosekunder.
ns
Nanosekunder.
Om inget suffix anges används mikrosekunder som standard.
Det beskrivna formatet används för flaggorna -O, --inject=delay_enter och --inject=delay_exit.
DIAGNOSTIK
När kommandot avslutas avslutas strace med samma slutstatus. Om kommandot avslutas av en signal avslutar strace sig självt med samma signal, så att strace kan användas som en transparent omslagsprocess för den anropande föräldraprocessen. Observera att förälder-barn-relationen, exempelvis signalstoppmeddelanden och värdet från getppid(2), mellan den spårade processen och dess förälder inte bevaras om inte -D används.
När -p används utan något kommando är slutstatusen för strace noll, om inte inga processer kunde anslutas eller ett oväntat fel inträffade under spårningen.
SETUID-INSTALLATION
Om strace installeras setuid till root kan den anropande användaren ansluta till och spåra processer som ägs av vilken användare som helst. Dessutom kommer setuid- och setgid-program att köras och spåras med korrekta effektiva privilegier.
Eftersom dessa möjligheter endast bör ges till användare med fullständiga root-privilegier är det endast lämpligt att installera strace som setuid till root när användningen begränsas till sådana betrodda användare. Till exempel kan en särskild version av strace installeras med läget:
rwsr-x---
ägare:
root
och grupp:
trace
I denna konfiguration kan endast betrodda användare som är medlemmar i gruppen trace köra programmet. Om denna funktion används bör även en vanlig, icke-setuid-version av strace installeras för vanliga användare.
STÖD FÖR FLERA PERSONLIGHETER
På vissa arkitekturer kan strace avkoda systemanrop för processer som använder ett annat Application Binary Interface, ABI, än det som strace självt använder. Förutom att avkoda den inbyggda ABI:n kan strace avkoda följande ABI:er på följande arkitekturer:
| Arkitektur |
[1] När strace byggs som ett x86_64-program. [2] När strace byggs som ett x32-program. [3] Endast big endian. Detta stöd är valfritt och beror på förmågan att generera och tolka strukturdefinitioner vid byggtid. Se utdata från: strace -V för att avgöra vilka ABI:er som stöds av din strace-byggning. I detta sammanhang betyder "icke-inbyggd" en ABI som skiljer sig från den som strace använder. m32-mpers strace kan spåra och korrekt avkoda icke-inbyggda 32-bitarsbinärer. no-m32-mpers strace kan spåra, men inte korrekt avkoda, icke-inbyggda 32-bitarsbinärer. mx32-mpers strace kan spåra och korrekt avkoda 32-på-64-bitarsbinärer. no-mx32-mpers strace kan spåra, men inte korrekt avkoda, 32-på-64-bitarsbinärer. Om utdata varken innehåller m32-mpers eller no-m32-mpers betyder det att stöd för avkodning av icke-inbyggda 32-bitarsbinärer inte är tillämpligt på arkitekturen. På motsvarande sätt betyder frånvaro av både mx32-mpers och no-mx32-mpers att stöd för avkodning av icke-inbyggda 32-på-64-bitarsbinärer inte är tillämpligt på arkitekturen. NOTERINGARSystem som använder delade bibliotek producerar ofta en stor mängd spårningsutdata när biblioteken laddas. Det är lärorikt att tänka på systemanrops indata och utdata som dataflöde över gränsen mellan användare och kärna. Eftersom användarutrymme och kärnutrymme är separata och adresskyddade är det ibland möjligt att göra deduktiva slutsatser om processbeteende genom att använda indata och utdata som utsagor. I vissa fall skiljer sig ett systemanrop från det dokumenterade beteendet eller har ett annat namn. Exempelvis har det underliggande systemanropet faccessat(2) inte något flags-argument, och biblioteksfunktionen setrlimit(2) implementeras med systemanropet prlimit64(2) på moderna kärnor, 2.6.38 och senare. Sådana skillnader är normala egenskaper hos systemanropsgränssnittet och hanteras av C-bibliotekets omslagsfunktioner. Vissa systemanrop har olika namn på olika arkitekturer och personligheter. I dessa fall använder systemanropsfiltrering och utskrift de namn som motsvarar kärnmakron av typen _*NR** för den spårade processens arkitektur och personlighet. Det finns två undantag från denna huvudregel: ARM-systemanropet arm_fadvise64_64(2) och Xtensa-systemanropet xtensa_fadvise64_64(2) filtreras och skrivs ut som fadvise64_64(2). På x32-ABI:n är vissa systemanrop avsedda för 64-bitarsprocesser men kan anropas från x32 genom att flaggan __X32_SYSCALL_BIT sätts. När detta sker markerar strace dessa anrop med suffixet #64. Ett exempel är readv(2), som är systemanrop nummer 19 på x86_64, medan dess separata x32-motsvarighet är systemanrop nummer 515. På vissa plattformar kan en process som ansluts med flaggan -p få ett oäkta EINTR-fel från ett icke-omstartbart systemanrop. Detta kan få oförutsägbar effekt på processen om den inte försöker starta om anropet. Helst borde alla systemanrop startas om vid strace-anslutning, så att anslutningen blir osynlig för den spårade processen, men några systemanrop gör inte det. Varje sådant fall kan hävdas vara ett kärnfel. Eftersom strace kör det angivna kommandot direkt utan ett skal kommer skript som saknar shebang-rad, exempelvis: #!/bin/sh att misslyckas med felet ENOEXEC, även om ett skal skulle kunna köra dem korrekt. Det rekommenderas att manuellt ange ett skal som kommando och skriptet som dess argument. FELProgram som använder setuid-biten har inte effektiva användar-ID-privilegier medan de spåras. En spårad process kör långsammare än en ospårad. Prestandapåverkan kan minskas genom att använda flaggan --seccomp-bpf. När ett kommando spåras kan dess efterkommande processer lämnas kvar efter att strace avslutats av en avbrottssignal, till exempel CTRL-C. Detta kan förhindras genom att använda flaggan --kill-on-exit, eller genom att använda --seccomp-bpf på ett sätt som underförstår --kill-on-exit. En spårad process kan använda flaggan CLONE_UNTRACED med systemanropet clone för att skapa en barnprocess som inte spåras av strace. Detta bryter en garanti hos flaggan --seccomp-bpf, eftersom detta ospårade barn kan lämnas kvar med ett aktivt seccomp-filter efter att strace har avslutats. HISTORIKDen ursprungliga versionen av strace skrevs av Paul Kranenburg för SunOS och inspirerades av dess verktyg trace. SunOS-versionen av strace porterades till Linux och förbättrades av Branko Lankester, som även skrev Linuxkärnans stöd. Även om Paul släppte strace 2.5 år 1992 byggde Brankos arbete på Pauls strace 1.5-utgåva från 1991. År 1993 tog Rick Sladkey över projektet. Han slog samman strace 2.5 för SunOS med den andra versionen av strace för Linux, lade till många funktioner från SVR4:s truss(1) och producerade en version av strace som fungerade på båda plattformarna. År 1994 porterade Rick strace till SVR4 och Solaris och skrev stödet för automatisk konfigurering. År 1995 porterade han strace till Irix. Från och med 1996 underhölls strace av Wichert Akkerman. Under hans tid migrerade strace-utvecklingen till CVS; portningar till FreeBSD och många arkitekturer på Linux introducerades, däribland ARM, IA-64, MIPS, PA-RISC, PowerPC, s390 och SPARC. År 2002 överfördes ansvaret för underhållet av strace till Roland McGrath. Sedan dess fick strace stöd för flera nya Linuxarkitekturer, bland annat AMD64, s390x och SuperH, bi-arkitekturstöd för några av dem och många tillägg och förbättringar i systemanropsavkodare på Linux. Under denna period migrerade strace-utvecklingen till Git. Sedan 2009 har strace aktivt underhållits av Dmitry Levin. Under denna period har strace fått stöd för arkitekturerna AArch64, ARC, AVR32, Blackfin, C-SKY, LoongArch, Meta, Nios II, OpenRISC 1000, RISC-V, Tile/TileGx och Xtensa. År 2012 togs ohederhållet och uppenbart trasigt stöd för icke-Linux-operativsystem bort. År 2012 fick strace även stöd för sökvägsspårning och avkodning av filbeskrivarsökvägar. År 2014 lades stöd för utskrift av stackspårning till. År 2016 implementerades manipulering av systemanrop. För ytterligare information, se filen NEWS och commit-loggen i strace-arkivet. RAPPORTERA FELProblem med strace bör rapporteras till sändlistan för strace: strace-devel@lists.strace.io SE ÄVENstrace-log-merge(1), ltrace(1), perf-trace(1), trace-cmd(1), time(1), ptrace(2), seccomp(2), syscall(2), proc(5), signal(7) strace hemsida: https://strace.io/ FÖRFATTAREDen fullständiga listan över bidragsgivare till strace finns i filen CREDITS. COLOPHONDenna sida är en del av projektet strace (systemanropsspårare). Information om projektet finns på: http://strace.io/ Om du har en felrapport för denna manualsida, skicka den till: strace-devel@lists.sourceforge.net Denna sida hämtades från projektets uppströms Git-arkiv:
Sidan hämtades den 16 januari 2026. Vid den tidpunkten var datumet för den senaste commit som hittades i arkivet den 13 januari 2026. Om du hittar renderingsproblem i denna HTML-version av sidan, eller om du anser att det finns en bättre eller mer uppdaterad källa för sidan, eller om du har rättelser eller förbättringar av informationen i detta COLOPHON-avsnitt, som inte är en del av den ursprungliga manualsidan, skicka e-post till: man-pages@man7.org
SidslutOrginalhemsidan på Engelska https://man7.org/linux/man-pages/man1/dh_installdocs.1.html
Det här är en maskinöversättning av Linux man sidor till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på
https://www.linux.se/kontaka-linux-se/
|
|---|