Debogaj deplwaman lojisyèl ak strace

Debogaj deplwaman lojisyèl ak strace

Travay jou mwen an se sitou deplwaman lojisyèl, ki vle di mwen pase anpil tan ap eseye reponn kesyon tankou:

  • Lojisyèl sa a ap travay pou pwomotè a, men se pa pou mwen. Poukisa?
  • Yè lojisyèl sa a te travay pou mwen, men jodi a li pa fè sa. Poukisa?

Sa a se yon kalite debogaj ki se yon ti kras diferan de debogaj regilye lojisyèl. Debogaj regilye se sou lojik kòd la, men debogaj deplwaman se sou entèraksyon ki genyen ant kòd la ak anviwònman an. Menm si rasin nan pwoblèm nan se yon erè ki lojik, lefèt ke tout bagay ap travay sou yon machin epi yo pa sou yon lòt vle di ke pwoblèm nan se yon jan kanmenm nan anviwònman an.

Se konsa, olye pou yo zouti yo debogaj abityèl tankou gdb Mwen gen yon seri diferan zouti pou deplwaman debogaj. Ak zouti pi renmen mwen an pou fè fas ak pwoblèm nan tankou "Poukisa lojisyèl sa a pa travay pou mwen?" rele strace.

Ki sa ki strace?

strace se yon zouti pou "tracing apèl sistèm". Li te kreye orijinèlman pou Linux, men menm ke trik nouvèl debogaj yo ka fè ak zouti pou lòt sistèm yo (DTrace oswa ktrace).

Aplikasyon debaz la trè senp. Ou jis bezwen kouri strace ak nenpòt kòmand epi li pral jete tout apèl sistèm (byenke premye ou pral pwobableman gen enstale li tèt ou. strace):

$ strace echo Hello
...Snip lots of stuff...
write(1, "Hellon", 6)                  = 6
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

Ki apèl sistèm sa yo? Sa a se yon bagay tankou yon API pou nwayo a sistèm opere. Yon fwa sou yon tan, lojisyèl te gen aksè dirèk nan pyès ki nan konpitè li te kouri sou. Si, pou egzanp, li te bezwen montre yon bagay sou ekran an, li te jwe ak pò oswa memwa-map rejis pou aparèy videyo. Lè sistèm òdinatè multitech te vin popilè, dezòd te gouvènen pandan plizyè aplikasyon te goumen sou pyès ki nan konpitè. Erè nan yon aplikasyon ka fè lòt moun desann, si se pa tout sistèm nan. Lè sa a, mòd privilèj (oswa "pwoteksyon bag") parèt nan CPU a. Kernel la te vin pi privilejye a: li te resevwa aksè konplè nan pyès ki nan konpitè, anjandre aplikasyon mwens privilejye ki te deja mande aksè nan nwayo a pou kominike avèk pyès ki nan konpitè atravè apèl sistèm.

Nan nivo binè, yon apèl sistèm se yon ti kras diferan de yon apèl fonksyon senp, men pifò pwogram yo sèvi ak yon wrapper nan bibliyotèk la estanda. Moun sa yo. bibliyotèk estanda POSIX C a gen yon apèl fonksyon ekri (), ki gen tout kòd achitekti espesifik pou apèl sistèm lan ekri.

Debogaj deplwaman lojisyèl ak strace

Nan ti bout tan, nenpòt entèraksyon ant yon aplikasyon ak anviwònman li yo (sistèm òdinatè) fèt atravè apèl sistèm. Se poutèt sa, lè lojisyèl ap travay sou yon machin men pa sou yon lòt, li ta bon pou gade nan rezilta yo trase apèl sistèm. Plis espesyalman, isit la se yon lis pwen tipik ki ka analize lè l sèvi avèk yon tras apèl sistèm:

  • I/O konsole
  • I/O rezo
  • Aksè sistèm dosye ak dosye I/O
  • Jere tout lavi yon fil pwosesis
  • Jesyon memwa ki ba nivo
  • Aksè nan chofè aparèy espesifik

