Debugging iskjerament ta 'softwer ma strace

Debugging iskjerament ta 'softwer ma strace

Ix-xogħol tiegħi ta' kuljum huwa l-aktar użu ta' softwer, li jfisser li nqatta' ħafna ħin nipprova nwieġeb mistoqsijiet bħal:

  • Dan is-software jaħdem għall-iżviluppatur, iżda mhux għalija. Għaliex?
  • Ilbieraħ dan is-software ħadem għalija, iżda llum ma jaħdimx. Għaliex?

Dan huwa tip ta 'debugging li huwa kemmxejn differenti minn debugging tas-softwer regolari. Id-debugging regolari huwa dwar il-loġika tal-kodiċi, iżda d-debugging tal-iskjerament huwa dwar l-interazzjoni bejn il-kodiċi u l-ambjent. Anke jekk l-għerq tal-problema huwa żball loġiku, il-fatt li kollox jaħdem fuq magna waħda u mhux fuq oħra jfisser li l-problema hija b'xi mod fl-ambjent.

Allura minflok l-għodod tas-soltu debugging simili gdb Għandi sett differenti ta 'għodod għall-iskjerament tad-debugging. U l-għodda favorita tiegħi biex nittratta l-problema bħal "Għaliex dan is-software ma jaħdimx għalija?" imsejħa strace.

X'inhu strace?

strace hija għodda għal "traċċar tas-sejħa tas-sistema". Oriġinarjament inħoloq għal Linux, iżda l-istess tricks ta' debugging jistgħu jsiru b'għodod għal sistemi oħra (DTrace jew ktrace).

L-applikazzjoni bażika hija sempliċi ħafna. Għandek bżonn biss li tmexxi strace ma 'kwalunkwe kmand u se tiżżarma s-sejħiet tas-sistema kollha (għalkemm l-ewwel probabilment ikollok tinstallah lilek innifsek 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 +++

X'inhuma dawn is-sejħiet tas-sistema? Din hija xi ħaġa bħal API għall-qalba tas-sistema operattiva. Darba, is-softwer kellu aċċess dirett għall-ħardwer li kien jaħdem fuqu. Jekk, pereżempju, kellha bżonn turi xi ħaġa fuq l-iskrin, kellha b'portijiet jew reġistri mappjati bil-memorja għal apparati tal-vidjo. Meta s-sistemi tal-kompjuter b'multitasking saru popolari, il-kaos kien issaltan hekk kif diversi applikazzjonijiet iġġieldu fuq il-ħardwer. Żbalji f'applikazzjoni waħda jistgħu jbaxxu oħrajn, jekk mhux is-sistema kollha. Imbagħad modi ta 'privileġġ (jew "protezzjoni taċ-ċirku") dehru fis-CPU. Il-qalba saret l-aktar privileġġata: irċieva aċċess sħiħ għall-ħardwer, u b'hekk nissel applikazzjonijiet inqas privileġġjati li diġà kellhom jitolbu aċċess mill-qalba biex jinteraġixxu mal-ħardwer permezz ta' sejħiet tas-sistema.

Fil-livell binarju, sejħa tas-sistema hija kemmxejn differenti minn sejħa ta 'funzjoni sempliċi, iżda l-biċċa l-kbira tal-programmi jużaw tgeżwir fil-librerija standard. Dawk. il-librerija standard POSIX C fiha sejħa tal-funzjoni ikteb (), li fih il-kodiċi kollu speċifiku għall-arkitettura għas-sejħa tas-sistema jiktbu.

Debugging iskjerament ta 'softwer ma strace

