F'sistemi operattivi bħal Unix, il-komunikazzjoni ta 'programm mad-dinja ta' barra u s-sistema operattiva sseħħ permezz ta 'sett żgħir ta' funzjonijiet - sejħiet tas-sistema. Dan ifisser li għal skopijiet ta 'debugging jista' jkun utli li spjuni fuq is-sejħiet tas-sistema li qed jitwettqu minn proċessi.
Utilità tgħinek timmonitorja l-"ħajja intima" tal-programmi fuq Linux strace, li huwa s-suġġett ta’ dan l-artikolu. Eżempji tal-użu ta 'tagħmir ta' spy huma akkumpanjati minn storja qasira strace u deskrizzjoni tad-disinn ta' programmi bħal dawn.
L-interface ewlenija bejn il-programmi u l-kernel tal-OS f'Unix hija sejħiet tas-sistema. sejħiet tas-sistema, syscalls), l-interazzjoni tal-programmi mad-dinja ta’ barra sseħħ esklussivament permezz tagħhom.
Iżda fl-ewwel verżjoni pubblika ta' Unix (Verżjoni 6 Unix, 1975) ma kien hemm l-ebda mod konvenjenti biex issegwi l-imġieba tal-proċessi tal-utent. Biex issolvi din il-kwistjoni, Bell Labs se jaġġornaw għall-verżjoni li jmiss (Verżjoni 7 Unix, 1979) ippropona sejħa għal sistema ġdida - ptrace.
ptrace ġie żviluppat primarjament għal debuggers interattivi, iżda sa tmiem is-snin 80 (fl-era ta 'kummerċ Sistema V Rilaxx 4) fuq din il-bażi, debuggers iffukati b'mod dejjaq—system call tracers—dehru u ntużaw ħafna.
L-ewwel l-istess verżjoni ta 'strace ġiet ippubblikata minn Paul Cronenburg fuq il-lista tal-posta comp.sources.sun fl-1992 bħala alternattiva għal utilità magħluqa trace minn Sun. Kemm il-klonu kif ukoll l-oriġinal kienu maħsuba għal SunOS, iżda sa l-1994 strace ġie trasferit għal System V, Solaris u l-Linux dejjem aktar popolari.
Illum strace jappoġġja biss Linux u tiddependi fuq l-istess ptrace, overgrown b'ħafna estensjonijiet.
Manutentur modern (u attiv ħafna). strace - Dmitry Levin. Grazzi għalih, l-utilità kisbet karatteristiċi avvanzati bħal injezzjoni ta 'żball fis-sejħiet tas-sistema, appoġġ għal firxa wiesgħa ta' arkitetturi u, l-aktar importanti, maskot. Sorsi mhux uffiċjali jsostnu li l-għażla waqgħet fuq in-ngħam minħabba l-konsonanza bejn il-kelma Russa "ngħam" u l-kelma Ingliża "strace".
Huwa importanti wkoll li s-sejħa tas-sistema ptrace u t-tracers qatt ma ġew inklużi fil-POSIX, minkejja storja twila u implimentazzjoni fil-Linux, FreeBSD, OpenBSD u Unix tradizzjonali.
Sa mit-tfulija bikrija, ma nistax niflaħ kaxxi suwed: ma lgħabtx bil-ġugarelli, imma ppruvajt nifhem l-istruttura tagħhom (l-adulti użaw il-kelma "kisser," iżda ma nemminx l-ilsna ħżiena). Forsi huwa għalhekk li l-kultura informali tal-ewwel Unix u l-moviment modern open-source hija daqshekk qrib tiegħi.
Għall-finijiet ta 'dan l-artikolu, mhuwiex raġonevoli li żarma l-kodiċi tas-sors ta' strace, li kiber matul għexieren ta 'snin. Iżda m'għandu jkun hemm l-ebda sigriet għall-qarrejja. Għalhekk, biex nuri l-prinċipju ta 'tħaddim ta' tali programmi strace, ser nipprovdi l-kodiċi għal tracer minjatura - Traċċa tal-Qżieqeż (ptr). Ma jafx kif tagħmel xi ħaġa speċjali, iżda l-ħaġa prinċipali hija s-sejħiet tas-sistema tal-programm - joħroġ:
Piglet Trace jagħraf madwar mijiet ta’ sejħiet tas-sistema Linux (ara. mejda) u jaħdem biss fuq l-arkitettura x86-64. Dan huwa biżżejjed għal skopijiet edukattivi.
Ejja nħarsu lejn ix-xogħol tal-klonu tagħna. Fil-każ tal-Linux, id-debuggers u t-tracers jużaw, kif imsemmi hawn fuq, is-sejħa tas-sistema ptrace. Jaħdem billi jgħaddi fl-ewwel argument l-identifikaturi tal-kmand, li minnhom għandna bżonn biss PTRACE_TRACEME, PTRACE_SYSCALL и PTRACE_GETREGS.
It-tracer jibda fl-istil tas-soltu Unix: fork(2) tniedi proċess tat-tfal, li min-naħa tiegħu juża exec(3) iniedi l-programm li qed jiġi studjat. L-unika sottili hawnhekk hija l-isfida ptrace(PTRACE_TRACEME) qabel exec: Il-proċess tifel jistenna li l-proċess ġenitur jimmonitorjah:
pid_t child_pid = fork();
switch (child_pid) {
case -1:
err(EXIT_FAILURE, "fork");
case 0:
/* Child here */
/* A traced mode has to be enabled. A parent will have to wait(2) for it
* to happen. */
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
/* Replace itself with a program to be run. */
execvp(argv[1], argv + 1);
err(EXIT_FAILURE, "exec");
}
Il-proċess ġenitur issa għandu jsejjaħ wait(2) fil-proċess tat-tfal, jiġifieri, kun żgur li l-bidla għall-modalità tat-traċċa tkun seħħet:
/* Parent */
/* First we wait for the child to set the traced mode (see
* ptrace(PTRACE_TRACEME) above) */
if (waitpid(child_pid, NULL, 0) == -1)
err(EXIT_FAILURE, "traceme -> waitpid");
F'dan il-punt, il-preparazzjonijiet huma kompluti u tista 'tipproċedi direttament biex issegwi s-sejħiet tas-sistema f'linja bla tarf.
Sejħa ptrace(PTRACE_SYSCALL) garanziji li sussegwenti wait ġenitur se jlesti jew qabel is-sejħa tas-sistema tiġi eżegwita jew immedjatament wara li titlesta. Bejn żewġ sejħiet tista' twettaq kwalunkwe azzjoni: ibdel is-sejħa b'waħda alternattiva, ibdel l-argumenti jew il-valur tar-ritorn.
Għandna bżonn biss li nsejħu l-kmand darbtejn ptrace(PTRACE_GETREGS)biex tikseb l-istat tar-reġistru rax qabel is-sejħa (numru tas-sejħa tas-sistema) u immedjatament wara (valur tar-ritorn).
Fil-fatt, iċ-ċiklu:
/* A system call tracing loop, one interation per call. */
for (;;) {
/* A non-portable structure defined for ptrace/GDB/strace usage mostly.
* It allows to conveniently dump and access register state using
* ptrace. */
struct user_regs_struct registers;
/* Enter syscall: continue execution until the next system call
* beginning. Stop right before syscall.
*
* It's possible to change the system call number, system call
* arguments, return value or even avoid executing the system call
* completely. */
if (ptrace(PTRACE_SYSCALL, child_pid, NULL, NULL) == -1)
err(EXIT_FAILURE, "enter_syscall");
if (waitpid(child_pid, NULL, 0) == -1)
err(EXIT_FAILURE, "enter_syscall -> waitpid");
/* According to the x86-64 system call convention on Linux (see man 2
* syscall) the number identifying a syscall should be put into the rax
* general purpose register, with the rest of the arguments residing in
* other general purpose registers (rdi,rsi, rdx, r10, r8, r9). */
if (ptrace(PTRACE_GETREGS, child_pid, NULL, ®isters) == -1)
err(EXIT_FAILURE, "enter_syscall -> getregs");
/* Note how orig_rax is used here. That's because on x86-64 rax is used
* both for executing a syscall, and returning a value from it. To
* differentiate between the cases both rax and orig_rax are updated on
* syscall entry/exit, and only rax is updated on exit. */
print_syscall_enter(registers.orig_rax);
/* Exit syscall: execute of the syscall, and stop on system
* call exit.
*
* More system call tinkering possible: change the return value, record
* time it took to finish the system call, etc. */
if (ptrace(PTRACE_SYSCALL, child_pid, NULL, NULL) == -1)
err(EXIT_FAILURE, "exit_syscall");
if (waitpid(child_pid, NULL, 0) == -1)
err(EXIT_FAILURE, "exit_syscall -> waitpid");
/* Retrieve register state again as we want to inspect system call
* return value. */
if (ptrace(PTRACE_GETREGS, child_pid, NULL, ®isters) == -1) {
/* ESRCH is returned when a child terminates using a syscall and no
* return value is possible, e.g. as a result of exit(2). */
if (errno == ESRCH) {
fprintf(stderr, "nTracee terminatedn");
break;
}
err(EXIT_FAILURE, "exit_syscall -> getregs");
}
/* Done with this system call, let the next iteration handle the next
* one */
print_syscall_exit(registers.rax);
}
Dak hu t-tracer kollu. Issa taf minn fejn tibda l-porting li jmiss DTrace fuq Linux.
Bażi: it-tmexxija ta' programm li jmexxi strace
Bħala l-ewwel każ ta' użu strace, forsi ta 'min isemmi l-aktar mod sempliċi - it-tnedija ta' applikazzjoni li taħdem strace.
Sabiex ma tidħolx fil-lista bla tarf ta 'sejħiet ta' programm tipiku, niktbu programm minimu madwar write:
int main(int argc, char *argv[])
{
char str[] = "write me to stdoutn";
/* write(2) is a simple wrapper around a syscall so it should be easy to
* find in the syscall trace. */
if (sizeof(str) != write(STDOUT_FILENO, str, sizeof(str))){
perror("write");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
Ejja nibnu l-programm u niżguraw li jaħdem:
$ gcc examples/write-simple.c -o write-simple
$ ./write-simple
write me to stdout
U fl-aħħarnett, ejja nħaddmuha taħt kontroll strace:
Ħafna "wordy" u mhux edukattiv ħafna. Hemm żewġ problemi hawn: l-output tal-programm huwa mħallat mal-output strace u abbundanza ta' sejħiet sistema li ma jinteressawnax.
Tista' tissepara n-nixxiegħa tal-output standard tal-programm u l-output tal-iżball strace billi tuża l-iswiċċ -o, li jidderieġi mill-ġdid il-lista tas-sejħiet tas-sistema għal fajl tal-argument.
Fadal biex tittratta l-problema tas-sejħiet "extra". Ejja nassumu li aħna biss interessati fis-sejħiet write. Ewlenin -e jippermettilek tispeċifika espressjonijiet li bihom is-sejħiet tas-sistema se jiġu ffiltrati. L-għażla tal-kundizzjoni l-aktar popolari hija, naturalment, trace=*, li biha tista' tħalli biss is-sejħiet li jinteressawna.
Meta jintuża simultanjament -o и -e se nġibu:
$ strace -e trace=write -owrite-simple.log ./write-simple
write me to stdout
$ cat write-simple.log
write(1, "write me to stdoutn", 20
) = 20
+++ exited with 0 +++
Allura, tara, huwa ħafna aktar faċli biex taqra.
Tista' wkoll tneħħi sejħiet tas-sistema, pereżempju dawk relatati mal-allokazzjoni u l-ħelsien tal-memorja:
$ strace -e trace=!brk,mmap,mprotect,munmap -owrite-simple.log ./write-simple
write me to stdout
$ cat write-simple.log
execve("./write-simple", ["./write-simple"], 0x7ffe9972a498 /* 69 vars */) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=124066, ...}) = 0
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "177ELF21133>1260342"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2030544, ...}) = 0
close(3) = 0
arch_prctl(ARCH_SET_FS, 0x7f00f0be74c0) = 0
write(1, "write me to stdoutn", 20) = 20
exit_group(0) = ?
+++ exited with 0 +++
Innota l-marka ta 'exclamation maħruba fil-lista ta' sejħiet esklużi: dan huwa meħtieġ mill-qoxra tal-kmand. qoxra).
Fil-verżjoni tiegħi tal-glibc, sejħa tas-sistema ttemm il-proċess exit_group, mhux tradizzjonali _exit. Din hija d-diffikultà li taħdem mas-sejħiet tas-sistema: l-interface li biha jaħdem il-programmatur mhijiex direttament relatata mas-sejħiet tas-sistema. Barra minn hekk, tinbidel regolarment skont l-implimentazzjoni u l-pjattaforma.
Bażi: tingħaqad mal-proċess fuq il-fly
Inizjalment, is-sejħa tas-sistema ptrace li fuqha nbniet strace, jista 'jintuża biss meta jitħaddem il-programm f'modalità speċjali. Din il-limitazzjoni setgħet tinstema' raġonevoli fil-jiem tal-Verżjoni 6 Unix. Illum il-ġurnata, dan m'għadux biżżejjed: xi drabi għandek bżonn tinvestiga l-problemi ta 'programm ta' ħidma. Eżempju tipiku huwa proċess imblukkat fuq manku jew irqad. Għalhekk moderni strace jistgħu jingħaqdu ma 'proċessi fuq il-fly.
$ ./write-sleep &
[1] 15329
write me
$ strace -p 15329
strace: Process 15329 attached
pause(
^Cstrace: Process 15329 detached
<detached ...>
Programm imblukkat b'sejħa pause. Ejja naraw kif tirreaġixxi għas-sinjali:
$ strace -o write-sleep.log -p 15329 &
strace: Process 15329 attached
$
$ kill -CONT 15329
$ cat write-sleep.log
pause() = ? ERESTARTNOHAND (To be restarted if no handler)
--- SIGCONT {si_signo=SIGCONT, si_code=SI_USER, si_pid=14989, si_uid=1001} ---
pause(
$
$ kill -TERM 15329
$ cat write-sleep.log
pause() = ? ERESTARTNOHAND (To be restarted if no handler)
--- SIGCONT {si_signo=SIGCONT, si_code=SI_USER, si_pid=14989, si_uid=1001} ---
pause() = ? ERESTARTNOHAND (To be restarted if no handler)
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=14989, si_uid=1001} ---
+++ killed by SIGTERM +++
Nedejna l-programm iffriżat u ngħaqadna miegħu bl-użu strace. Żewġ affarijiet dehru ċari: is-sejħa tas-sistema ta 'pawsa tinjora sinjali mingħajr handlers u, aktar interessanti, strace monitors mhux biss sejħiet tas-sistema, iżda wkoll sinjali deħlin.
Eżempju: Traċċar tal-Proċessi tat-Tfal
Ħidma ma 'proċessi permezz ta' sejħa fork - il-bażi tal-Unixes kollha. Ejja naraw kif taħdem strace ma 'siġra tal-proċess billi tuża l-eżempju ta' "tgħammir" sempliċi programmi:
int main(int argc, char *argv[])
{
pid_t parent_pid = getpid();
pid_t child_pid = fork();
if (child_pid == 0) {
/* A child is born! */
child_pid = getpid();
/* In the end of the day printf is just a call to write(2). */
printf("child (self=%d)n", child_pid);
exit(EXIT_SUCCESS);
}
printf("parent (self=%d, child=%d)n", parent_pid, child_pid);
wait(NULL);
exit(EXIT_SUCCESS);
}
Hawnhekk il-proċess oriġinali joħloq proċess tifel, it-tnejn bil-miktub għall-output standard:
Il-bandiera tgħinek issegwi s-siġra tal-proċess kollu -f, li strace jimmonitorja s-sejħiet tas-sistema fil-proċessi tat-tfal. Dan iżid ma 'kull linja ta' produzzjoni pid proċess li jagħmel output tas-sistema:
Mill-mod, liema sejħa tas-sistema tintuża biex jinħoloq proċess ġdid?
Eżempju: mogħdijiet tal-fajls minflok manki
Li tkun taf id-deskritturi tal-fajls hija ċertament utli, iżda l-ismijiet tal-fajls speċifiċi li jaċċessa programm jistgħu wkoll ikunu utli.
il jmiss programm jikteb il-linja f'fajl temporanju:
void do_write(int out_fd)
{
char str[] = "write me to a filen";
if (sizeof(str) != write(out_fd, str, sizeof(str))){
perror("write");
exit(EXIT_FAILURE);
}
}
int main(int argc, char *argv[])
{
char tmp_filename_template[] = "/tmp/output_fileXXXXXX";
int out_fd = mkstemp(tmp_filename_template);
if (out_fd == -1) {
perror("mkstemp");
exit(EXIT_FAILURE);
}
do_write(out_fd);
return EXIT_SUCCESS;
}
Waqt sejħa normali strace se juri l-valur tan-numru tad-deskrittur mgħoddi lis-sejħa tas-sistema:
$ strace -e trace=write -o write-tmp-file.log ./write-tmp-file
$ cat write-tmp-file.log
write(3, "write me to a filen", 20) = 20
+++ exited with 0 +++
Bil-bandiera -y L-utilità turi l-mogħdija għall-fajl li għalih jikkorrispondi d-deskrittur:
$ strace -y -e trace=write -o write-tmp-file.log ./write-tmp-file
$ cat write-tmp-file.log
write(3</tmp/output_fileCf5MyW>, "write me to a filen", 20) = 20
+++ exited with 0 +++
Eżempju: Traċċar tal-Aċċess għall-Fajl
Karatteristika utli oħra: turi biss sejħiet tas-sistema assoċjati ma 'fajl speċifiku. Li jmiss programm tehmeż linja ma' fajl arbitrarju mgħoddi bħala argument:
void do_write(int out_fd)
{
char str[] = "write me to a filen";
if (sizeof(str) != write(out_fd, str, sizeof(str))){
perror("write");
exit(EXIT_FAILURE);
}
}
int main(int argc, char *argv[])
{
/*
* Path will be provided by the first program argument.
* */
const char *path = argv[1];
/*
* Open an existing file for writing in append mode.
* */
int out_fd = open(path, O_APPEND | O_WRONLY);
if (out_fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
do_write(out_fd);
return EXIT_SUCCESS;
}
Permezz ta 'default strace juri ħafna informazzjoni bla bżonn. Bandiera -P b'argument jikkawża li strace jistampa biss sejħiet għall-fajl speċifikat:
$ strace -y -P/tmp/test_file.log -o write-file.log ./write-file /tmp/test_file.log
$ cat write-file.log
openat(AT_FDCWD, "/tmp/test_file.log", O_WRONLY|O_APPEND) = 3</tmp/test_file.log>
write(3</tmp/test_file.log>, "write me to a filen", 20) = 20
+++ exited with 0 +++
Eżempju: Programmi Multithreaded
Utilità strace jista 'jgħin ukoll meta taħdem ma' multi-threaded il-programm. Il-programm li ġej jikteb fuq output standard minn żewġ flussi:
void *thread(void *arg)
{
(void) arg;
printf("Secondary thread: workingn");
sleep(1);
printf("Secondary thread: donen");
return NULL;
}
int main(int argc, char *argv[])
{
printf("Initial thread: launching a threadn");
pthread_t thr;
if (0 != pthread_create(&thr, NULL, thread, NULL)) {
fprintf(stderr, "Initial thread: failed to create a thread");
exit(EXIT_FAILURE);
}
printf("Initial thread: joining a threadn");
if (0 != pthread_join(thr, NULL)) {
fprintf(stderr, "Initial thread: failed to join a thread");
exit(EXIT_FAILURE);
};
printf("Initial thread: done");
exit(EXIT_SUCCESS);
}
Naturalment, għandu jiġi kkompilat b'tislima speċjali lill-linker - il-bandiera -pthread:
$ gcc examples/thread-write.c -pthread -o thread-write
$ ./thread-write
/thread-write
Initial thread: launching a thread
Initial thread: joining a thread
Secondary thread: working
Secondary thread: done
Initial thread: done
$
Bandiera -f, bħal fil-każ ta 'proċessi regolari, se żżid il-pid tal-proċess fil-bidu ta' kull linja.
Naturalment, mhux qed nitkellmu dwar identifikatur tal-ħajt fis-sens tal-implimentazzjoni tal-istandard POSIX Threads, iżda dwar in-numru użat mill-iskedar tal-kompiti fil-Linux. Mill-perspettiva ta 'l-aħħar, m'hemm l-ebda proċessi jew ħjut - hemm kompiti li jeħtieġ li jitqassmu fost il-qlub disponibbli tal-magna.
Meta taħdem f'ħafna ħjut, is-sejħiet tas-sistema jsiru wisq:
Mill-mod, mistoqsijiet. Liema sejħa tas-sistema tintuża biex tinħoloq ħajt ġdid? Din is-sejħa għall-ħjut kif tvarja mis-sejħa għall-proċessi?
Master class: proċess stack fil-ħin ta 'sejħa tas-sistema
Wieħed mill-reċentement deher strace kapaċitajiet - juri l-munzell ta 'sejħiet ta' funzjoni fil-ħin tas-sejħa tas-sistema. Sempliċi eżempju:
void do_write(void)
{
char str[] = "write me to stdoutn";
if (sizeof(str) != write(STDOUT_FILENO, str, sizeof(str))){
perror("write");
exit(EXIT_FAILURE);
}
}
int main(int argc, char *argv[])
{
do_write();
return EXIT_SUCCESS;
}
Naturalment, l-output tal-programm isir voluminuż ħafna, u, minbarra l-bandiera -k (displej tal-munzell tas-sejħiet), jagħmel sens li s-sejħiet tas-sistema jiġu ffiltrati bl-isem:
$ gcc examples/write-simple.c -o write-simple
$ strace -k -e trace=write -o write-simple.log ./write-simple
write me to stdout
$ cat write-simple.log
write(1, "write me to stdoutn", 20) = 20
> /lib/x86_64-linux-gnu/libc-2.27.so(__write+0x14) [0x110154]
> /home/vkazanov/projects-my/strace-post/write-simple(do_write+0x50) [0x78a]
> /home/vkazanov/projects-my/strace-post/write-simple(main+0x14) [0x7d1]
> /lib/x86_64-linux-gnu/libc-2.27.so(__libc_start_main+0xe7) [0x21b97]
> /home/vkazanov/projects-my/strace-post/write-simple(_start+0x2a) [0x65a]
+++ exited with 0 +++
Klassi prinċipali: injezzjoni ta' żball
U karatteristika oħra ġdida u utli ħafna: injezzjoni ta 'żball. Hawn programm, billi tikteb żewġ linji fil-fluss tal-output:
Huwa interessanti liema żbalji jiġu rritornati kollha sfidi write, inkluż is-sejħa moħbija wara perror. Jagħmel sens biss li tirritorna żball għall-ewwel waħda mis-sejħiet:
$ strace -e trace=write -e inject=write:error=EBADF:when=1 -owrite-twice.log ./write-twice
write: Bad file descriptor
$ cat write-twice.log
write(1, "write me 1n", 12) = -1 EBADF (Bad file descriptor) (INJECTED)
write(3, "write: Bad file descriptorn", 27) = 27
+++ exited with 1 +++
Jew it-tieni waħda:
$ strace -e trace=write -e inject=write:error=EBADF:when=2 -owrite-twice.log ./write-twice
write me 1
write: Bad file descriptor
$ cat write-twice.log
write(1, "write me 1n", 12) = 12
write(1, "write me 2n", 12) = -1 EBADF (Bad file descriptor) (INJECTED)
write(3, "write: Bad file descriptorn", 27) = 27
+++ exited with 1 +++
Mhuwiex meħtieġ li jiġi speċifikat it-tip ta' żball:
$ strace -e trace=write -e fault=write:when=1 -owrite-twice.log ./write-twice
$ cat write-twice.log
write(1, "write me 1n", 12) = -1 ENOSYS (Function not implemented) (INJECTED)
write(3, "write: Function not implementedn", 32) = 32
+++ exited with 1 +++
Flimkien ma 'bnadar oħra, tista' "tkisser" l-aċċess għal fajl speċifiku. Eżempju:
$ strace -y -P/tmp/test_file.log -e inject=file:error=ENOENT -o write-file.log ./write-file /tmp/test_file.log
open: No such file or directory
$ cat write-file.log
openat(AT_FDCWD, "/tmp/test_file.log", O_WRONLY|O_APPEND) = -1 ENOENT (No such file or directory) (INJECTED)
+++ exited with 1 +++
Minbarra l-injezzjoni ta 'żball, wieħed jista ' daħħal dewmien meta tagħmel sejħiet jew tirċievi sinjali.
Wara kelma
Utilità strace - għodda sempliċi u affidabbli. Iżda minbarra s-sejħiet tas-sistema, jistgħu jiġu debugged aspetti oħra tat-tħaddim tal-programmi u s-sistema operattiva. Pereżempju, jista 'jsegwi sejħiet għal libreriji konnessi dinamikament. ltraċċa, jistgħu jħarsu lejn l-operat tas-sistema operattiva SystemTap и ftrace, u jippermettilek tinvestiga fil-fond il-prestazzjoni tal-programm perfetta. Madankollu, huwa strace - l-ewwel linja ta 'difiża f'każ ta' problemi bil-programmi tiegħi stess u ta 'nies oħrajn, u nużaha mill-inqas ftit drabi fil-ġimgħa.
Fil-qosor, jekk tħobb Unix, aqra man 1 strace u tħossok liberu li tagħti ħarsa lejn il-programmi tiegħek!