Ki lè pou itilize strace?

Nan teyori, strace itilize ak nenpòt pwogram nan espas itilizatè, paske nenpòt pwogram nan espas itilizatè dwe fè apèl sistèm. Li travay pi efikas ak pwogram konpile, ki ba nivo, men li travay tou ak lang wo nivo tankou Python si ou ka koupe bri adisyonèl ki soti nan ègzekutabl la ak entèprèt la.

Nan tout glwa li strace manifeste tèt li pandan debogaj nan lojisyèl ki travay byen sou yon machin, men toudenkou sispann travay sou yon lòt, pwodwi mesaj vag sou dosye, otorizasyon, oswa tantativ san siksè pou egzekite kèk kòmandman oswa yon lòt bagay... Se yon pitye, men li pa fè sa. konbine tèlman byen ak pwoblèm wo nivo tankou erè verifikasyon sètifika. Anjeneral sa a mande pou yon konbinezon stracepafwa tras ak zouti ki pi wo (tankou zouti liy lòd la opansl pou debogaj sètifika a).

Nou pral sèvi ak yon sèvè otonòm kòm yon egzanp, men trase apèl sistèm ka souvan fèt sou platfòm deplwaman ki pi konplèks. Ou jis bezwen chwazi bon zouti.

Egzanp debogaj senp

Ann di ou vle kouri aplikasyon an sèvè etonan foo, ak sa a se sa ou fini ak:

$ foo
Error opening configuration file: No such file or directory

Aparamman li pa t 'kapab jwenn fichye a konfigirasyon ou te ekri. Sa rive paske pafwa lè administratè pakè yo konpile yon aplikasyon, yo pase sou plas dosye yo te espere. Men, si ou swiv gid enstalasyon an pou yon distribisyon, nan yon lòt ou jwenn dosye konplètman diferan de kote ou te espere. Pwoblèm nan ta ka rezoud nan yon koup de segonn si mesaj erè a te di ki kote yo gade pou fichye a konfigirasyon, men li pa fè sa. Se konsa, ki kote yo gade?

Si ou gen aksè a kòd sous la, ou ka li li epi chèche konnen tout bagay. Yon bon plan backup, men se pa solisyon ki pi rapid. Ou ka resort nan yon debugger etap-pa-etap tankou gdb epi wè sa pwogram nan fè, men li pi efikas pou itilize yon zouti ki fèt espesyalman pou montre entèraksyon ak anviwònman an: strace.

Sòti strace ka sanble redondants, men bon nouvèl la se ke pifò nan li ka san danje inyore. Li souvan itil pou itilize operatè a -o pou konsève rezilta tras nan yon dosye separe:

