ProHoster > Blog > Pulega > Strace i Linux: talafaasolopito, mamanu ma faʻaoga
Strace i Linux: talafaasolopito, mamanu ma faʻaoga
I Unix-pei o faiga faʻaogaina, o fesoʻotaʻiga a le polokalame ma le lalolagi i fafo ma le faʻaogaina o le faiga e tupu mai i se seti o galuega - system calls. O lona uiga e mafai ona aoga mo le faʻaogaina o le faʻaogaina o le sipai i luga o le telefoni o loʻo faʻatinoina e ala.
O se aoga e fesoasoani ia te oe e mataʻituina le "ola vavalalata" o polokalame i luga o Linux strace, o le autu lea o lenei mataupu. O faʻataʻitaʻiga o le faʻaogaina o masini sipai e faʻatasi ma se tala faʻasolopito puupuu strace ma se faʻamatalaga o le mamanu o ia polokalame.
O le fesoʻotaʻiga autu i le va o polokalame ma le OS kernel i Unix o le telefoni feaveaʻi. faiga telefoni, sulu), o le fegalegaleaiga o polokalame ma le lalolagi i fafo e tupu naʻo latou.
Ae i le uluai lomiga lautele o Unix (Version 6 Unix, 1975) e leai ni auala talafeagai e siaki ai le amio a tagata faʻaoga. Ina ia foia lenei mataupu, Bell Labs o le a faʻafouina i le isi lomiga (Version 7 Unix, 1979) na tu'uina mai se faiga fou - ptrace.
ptrace na atiina ae muamua mo debuggers fegalegaleai, ae i le faaiuga o le 80s (i le vaitau o pisinisi Fa'asalalauga V Fa'atonu 4) i luga o lenei faʻavae, vaapiapi taulaʻi debuggers-system call tracers-faʻaalia ma faʻaaogaina lautele.
Muamua o le lomiga lava e tasi o le strace na lomia e Paul Cronenburg i luga o le comp.sources.sun mailing list i le 1992 e fai ma sui i le aoga tapunia. trace mai Sun. O le clone ma le uluaʻi na faʻamoemoe mo SunOS, ae o le 1994 strace na tuʻuina atu i le System V, Solaris ma le faʻateleina o Linux.
Ole aso nei ole strace e lagolagoina Linux ma fa'alagolago ile tutusa ptrace, ua tumu i le tele o faʻaopoopoga.
Fa'aonaponei (ma malosi tele) tausia strace - Dmitry Levin. Faʻafetai ia te ia, o le faʻaaogaina na maua ai mea faʻapitoa e pei o le tui sese i le telefoni feaveaʻi, lagolago mo le tele o fausaga fausaga ma, sili ona taua, mascot. O faʻamatalaga e le faʻatagaina e fai mai o le filifiliga na pa'ū i luga o le ostrich ona o le consonance i le va o le upu Rusia "ostrich" ma le upu Peretania "strace".
E taua foi le le aofia ai o le ptrace system call ma tracers i le POSIX, e ui lava i se talafaasolopito umi ma le faatinoga i Linux, FreeBSD, OpenBSD ma Unix masani.
Su'e masini i se faapuupuuga: Piglet Trace
"E le o faʻamoemoeina e te malamalama i lenei mea" (Dennis Ritchie, faʻamatalaga ile Version 6 Unix source code)
Talu mai laʻu laʻitiiti, e le mafai ona ou tu i pusa uliuli: Ou te leʻi taʻalo i meataalo, ae taumafai e malamalama i lo latou fausaga (tagata matutua na faʻaaogaina le upu "gaga," ae le talitonu i laulaufaiva leaga). Masalo o le mea lea e matua latalata mai ai ia te aʻu le aganuu masani a le Unix muamua ma le faʻaonaponei faʻapogai.
Mo faʻamoemoega o lenei tusiga, e le talafeagai le faʻamavaeina o le code source of strace, lea ua faʻatupulaia i le tele o tausaga. Ae e le tatau ona i ai ni mea lilo e totoe mo le au faitau. O le mea lea, ina ia faʻaalia le mataupu faavae o le faʻaogaina o ia polokalame strace, o le a ou tuʻuina atu le code mo se suʻega laʻititi - Piglet Trace (ptr). E le iloa pe faʻafefea ona fai se mea faʻapitoa, ae o le mea autu o le telefoni feaveaʻi o le polokalama - e maua ai:
Piglet Trace e iloa e uiga i le fiaselau o telefoni a Linux (vaai. laulau) ma e na o le galue i le x86-64 fausaga. Ua lava lea mo faamoemoega faaleaoaoga.
Se'i tatou va'ai i le galuega a le tatou clone. I le tulaga o Linux, e faʻaaogaina e tagata faʻapipiʻi ma tracers, e pei ona taʻua i luga, le ptrace system call. E galue e ala i le pasi atu i le finauga muamua le faʻamatalaga faʻatonu, lea naʻo tatou manaʻomia PTRACE_TRACEME, PTRACE_SYSCALL и PTRACE_GETREGS.
E amata le tracer i le faiga masani a Unix: fork(2) fa'alauiloa se faiga a tamaiti, lea e fa'aaogaina exec(3) fa'alauiloa le polokalame o lo'o su'esu'eina. Pau lava le poto i'i o le lu'i ptrace(PTRACE_TRACEME) muamua exec: E fa'amoemoe le fa'agasologa o le tamaititi e mata'ituina e matua:
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");
}
Ua tatau nei ona valaau le faagasologa matua wait(2) i le faagasologa o le tamaititi, o lona uiga, ia mautinoa ua tupu le suiga i le auala e suʻe ai:
/* 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");
I le taimi nei, ua maeʻa sauniuniga ma e mafai ona e faʻagasolo saʻo i le siakiina o telefoni i se matasele e le gata.
Lui ptrace(PTRACE_SYSCALL) fa'amautinoa e mulimuli mai wait matua o le a faʻamaeʻa aʻo leʻi faʻataunuʻuina le telefoni poʻo le taimi lava e maeʻa ai. I le va o telefoni e lua e mafai ona e faia soʻo se gaioiga: sui le telefoni i se isi mea, sui finauga poʻo le tau toe faafoi.
E tatau lava ona tatou valaau faalua le poloaiga ptrace(PTRACE_GETREGS)ia maua le setete resitala rax a'o le'i vala'au (numera telefoni fa'akomupiuta) ma fa'atoa mae'a (fa'afo'i le tau).
O le mea moni, o le taamilosaga:
/* 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);
}
O le su'ega atoa lena. O lea ua e iloa le mea e amata ai le isi porting Laupapa luga ole Linux.
Fa'avae: fa'agaioi o se polokalame fa'asolosolo strace
E pei o se faʻaoga muamua strace, masalo e aoga le taʻua o le auala sili ona faigofie - faʻalauiloa se talosaga e taʻavale strace.
Ina ia aua le suʻesuʻe i le lisi e le gata o telefoni o se polokalama masani, matou te tusia polokalame aupito maualalo tusitusi 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;
}
Tatou fausia le polokalame ma ia mautinoa e aoga:
$ gcc examples/write-simple.c -o write-simple
$ ./write-simple
write me to stdout
Ma le mea mulimuli, seʻi o tatou faʻataʻitaʻiina i lalo o le faʻatonuga:
E matua "upu" ma e le matua a'oa'oina. E lua fa'afitauli iinei: o le polokalame o lo'o fa'afefiloi ma le gaioiga strace ma le tele o telefoni feaveaʻi e le fiafia i ai i tatou.
E mafai ona e tu'u'ese'ese le fa'asologa masani a le polokalama ma le fa'aogaina o mea sese i le fa'aogaina o le -o ki, lea e toe fa'afeiloa'i ai le lisi o telefoni i se faila o finauga.
O loʻo tumau pea le taulimaina o le faʻafitauli o "faʻaopoopo" telefoni. Se'i tatou fa'apea e na'o telefoni tatou te fiafia i ai write. Ki -e fa'atagaina oe e fa'amaoti fa'amatalaga e fa'amamāina ai vala'au. O le filifiliga sili ona lauiloa o le tulaga masani, trace=*, lea e mafai ona e tuʻuina atu naʻo telefoni e fiafia i ai i matou.
Pe a faʻaaogaina i le taimi e tasi -o и -e matou te maua:
$ 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 +++
O lea, e te vaʻai, e sili atu ona faigofie le faitau.
E mafai fo'i ona e 'ave'esea vala'au, mo se fa'ata'ita'iga e feso'ota'i ma le vaevaega o manatua ma le fa'asa'olotoina:
$ 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 +++
Manatua le fa'ailoga fa'ailoga sao i le lisi o vala'au e le'i aofia ai: e mana'omia e le atigi fa'atonu. atigi).
I laʻu faʻamatalaga o le glibc, o le telefoni feaveaʻi e faʻamutaina le faagasologa exit_group, e le masani _exit. O le faigata lea o le galue i telefoni feaveaʻi: o le fesoʻotaʻiga lea e galue ai le polokalame e le fesoʻotaʻi tuusaʻo ma telefoni feaveaʻi. E le gata i lea, e suia i taimi uma e faʻatatau i le faʻatinoga ma le faʻavae.
Fa'avae: auai i le faagasologa i luga o le lele
I le taimi muamua, o le ptrace system valaau lea na fausia ai strace, e mafai ona fa'aaogaina pe a fa'agaoioia le polokalame i se faiga fa'apitoa. O lenei tapulaʻa atonu na foliga talafeagai i aso o le Version 6 Unix. I aso nei, ua le lava lenei mea: o nisi taimi e te manaʻomia le suʻesuʻeina o faʻafitauli o se polokalame galue. O se faʻataʻitaʻiga masani o se faʻagasologa o poloka i luga o se au poʻo le moe. O lea faaonaponei strace e mafai ona auai i faiga i luga o le lele.
$ ./write-sleep &
[1] 15329
write me
$ strace -p 15329
strace: Process 15329 attached
pause(
^Cstrace: Process 15329 detached
<detached ...>
Polokalama poloka ile telefoni pause. Sei o tatou vaai pe faapefea ona ia tali atu i faailoilo:
$ 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 +++
Na matou tatalaina le polokalame fa'aaisa ma fa'atasi ma fa'aaoga strace. E lua mea na manino mai: o le taofi o le system call e le amanaʻia faailo e aunoa ma ni tagata e faʻaaogaina ma, sili atu le manaia, strace mataʻituina e le gata i le telefoni feaveaʻi, ae faʻapea foʻi faʻailoga sau.
Fa'ata'ita'iga: Su'esu'eina Fa'asologa o Tamaiti
Galulue ma faiga e ala i se valaau fork - le faavae o Unix uma. Sei o tatou vaʻai pe faʻafefea ona galue le strace i se laau faʻaogaina e faʻaaoga ai le faʻataʻitaʻiga o se "faʻatoʻaga" faigofie polokalame:
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);
}
O iinei o le uluai faagasologa e fatuina ai se gaioiga a tamaiti, e tusi uma i le tulaga masani:
O le fu'a e fesoasoani ia te oe e siaki ai le laau atoa o le faagasologa -f, lea strace mata'ituina telefoni faiga i faiga tamaiti. E fa'aopoopoina lea i laina ta'itasi o galuega fa'atino pid fa'agasologa e faia ai se faiga fa'atino:
I le auala, o le a le system call o loʻo faʻaaogaina e fatu ai se faiga fou?
Faataitaiga: ala faila nai lo au
O le iloa o fa'amatalaga faila e mautinoa lava e aoga, ae o igoa o faila fa'apitoa e maua e se polokalame e mafai fo'i ona fa'aoga lelei.
Le isi le polokalama tusia le laina i le faila le tumau:
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;
}
I le taimi o se telefoni masani strace o le a fa'aalia le tau o le numera fa'amatala na tu'uina atu i le telefoni fa'aoga:
$ 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 +++
Ma se fu'a -y O loʻo faʻaalia e le aoga le ala i le faila e fetaui ma le faʻamatalaga:
$ 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 +++
Fa'ata'ita'iga: Su'e Avanoa Faila
O le isi mea aoga: fa'aali na'o le telefoni feavea'i e feso'ota'i ma se faila patino. Sosoo ai le polokalama fa'apipi'i se laina i se faila fa'atonu na pasia e fai ma finauga:
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;
}
e faaletonu strace fa'aalia le tele o fa'amatalaga e le mana'omia. Fu'a -P fa'atasi ai ma se finauga e mafua ai le strace e lolomi na'o valaau i le faila fa'amaonia:
$ 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 +++
Fa'aa'oa'oga: Polokalama Fa'asolo
Тилита strace e mafai foi ona fesoasoani pe a galue i le tele o filo le polokalama. O le polokalame o loʻo mulimuli mai e tusi i galuega masani mai vaitafe e lua:
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);
}
E masani lava, e tatau ona tuʻufaʻatasia ma se faʻafeiloaʻiga faʻapitoa i le soʻotaga - le -pthread flag:
$ 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
$
Flag -f, e pei o le tulaga o faiga masani, o le a faaopoopo le pid o le faagasologa i le amataga o laina taitasi.
E masani lava, matou te le o talanoa e uiga i se faʻailoga filo i le uiga o le faʻatinoina o le POSIX Threads standard, ae e uiga i le numera o loʻo faʻaaogaina e le faʻatulagaina o galuega i Linux. Mai le manatu mulimuli, e leai ni faʻagasologa poʻo ni filo - o loʻo i ai galuega e manaʻomia ona tufatufa atu i totonu o avanoa o le masini.
A galue i le tele o filo, o le telefoni feaveaʻi e matua tele naua:
I le ala, fesili. O le a le system call e fa'aoga e fai ai se filo fou? E faapefea ona ese lenei valaau mo filo mai le valaau mo faiga?
Vasega Matai: fa'aputuga fa'agasolo i le taimi o le vala'au fa'atonu
O se tasi o mea na aliali mai talu ai nei strace agava'a - fa'aalia le fa'aputuga o vala'au i le taimi o le vala'au. Faigofie faataitaiga:
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;
}
E masani lava, o le polokalama o le a avea ma voluminous tele, ma, faʻaopoopo i le fuʻa -k (valaau fa'aputuga fa'aaliga), e talafeagai le fa'amamaina o telefoni i le igoa:
$ 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 +++
Vasega matai: tui sese
Ma le isi mea fou ma sili ona aoga: tui sese. O iinei le polokalama, tusia ni laina se lua i le faʻasologa o galuega:
E manaia pe oa mea sese ua toe faafoi mai uma luʻitau write, e aofia ai ma le valaau natia i tua o le sese. E na'o le talafeagai le toe fa'afo'i atu o se mea sese mo le taimi muamua o telefoni:
$ 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 +++
Po o le lona lua:
$ 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 +++
E le manaʻomia le faʻamaonia o le ituaiga mea sese:
$ 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 +++
Faʻatasi ma isi fuʻa, e mafai ona e "vavae" avanoa i se faila patino. Faataitaiga:
$ 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 +++
E ese mai le tui sese, mafai fa'ailoa fa'atuai pe a vala'au pe maua fa'ailoga.
Taofi upu
Тилита strace - o se meafaigaluega faigofie ma faatuatuaina. Ae i le faaopoopo atu i le telefoni feaveaʻi, o isi vaega o le faʻaogaina o polokalame ma le faiga faʻaogaina e mafai ona faʻafefe. Mo se fa'ata'ita'iga, e mafai ona siaki vala'au i faletusi feso'ota'i malosi. su'esu'e, e mafai ona latou vaʻavaʻai i le faʻaogaina o le faiga faʻaogaina SystemTap и tuli, ma fa'atagaina oe e su'esu'e loloto le fa'atinoga o polokalame mea manogi. Ae ui i lea, e moni lava strace - o le laina muamua o le puipuiga i le tulaga o faʻafitauli i aʻu lava polokalama ma isi tagata, ma ou te faʻaaogaina ia le itiiti ifo ma le lua taimi i le vaiaso.
I se faapuupuuga, afai e te alofa ia Unix, faitau man 1 strace ma lagona le saoloto e tilotilo i au polokalame!