Fil-qosor, kwalunkwe interazzjoni bejn applikazzjoni u l-ambjent tagħha (sistemi tal-kompjuter) titwettaq permezz ta 'sejħiet tas-sistema. Għalhekk, meta s-softwer jaħdem fuq magna waħda iżda mhux fuq oħra, ikun tajjeb li tħares lejn ir-riżultati tat-traċċar tas-sejħa tas-sistema. B'mod aktar speċifiku, hawn lista ta 'punti tipiċi li jistgħu jiġu analizzati bl-użu ta' traċċa tas-sejħa tas-sistema:

  • Console I/O
  • I/O tan-netwerk
  • Aċċess għas-sistema tal-fajls u l-I/O tal-fajls
  • Ġestjoni tal-ħajja ta 'ħajt ta' proċess
  • Ġestjoni tal-memorja ta 'livell baxx
  • Aċċess għal sewwieqa ta' apparat speċifiku

Meta tuża strace?

Fit-teorija, strace użat ma 'kwalunkwe programm fl-ispazju tal-utent, minħabba li kwalunkwe programm fl-ispazju tal-utent għandu jagħmel sejħiet tas-sistema. Jaħdem b'mod aktar effiċjenti bi programmi kkompilati ta' livell baxx, iżda jaħdem ukoll b'lingwi ta' livell għoli bħal Python jekk tista' taqta' l-istorbju addizzjonali mir-runtime u l-interpretu.

Fil-glorja kollha tagħha strace timmanifesta ruħha waqt id-debugging ta' softwer li jaħdem tajjeb fuq magna waħda, iżda f'daqqa waħda jieqaf jaħdem fuq oħra, jipproduċi messaġġi vagi dwar fajls, permessi, jew tentattivi bla suċċess biex tesegwixxi xi kmandi jew xi ħaġa oħra... Hija ħasra, iżda ma tagħmilx hekk jikkombinaw hekk tajjeb ma 'problemi ta' livell għoli bħal żbalji ta 'verifika taċ-ċertifikat. Normalment dan jeħtieġ taħlita stracekultant ltraċċa u għodod ta' livell ogħla (bħall-għodda tal-linja tal-kmand OpenSSL biex tiddibaggja ċ-ċertifikat).

Aħna ser nużaw server waħdu bħala eżempju, iżda l-intraċċar tas-sejħiet tas-sistema spiss jista 'jsir fuq pjattaformi ta' skjerament aktar kumplessi. Għandek bżonn biss li tagħżel l-għodda t-tajba.

Eżempju ta' debugging sempliċi

Ejja ngħidu li trid tmexxi l-aqwa applikazzjoni tas-server foo, u dan huwa dak li tispiċċa bih:

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

Apparentement ma setgħetx issib il-fajl tal-konfigurazzjoni li ktibt. Dan jiġri minħabba li xi drabi meta l-maniġers tal-pakketti jikkompilaw applikazzjoni, jegħlbu l-postijiet tal-fajl mistennija. U jekk issegwi l-gwida tal-installazzjoni għal distribuzzjoni waħda, f'oħra ssib fajls kompletament differenti minn fejn stennejt. Il-problema tista 'tiġi solvuta fi ftit sekondi jekk il-messaġġ ta' żball qal fejn għandek tfittex il-fajl tal-konfigurazzjoni, iżda ma jagħmilx hekk. Allura fejn tfittex?

Jekk għandek aċċess għall-kodiċi tas-sors, tista 'taqrah u ssir taf kollox. Pjan ta 'backup tajjeb, iżda mhux l-aktar soluzzjoni mgħaġġla. Tista 'tirrikorri għal debugger pass pass simili gdb u ara x'jagħmel il-programm, iżda huwa ħafna aktar effettiv li tuża għodda li hija mfassla speċifikament biex turi l-interazzjoni mal-ambjent: strace.

Output strace jista 'jidher żejda, iżda l-aħbar it-tajba hija li ħafna minnha tista' tiġi injorata mingħajr periklu. Ħafna drabi huwa utli li tuża l-operatur -o biex issalva r-riżultati tat-traċċa f'fajl separat:

$ 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 +++