$ strace -o /tmp/trace foo
Error opening configuration file: No such file or directory
$ cat /tmp/trace
execve("foo", ["foo"], 0x7ffce98dc010 /* 16 vars */) = 0
brk(NULL)                               = 0x56363b3fb000
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=25186, ...}) = 0
mmap(NULL, 25186, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f2f12cf1000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "177ELF2113 3 > 1 260A2 "..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1824496, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2f12cef000
mmap(NULL, 1837056, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f2f12b2e000
mprotect(0x7f2f12b50000, 1658880, PROT_NONE) = 0
mmap(0x7f2f12b50000, 1343488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7f2f12b50000
mmap(0x7f2f12c98000, 311296, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16a000) = 0x7f2f12c98000
mmap(0x7f2f12ce5000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b6000) = 0x7f2f12ce5000
mmap(0x7f2f12ceb000, 14336, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f2f12ceb000
close(3)                                = 0
arch_prctl(ARCH_SET_FS, 0x7f2f12cf0500) = 0
mprotect(0x7f2f12ce5000, 16384, PROT_READ) = 0
mprotect(0x56363b08b000, 4096, PROT_READ) = 0
mprotect(0x7f2f12d1f000, 4096, PROT_READ) = 0
munmap(0x7f2f12cf1000, 25186)           = 0
openat(AT_FDCWD, "/etc/foo/config.json", O_RDONLY) = -1 ENOENT (No such file or directory)
dup(2)                                  = 3
fcntl(3, F_GETFL)                       = 0x2 (flags O_RDWR)
brk(NULL)                               = 0x56363b3fb000
brk(0x56363b41c000)                     = 0x56363b41c000
fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x8), ...}) = 0
write(3, "Error opening configuration file"..., 60) = 60
close(3)                                = 0
exit_group(1)                           = ?
+++ exited with 1 +++

Apeprè tout premye paj pwodiksyon an strace - Sa a se nòmalman preparasyon ki ba-nivo pou lansman. (Anpil apèl mmap, mprotect, plum pou bagay tankou detekte memwa ki ba-nivo ak montre bibliyotèk dinamik.) Aktyèlman, pandan debogaj pwodiksyon an strace Li pi bon pou li depi nan fen a. Pral gen yon defi anba a ekri, ki montre yon mesaj erè. Nou gade pi wo a epi wè premye apèl sistèm inègza - apèl la louvri, ki voye yon erè ENOENT ("Fisye oswa anyè pa jwenn") ap eseye louvri /etc/foo/config.json. Sa a se kote dosye konfigirasyon an ta dwe.

Sa a te jis yon egzanp, men mwen ta di 90% nan tan ke mwen itilize strace, pa gen anyen ki pi difisil pou fè pase sa. Anba a se yon gid konplè etap pa etap debogaj:

  • Fache poutèt yon mesaj vag sou yon erè sistèm nan yon pwogram
  • Rekòmanse pwogram nan ak strace
  • Jwenn mesaj erè a nan rezilta tras yo
  • Ale pi wo jiskaske ou frape premye apèl sistèm echwe a

Li trè posib ke apèl la sistèm nan etap 4 pral revele sa ki te ale mal.

Konsèy

Anvan ou montre w yon egzanp debogaj pi konplèks, mwen pral montre w kèk ke trik nouvèl pou itilizasyon efikas strace:

man se zanmi w

Sou anpil sistèm *nix, ou ka jwenn yon lis konplè apèl sistèm nan nwayo a lè w ap kouri moun syscalls. Ou pral wè bagay sa yo tankou brk (2), ki vle di plis enfòmasyon ka jwenn nan kouri man 2 brk.

Ti rato: man 2 fouchèt montre m paj la pou kokiy la fouchèt () в GNU libc, ki, li vire soti, se aplike lè w rele klonaj (). Rele semantik fouchèt rete menm jan an si ou ekri yon pwogram lè l sèvi avèk fouchèt (), epi kouri yon tras - mwen pa pral jwenn okenn apèl fouchèt, olye de yo pral genyen klonaj (). Rate sa yo sèlman konfonn ou si ou kòmanse konpare sous la ak pwodiksyon an strace.

Sèvi ak -o pou konsève pou pwodiksyon an nan yon dosye

strace ka jenere pwodiksyon vaste, kidonk li se souvan itil nan magazen rezilta tras nan dosye separe (tankou nan egzanp ki anwo a). Sa a tou ede evite konfizyon pwodiksyon pwogram ak pwodiksyon strace nan konsole a.

Sèvi ak -s pou wè plis done agiman

Ou ka remake ke dezyèm mwatye nan mesaj erè a pa montre nan tras egzanp ki anwo a. Se paske strace default montre sèlman premye 32 bytes agiman fisèl la. Si ou vle wè plis, ajoute yon bagay tankou -s 128 nan apèl la strace.

-y fè li pi fasil pou swiv dosye, sipò, elatriye.

"Tout se fichye" vle di ke sistèm *nix fè tout I/O lè l sèvi avèk deskriptè fichye yo, kit sa aplikab pou yon fichye oswa yon rezo oswa tiyo entè-pwosesis. Sa a se pratik pou pwogramasyon, men li fè li difisil pou kenbe tras de sa k ap reyèlman pase lè ou wè komen li и ekri nan sistèm nan apèl rezilta tras.

Lè w ajoute yon operatè wi, ou pral fòse strace anote chak deskriptè dosye nan pwodiksyon an ak yon nòt sou sa li montre.

Tache ak yon pwosesis ki deja kouri ak -p**

Kòm ou pral wè nan egzanp ki anba a, pafwa ou bezwen trase yon pwogram ki deja ap kouri. Si li konnen ke li ap kouri kòm pwosesis 1337 (di, soti nan pwodiksyon an ps), Lè sa a, ou ka trase li tankou sa a:

$ strace -p 1337
...system call trace output...

Ou ka bezwen dwa rasin.

Sèvi ak -f pou kontwole pwosesis timoun yo

strace Pa default, li trase yon sèl pwosesis. Si pwosesis sa a anjandre pwosesis timoun yo, Lè sa a, apèl sistèm nan anjandre pwosesis timoun yo ka wè, men apèl sistèm nan pwosesis timoun yo pa pral parèt.

Si ou panse erè a se nan yon pwosesis timoun, sèvi ak deklarasyon an -f, sa pral pèmèt trase li yo. Dezavantaj nan sa a se ke pwodiksyon an pral konfonn ou menm plis. Kilè strace trase yon sèl pwosesis oswa yon sèl fil, li montre yon kouran sèl nan evènman apèl. Lè li trase plizyè pwosesis nan yon fwa, ou ka wè kòmansman yon apèl koupe pa yon mesaj , Lè sa a, - yon pakèt moun sou apèl pou lòt branch ekzekisyon, epi sèlman lè sa a - nan fen premye a . Oswa divize tout rezilta tras nan diferan dosye, tou lè l sèvi avèk operatè a -ff (detay nan gid sou strace).

Filtre tras lè l sèvi avèk -e

Kòm ou ka wè, rezilta a nan tras la se yon pil reyèl nan tout apèl sistèm posib. Drapo -e Ou ka filtre tras la (gade lidèchip sou strace). Avantaj prensipal la se ke li se pi vit nan kouri yon tras filtre pase fè yon tras plen ak Lè sa a grep`nan. Yo dwe onèt, mwen prèske toujou pa pran swen.

Se pa tout erè ki pa bon

Yon egzanp senp ak komen se yon pwogram kap chèche yon fichye nan plizyè kote alafwa, tankou yon kokiy kap chèche yon anyè ki gen yon dosye ègzèkutabl:

$ strace sh -c uname
...
stat("/home/user/bin/uname", 0x7ffceb817820) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/uname", 0x7ffceb817820) = -1 ENOENT (No such file or directory)
stat("/usr/bin/uname", {st_mode=S_IFREG|0755, st_size=39584, ...}) = 0
...

Euristik tankou "dènye demann echwe anvan rapòte yon erè" yo bon nan jwenn erè ki enpòtan. Kèlkeswa sa, li lojik pou kòmanse depi nan fen.

Leson patikilye pwogram C ka ede w konprann apèl sistèm yo.

Apèl estanda nan bibliyotèk C yo pa apèl sistèm, men se sèlman yon kouch sifas mens. Se konsa, si ou konprann omwen yon ti kras ki jan ak sa yo dwe fè nan C, li pral pi fasil pou ou konprann rezilta yo nan tras apèl sistèm lan. Pou egzanp, ou gen pwoblèm debogaj apèl nan sistèm rezo, gade nan menm klasik la Gid Bija pou pwogramasyon rezo.

Yon egzanp debogaj ki pi konplèks

Mwen deja di ke egzanp lan nan debogaj senp se yon egzanp sou sa mwen sitou gen fè fas ak lè w ap travay avèk yo strace. Sepandan, pafwa gen yon ankèt reyèl obligatwa, kidonk isit la nan yon egzanp lavi reyèl nan debogaj pi avanse.

bcron - Planifikatè pwosesis travay, yon lòt aplikasyon demon *nix la kron. Li enstale sou sèvè a, men lè yon moun ap eseye modifye orè a, sa k ap pase:

# crontab -e -u logs
bcrontab: Fatal: Could not create temporary file

Oke, sa vle di bcron te eseye ekri yon dosye sèten, men li pa t 'travay deyò, epi li pa pral admèt poukisa. Dekouvwi strace:

# strace -o /tmp/trace crontab -e -u logs
bcrontab: Fatal: Could not create temporary file
# cat /tmp/trace
...
openat(AT_FDCWD, "bcrontab.14779.1573691864.847933", O_RDONLY) = 3
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f82049b4000
read(3, "#Ansible: logsaggn20 14 * * * lo"..., 8192) = 150
read(3, "", 8192)                       = 0
munmap(0x7f82049b4000, 8192)            = 0
close(3)                                = 0
socket(AF_UNIX, SOCK_STREAM, 0)         = 3
connect(3, {sa_family=AF_UNIX, sun_path="/var/run/bcron-spool"}, 110) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f82049b4000
write(3, "156:Slogs #Ansible: logsaggn20 1"..., 161) = 161
read(3, "32:ZCould not create temporary f"..., 8192) = 36
munmap(0x7f82049b4000, 8192)            = 0
close(3)                                = 0
write(2, "bcrontab: Fatal: Could not creat"..., 49) = 49
unlink("bcrontab.14779.1573691864.847933") = 0
exit_group(111)                         = ?
+++ exited with 111 +++

Gen yon mesaj erè tou pre fen a ekri, men fwa sa a yon bagay diferan. Premyèman, pa gen okenn erè apèl sistèm enpòtan, ki anjeneral rive anvan sa a. Dezyèmman, li klè ke yon kote yon moun te deja li mesaj erè a. Li sanble ke pwoblèm reyèl la se yon lòt kote, ak bcrontab tou senpleman jwe tounen mesaj la.

Si ou gade man 2 li, ou ka wè ke premye agiman an (3) se yon deskriptè dosye, ki *nix itilize pou tout pwosesis I/O. Kouman pou mwen konnen ki sa deskriptè dosye 3 reprezante? Nan ka sa a patikilye, ou ka kouri strace ak operatè wi (gade pi wo a) epi li pral otomatikman di ou, men pou konnen bagay tankou sa a, li itil pou konnen ki jan yo li ak analize rezilta tras.

Sous yon deskriptè fichye kapab youn nan anpil apèl sistèm (li tout depann de sa deskriptè a se pou - yon konsole, yon priz rezo, dosye a li menm, oswa yon lòt bagay), men se pou sa, nou chèche pou. apèl pa retounen 3 (sa vle di nou chèche "= 3" nan rezilta trase yo). Nan rezilta sa a gen 2 nan yo: louvri nan tèt la anpil ak priz Nan mitan. louvri ouvri dosye a men fèmen(3) Lè sa a, pral montre ke li fèmen ankò. (Rake: deskriptè dosye yo ka itilize ankò lè yo louvri epi fèmen). Rele priz () apwopriye paske se dènye a anvan li (), epi li sanble ke bcrontab travay ak yon bagay atravè yon priz. Liy kap vini an montre ke deskriptè dosye a asosye ak priz domèn unix sou wout la /var/run/bcron-spool.

Se konsa, nou bezwen jwenn pwosesis ki asosye ak priz unix sou lòt bò a. Gen yon koup nan ke trik nouvèl pwòp pou objektif sa a, tou de nan yo ki itil pou deplwaman sèvè debogaj. Premye a se sèvi ak netstat oswa pi nouvo ss (estati priz). Tou de kòmandman montre koneksyon rezo aktif sistèm lan epi pran deklarasyon an -l pou dekri priz koute, osi byen ke operatè a -p pou montre pwogram ki konekte nan priz la kòm yon kliyan. (Genyen anpil plis opsyon itil, men de sa yo ase pou travay sa a.)

# ss -pl | grep /var/run/bcron-spool
u_str LISTEN 0   128   /var/run/bcron-spool 1466637   * 0   users:(("unixserver",pid=20629,fd=3))

Sa a sijere ke koute a se kòmandman an inixserver, kouri ak pwosesis ID 20629. (Epi, azar, li itilize deskriptè fichye 3 kòm priz la.)

Dezyèm zouti vrèman itil pou jwenn menm enfòmasyon yo rele lsof. Li bay lis tout fichye ouvè (oswa deskriptè dosye) sou sistèm nan. Oswa ou ka jwenn enfòmasyon sou yon dosye espesifik:

# lsof /var/run/bcron-spool
COMMAND   PID   USER  FD  TYPE  DEVICE              SIZE/OFF  NODE    NAME
unixserve 20629 cron  3u  unix  0x000000005ac4bd83  0t0       1466637 /var/run/bcron-spool type=STREAM

Pwosesis 20629 se yon sèvè ki dire lontan, kidonk ou ka tache li strace lè l sèvi avèk yon bagay tankou strace -o /tmp/trace -p 20629. Si ou modifye yon travay cron nan yon lòt tèminal, w ap resevwa yon pwodiksyon tras ak yon erè. Ak isit la se rezilta a:

accept(3, NULL, NULL)                   = 4
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7faa47c44810) = 21181
close(4)                                = 0
accept(3, NULL, NULL)                   = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=21181, si_uid=998, si_status=0, si_utime=0, si_stime=0} ---
wait4(0, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WNOHANG|WSTOPPED, NULL) = 21181
wait4(0, 0x7ffe6bc36764, WNOHANG|WSTOPPED, NULL) = -1 ECHILD (No child processes)
rt_sigaction(SIGCHLD, {sa_handler=0x55d244bdb690, sa_mask=[CHLD], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7faa47ab9840}, {sa_handler=0x55d244bdb690, sa_mask=[CHLD], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7faa47ab9840}, 8) = 0
rt_sigreturn({mask=[]})                 = 43
accept(3, NULL, NULL)                   = 4
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7faa47c44810) = 21200
close(4)                                = 0
accept(3, NULL, NULL)                   = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=21200, si_uid=998, si_status=111, si_utime=0, si_stime=0} ---
wait4(0, [{WIFEXITED(s) && WEXITSTATUS(s) == 111}], WNOHANG|WSTOPPED, NULL) = 21200
wait4(0, 0x7ffe6bc36764, WNOHANG|WSTOPPED, NULL) = -1 ECHILD (No child processes)
rt_sigaction(SIGCHLD, {sa_handler=0x55d244bdb690, sa_mask=[CHLD], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7faa47ab9840}, {sa_handler=0x55d244bdb690, sa_mask=[CHLD], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7faa47ab9840}, 8) = 0
rt_sigreturn({mask=[]})                 = 43
accept(3, NULL, NULL

(Dènye aksepte () p ap fini lè trase.) Ankò, malerezman, rezilta sa a pa genyen erè n ap chèche a. Nou pa wè okenn mesaj ke bcrontag voye oswa resevwa nan priz la. Olye de sa, konplete kontwòl pwosesis (script, tann4, SIGCHLD elatriye) Pwosesis sa a anjandre yon pwosesis timoun, ki, jan ou ta ka devine, fè travay la reyèl. Men, si ou bezwen trape santye li, ajoute nan apèl la strace -f. Sa a se sa nou pral jwenn lè nou rechèch pou mesaj la erè nan nouvo rezilta a ak strace -f -o /tmp/trace -p 20629:

21470 openat(AT_FDCWD, "tmp/spool.21470.1573692319.854640", O_RDWR|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied) 
21470 write(1, "32:ZCould not create temporary f"..., 36) = 36
21470 write(2, "bcron-spool[21470]: Fatal: logs:"..., 84) = 84
21470 unlink("tmp/spool.21470.1573692319.854640") = -1 ENOENT (No such file or directory)
21470 exit_group(111)                   = ?
21470 +++ exited with 111 +++

Koulye a, sa se yon bagay. Pwosesis 21470 resevwa yon erè "aksè refize" lè w ap eseye kreye yon fichye nan chemen an. tmp/spool.21470.1573692319.854640 (ki gen rapò ak anyè travay aktyèl la). Si nou jis te konnen aktyèl anyè k ap travay la, nou ta tou konnen chemen konplè a epi nou ta kapab konnen poukisa pwosesis la pa ka kreye dosye tanporè li nan li. Malerezman, pwosesis la te deja sòti, kidonk, ou pa ka jis itilize lsof -p 21470 yo nan lòd yo jwenn anyè aktyèl la, men ou ka travay nan direksyon opoze a - gade pou apèl sistèm PID 21470 ki chanje anyè a. (Si pa genyen, PID 21470 dwe eritye yo nan men paran li, epi sa a deja rive. lsof -p pa ka jwenn deyò.) Rele sistèm sa a se chdir (ki fasil pou chèche konnen avèk èd motè rechèch modèn sou entènèt). Ak isit la se rezilta rechèch ranvèse ki baze sou rezilta tras yo, tout wout la nan sèvè PID 20629:

20629 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7faa47c44810) = 21470
...
21470 execve("/usr/sbin/bcron-spool", ["bcron-spool"], 0x55d2460807e0 /* 27 vars */) = 0
...
21470 chdir("/var/spool/cron")          = 0
...
21470 openat(AT_FDCWD, "tmp/spool.21470.1573692319.854640", O_RDWR|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied) 
21470 write(1, "32:ZCould not create temporary f"..., 36) = 36
21470 write(2, "bcron-spool[21470]: Fatal: logs:"..., 84) = 84
21470 unlink("tmp/spool.21470.1573692319.854640") = -1 ENOENT (No such file or directory)
21470 exit_group(111)                   = ?
21470 +++ exited with 111 +++

(Si w pèdi, ou ta ka vle li pòs anvan mwen an sou jesyon pwosesis *nix ak kokiy.) Se konsa, sèvè PID 20629 la pa t resevwa pèmisyon pou kreye yon fichye nan chemen an /var/spool/cron/tmp/spool.21470.1573692319.854640. Gen plis chans, rezon ki fè sa a se anviwònman pèmisyon sistèm dosye klasik yo. Ann tcheke:

# ls -ld /var/spool/cron/tmp/
drwxr-xr-x 2 root root 4096 Nov  6 05:33 /var/spool/cron/tmp/
# ps u -p 20629
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
cron     20629  0.0  0.0   2276   752 ?        Ss   Nov14   0:00 unixserver -U /var/run/bcron-spool -- bcron-spool

Se la yo antere chen an! Sèvè a kouri kòm yon cron itilizatè, men se sèlman rasin ki gen pèmisyon pou ekri nan anyè a /var/spool/cron/tmp/. Senp kòmandman chown cron /var/spool/cron/tmp/ pral fòse bcron travay kòrèkteman. (Si sa pa t 'pwoblèm nan, Lè sa a, pwochen sispèk la ki gen plis chans se yon modil sekirite nwayo tankou SELinux oswa AppArmor, kidonk mwen ta tcheke boutèy demi lit mesaj nwayo a avèk dmesg.)

Nan total

Tras apèl sistèm yo ka akablan pou yon debutan, men mwen espere ke mwen te montre ke yo se yon fason rapid debogaj yon klas antye nan pwoblèm deplwaman komen. Imajine w ap eseye debogaj yon multiprosesis bcronlè l sèvi avèk yon deboge etap-pa-etap.

Analize rezilta tras bak sou chèn apèl sistèm lan mande pou konpetans, men jan mwen te di, prèske toujou, lè l sèvi avèk strace, Mwen jis jwenn rezilta tras la epi gade pou erè kòmanse nan fen an. Antouka, strace ede m ekonomize anpil tan sou debogaj. Mwen espere ke li pral itil ou tou.

Sous: www.habr.com

Add nouvo kòmantè