Madwar l-ewwel paġna kollha tal-output strace - Din hija ġeneralment tħejjija ta 'livell baxx għat-tnedija. (Ħafna sejħiet mmap, mprotect, quill għal affarijiet bħall-iskoperta ta 'memorja ta' livell baxx u l-wiri ta 'libreriji dinamiċi.) Attwalment, waqt id-debugging tal-output strace Huwa aħjar li taqra mill-aħħar nett. Se jkun hemm sfida hawn taħt jiktbu, li juri messaġġ ta' żball. Inħarsu hawn fuq u naraw l-ewwel sejħa tas-sistema żbaljata - is-sejħa openat, li tarmi żball ENOENT (“fajl jew direttorju ma nstabx”) qed jipprova jiftaħ /etc/foo/config.json. Dan huwa fejn għandu jkun il-fajl tal-konfigurazzjoni.

Dan kien biss eżempju, imma jien ngħid 90% tal-ħin li nuża strace, m'hemm xejn aktar diffiċli li tagħmel minn dan. Hawn taħt hawn gwida kompleta ta' debugging pass pass:

  • Iddejjaq minħabba messaġġ vag dwar żball tas-sistema minn programm
  • Ibda mill-ġdid il-programm bi strace
  • Sib il-messaġġ ta 'żball fir-riżultati tat-traċċa
  • Mur ogħla sakemm tolqot l-ewwel sejħa tas-sistema falluta

Huwa probabbli ħafna li s-sejħa tas-sistema fil-pass 4 tiżvela dak li mar ħażin.

Għajnuniet

Qabel nuruk eżempju ta 'debugging aktar kumpless, ser nuruk ftit tricks għal użu effettiv strace:

il-bniedem huwa ħabib tiegħek

Fuq ħafna sistemi *nix, lista kompluta ta 'sejħiet tas-sistema lill-kernel tista' tinkiseb billi taħdem bniedem syscalls. Int ser tara affarijiet simili brk (2), li jfisser aktar informazzjoni tista 'tinkiseb billi taħdem man 2 brk.

Rake żgħir: man 2 furketta jurini l-paġna għall-qoxra furketta () в GNU libc, li, jirriżulta, hija implimentata billi ssejjaħ klonu (). Semantika tas-sejħa furketta jibqa l-istess jekk tikteb programm bl-użu furketta (), u mexxi traċċa - ma nsib l-ebda telefonata furketta, minflokhom se jkun hemm klonu (). Rakes bħal dawn iħawduk biss jekk tibda tqabbel is-sors mal-output strace.

Uża -o biex issalva l-output għal fajl

strace jista 'jiġġenera output estensiv, għalhekk ħafna drabi huwa utli li taħżen ir-riżultati tat-traċċa f'fajls separati (bħal fl-eżempju ta' hawn fuq). Dan jgħin ukoll biex jiġi evitat li l-output tal-programm jiġi konfuż mal-output strace fil-console.

Uża -s biex tara aktar dejta tal-argument

Jista 'jkollok innotajt li t-tieni nofs tal-messaġġ ta' żball mhuwiex muri fit-traċċa eżempju ta 'hawn fuq. Huwa għaliex strace default turi biss l-ewwel 32 byte tal-argument string. Jekk trid tara aktar, żid xi ħaġa simili -s 128 għas-sejħa strace.

-y jagħmilha aktar faċli biex jintraċċaw fajls, sokits, eċċ.

"Kollox huwa fajl" tfisser li s-sistemi *nix jagħmlu l-I/O kollha bl-użu ta' deskritturi tal-fajls, kemm jekk dan japplika għal fajl jew netwerk jew pajpijiet ta' interproċess. Dan huwa konvenjenti għall-ipprogrammar, iżda jagħmilha diffiċli biex iżżomm kont ta 'dak li verament jiġri meta tara komuni taqra и jiktbu fir-riżultati tat-traċċa tas-sejħa tas-sistema.

Billi żżid operatur yeah, inti se seħħ strace annota kull deskrittur tal-fajl fl-output b'nota ta' dak li jindika.

Waħħal ma' proċess li diġà qed jaħdem b'-p**

Kif se tara mill-eżempju t'hawn taħt, xi drabi jkollok bżonn traċċa programm li diġà qed jaħdem. Jekk ikun magħruf li qed jaħdem bħala proċess 1337 (jiġifieri, mill-output ps), allura tista’ tintraċċah bħal dan:

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

Jista 'jkollok bżonn id-drittijiet tal-għeruq.

Uża -f biex tissorvelja l-proċessi tat-tfal

strace B'mod awtomatiku, traċċa proċess wieħed biss. Jekk dan il-proċess ibid proċessi tat-tfal, allura s-sejħa tas-sistema biex ibid il-proċess tat-tfal tista 'tidher, iżda s-sejħiet tas-sistema tal-proċess tat-tfal mhux se jintwerew.

Jekk taħseb li l-iżball huwa fi proċess tat-tfal, uża d-dikjarazzjoni -f, dan se jippermetti t-traċċar tiegħu. L-iżvantaġġ għal dan huwa li l-output se jħawduk saħansitra aktar. Meta strace traċċi proċess wieħed jew ħajt wieħed, juri fluss wieħed ta 'avvenimenti ta' sejħa. Meta traċċa proċessi multipli f'daqqa, tista 'tara l-bidu ta' sejħa interrotta minn messaġġ , imbagħad - mazz ta 'sejħiet għal fergħat oħra ta' eżekuzzjoni, u mbagħad biss - it-tmiem ta 'l-ewwel waħda <...foocall reġa' kompliet>. Jew jaqsam ir-riżultati kollha tat-traċċa f'fajls differenti, bl-użu wkoll tal-operatur -ff (dettalji f' tmexxija fuq strace).

Iffiltra traċċi billi tuża -e

Kif tistgħu taraw, ir-riżultat tat-traċċa huwa munzell reali tas-sejħiet kollha possibbli tas-sistema. Bandiera -e Tista’ tiffiltra t-traċċa (ara gwida fuq strace). Il-vantaġġ ewlieni huwa li huwa aktar mgħaġġel li tmexxi traċċa ffiltrata milli tagħmel traċċa sħiħa u mbagħad grep`fl. Biex inkun onest, kważi dejjem ma jimpurtaniex.

Mhux l-iżbalji kollha huma ħżiena

Eżempju sempliċi u komuni huwa programm li jfittex fajl f'diversi postijiet f'daqqa, bħal qoxra tfittex direttorju li fih fajl eżekutibbli:

$ 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
...

Euristiċi bħal "l-aħħar talba falluta qabel ma tirrapporta żball" huma tajbin biex isibu żbalji rilevanti. Tkun kif tkun, huwa loġiku li tibda mill-aħħar nett.

Tutorials tal-ipprogrammar C jistgħu jgħinuk tifhem is-sejħiet tas-sistema.

Sejħiet standard għal libreriji C mhumiex sejħiet tas-sistema, iżda biss saff tal-wiċċ irqiq. Għalhekk, jekk tifhem mill-inqas ftit kif u x'għandek tagħmel f'C, ikun aktar faċli għalik li tifhem ir-riżultati tat-traċċa tas-sejħa tas-sistema. Per eżempju, għandek problemi biex tiddibaggja sejħiet għal sistemi tan-netwerk, ħares lejn l-istess klassika Gwida ta' Bija għall-Programmazzjoni tan-Netwerk.

Eżempju ta' debugging aktar kumpless

Diġà għedt li l-eżempju ta’ debugging sempliċi huwa eżempju ta’ dak li l-aktar ikolli nittratta miegħu meta naħdem miegħu strace. Madankollu, xi drabi tkun meħtieġa investigazzjoni reali, għalhekk hawn eżempju tal-ħajja reali ta 'debugging aktar avvanzat.

bcron - Scheduler tal-ipproċessar tal-kompiti, implimentazzjoni oħra tad-daemon *nix Cron. Huwa installat fuq is-server, iżda meta xi ħadd jipprova jeditja l-iskeda, dan huwa dak li jiġri:

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

Okay, dan ifisser bcron ipprova jikteb ċertu fajl, iżda ma ħadmitx, u mhux se jammetti għaliex. Kixef 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 +++

Hemm messaġġ ta 'żball qrib l-aħħar nett jiktbu, imma din id-darba xi ħaġa hija differenti. L-ewwel, m'hemm l-ebda żball rilevanti tas-sejħa tas-sistema, li normalment iseħħ qabel dan. It-tieni nett, huwa ċar li xi mkien xi ħadd diġà qara l-messaġġ ta 'żball. Jidher li l-problema reali hija x'imkien ieħor, u bcrontab sempliċiment jilgħab lura l-messaġġ.

Jekk tħares lejn man 2 aqra, tista 'tara li l-ewwel argument (3) huwa deskrittur tal-fajl, li *nix juża għall-ipproċessar I/O kollu. Kif nista' nsib liema deskrittur tal-fajl jirrappreżenta 3? F'dan il-każ partikolari, tista 'taħdem strace mal-operatur yeah (ara hawn fuq) u awtomatikament jgħidlek, iżda biex insemmu ħwejjeġ bħal dan, huwa utli li tkun taf kif taqra u teżamina r-riżultati tat-traċċa.

Is-sors ta' deskrittur tal-fajl jista' jkun wieħed minn ħafna sejħiet tas-sistema (kollox jiddependi fuq għalxiex ikun id-deskrittur - console, socket tan-netwerk, il-fajl innifsu, jew xi ħaġa oħra), iżda tkun kif tkun, infittxu sejħiet billi nirritornaw 3 (jiġifieri nfittxu "= 3" fir-riżultati tat-traċċar). F'dan ir-riżultat hemm 2 minnhom: openat fil-quċċata u sokit Fin-nofs. openat jiftaħ il-fajl iżda qrib(3) imbagħad juri li jerġa' jagħlaq. (Rake: deskritturi tal-fajls jistgħu jerġgħu jintużaw meta jinfetħu u jingħalqu). Ċempel sokit () addattat għax huwa l-aħħar wieħed qabel aqra (), u jirriżulta li bcrontab jaħdem ma 'xi ħaġa permezz ta' socket. Il-linja li jmiss turi li d-deskrittur tal-fajl huwa assoċjat miegħu socket tad-dominju unix fit-triq /var/run/bcron-spool.

Għalhekk, irridu nsibu l-proċess assoċjat ma ' sokit unix in-naħa l-oħra. Hemm ftit tricks puliti għal dan il-għan, li t-tnejn huma utli għall-iskjeramenti ta 'server debugging. L-ewwel huwa li tuża netstat jew aktar ġodda ss (status socket). Iż-żewġ kmandi juru l-konnessjonijiet tan-netwerk attivi tas-sistema u jieħdu d-dikjarazzjoni -l biex jiddeskrivi s-sokits tas-smigħ, kif ukoll l-operatur -p biex juri programmi konnessi mas-socket bħala klijent. (Hemm ħafna aktar għażliet utli, iżda dawn it-tnejn huma biżżejjed għal dan il-kompitu.)

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

Dan jissuġġerixxi li s-semmiegħ huwa l-kmand inixserver, li jaħdem bl-ID tal-proċess 20629. (U, b'kumbinazzjoni, juża d-deskrittur tal-fajl 3 bħala s-socket.)

It-tieni għodda tassew utli biex tinstab l-istess informazzjoni tissejjaħ lsof. Jelenka l-fajls kollha miftuħa (jew deskritturi tal-fajls) fis-sistema. Jew tista' tikseb informazzjoni dwar fajl speċifiku wieħed:

# 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

Il-Proċess 20629 huwa server ta' ħajja twila, sabiex tkun tista' tehmeż miegħu strace tuża xi ħaġa simili strace -o /tmp/trace -p 20629. Jekk teditja xogħol cron f'terminal ieħor, tirċievi output ta 'traċċa bi żball. U hawn hu r-riżultat:

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

(L-aħħar aċċetta () mhux se jitlesta meta jittraċċa.) Għal darb'oħra, sfortunatament, dan ir-riżultat ma fihx l-iżball li qed infittxu. Aħna ma naraw l-ebda messaġġ li bcrontag jibgħat lil jew jirċievi mis-socket. Minflok, tlesti l-kontroll tal-proċess (klonu, stenna4, SIGCHLD eċċ.) Dan il-proċess ibid proċess tat-tfal, li, kif tista' taħsbu, jagħmel ix-xogħol reali. U jekk għandek bżonn taqbad it-traċċa tagħha, żid mas-sejħa strace -f. Dan huwa dak li se nsibu meta nfittxu l-messaġġ ta 'żball fir-riżultat il-ġdid bi 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 +++

Issa, dik hija xi ħaġa. Il-proċess 21470 jirċievi żball ta' "aċċess miċħud" meta jipprova joħloq fajl fil-mogħdija tmp/spool.21470.1573692319.854640 (relatat mad-direttorju tax-xogħol attwali). Kieku nafu biss id-direttorju tax-xogħol attwali, inkunu nafu wkoll it-triq sħiħa u nkunu nistgħu nifhmu għaliex il-proċess ma jistax joħloq il-fajl temporanju tiegħu fih. Sfortunatament, il-proċess diġà ħareġ, għalhekk ma tistax tuża biss lsof -p 21470 sabiex issib id-direttorju attwali, iżda tista 'taħdem fid-direzzjoni opposta - tfittex sejħiet tas-sistema PID 21470 li jibdlu d-direttorju. (Jekk ma jkun hemm l-ebda, PID 21470 għandu jkun wirethom mill-ġenitur tiegħu, u dan diġà huwa permezz lsof -p ma jistax jinstab.) Din is-sistema tas-sejħa hija chdir (li huwa faċli biex issir taf bl-għajnuna ta 'magni tat-tiftix online moderni). U hawn huwa r-riżultat ta 'tfittxijiet inversi bbażati fuq ir-riżultati tat-traċċa, it-triq kollha lejn is-server 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 +++

(Jekk int mitluf, tista' tkun trid taqra l-post preċedenti tiegħi dwar il-ġestjoni tal-proċess *nix u l-qxur.) Allura, is-server PID 20629 ma rċievax permess biex joħloq fajl fil-mogħdija /var/spool/cron/tmp/spool.21470.1573692319.854640. Ħafna probabbli, ir-raġuni għal dan hija l-issettjar tal-permess tas-sistema tal-fajls klassika. Ejja niċċekkjaw:

# 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

Hemmhekk huwa midfun il-kelb! Is-server jaħdem bħala utent cron, iżda root biss għandu l-permess li jikteb fid-direttorju /var/spool/cron/tmp/. Kmand sempliċi chown cron /var/spool/cron/tmp/ se seħħ bcron taħdem b'mod korrett. (Jekk dik ma kinitx il-problema, allura l-aktar suspettat probabbli li jmiss huwa modulu tas-sigurtà tal-kernel bħal SELinux jew AppArmor, għalhekk niċċekkja l-log tal-messaġġi tal-kernel b' dmesg.)

B'kollox

It-traċċi tas-sejħiet tas-sistema jistgħu jkunu kbar għal min jibda, imma nispera li wrejt li huma mod rapidu biex tiddibaggja klassi sħiħa ta 'problemi ta' skjerament komuni. Immaġina li tipprova tiddibaggja multiproċess bcronbl-użu ta' debugger pass pass.

L-analiżi tar-riżultati tat-traċċa lura tul il-katina tas-sejħa tas-sistema teħtieġ ħila, iżda kif għidt, kważi dejjem, bl-użu strace, Nirċievi biss ir-riżultat tat-traċċa u nfittex żbalji li jibdew mill-aħħar. Xorta waħda, strace jgħinni jiffranka ħafna ħin fuq id-debugging. Nispera li tkun utli għalik ukoll.

Sors: www.habr.com

Żid kumment