Debugging lako polokalamu me ka strace

Debugging lako polokalamu me ka strace

ʻO kaʻu hana o ka lā ka hapa nui o ka hoʻonohonoho polokalamu, ʻo ia ka mea e hoʻolilo nui au i ka manawa e hoʻāʻo ai e pane i nā nīnau e like me:

  • Hana kēia polokalamu no ka mea hoʻomohala, akā ʻaʻole iaʻu. No ke aha mai?
  • I nehinei ua hana kēia polokalamu iaʻu, akā i kēia lā ʻaʻole. No ke aha mai?

ʻO kēia keʻano o ka hoʻopiʻiʻana i kahiʻokoʻa iki mai ka hoʻopiʻi polokalamu maʻamau. ʻO ka debugging maʻamau e pili ana i ka loiloi o ke code, akā ʻo ka debugging deployment e pili ana i ka pilina ma waena o ke code a me ke kaiapuni. ʻOiai ʻo ke kumu o ka pilikia he hewa kūpono, ʻo ka ʻoiaʻiʻo o ka hana ʻana o nā mea āpau ma ka mīkini hoʻokahi a ʻaʻole ma kahi ʻē aʻe ke ʻano o ka pilikia ma ke kaiapuni.

No laila ma kahi o nā mea hana debugging maʻamau e like me gdb Loaʻa iaʻu kahi ʻano mea hana ʻē aʻe no ka debugging deployment. A ʻo kaʻu mea hana punahele no ka hoʻoponopono ʻana i ka pilikia e like me "No ke aha e hana ʻole ai kēia polokalamu iaʻu?" kāhea ʻia kaulaʻi.

He aha ka strace?

kaulaʻi he mea paahana no ka “track tracking system”. Ua hana mua ʻia no Linux, akā hiki ke hana ʻia nā hana hoʻopunipuni like me nā mea hana no nā ʻōnaehana ʻē aʻe (Hōʻailona ai ole ia, ktrace).

He maʻalahi loa ka noi kumu. Pono ʻoe e holo strace me kekahi kauoha a e hoʻolei ia i nā kelepona ʻōnaehana āpau (ʻoiai ʻo ka mua paha ʻoe e hoʻokomo iā ʻoe iho. kaulaʻi):

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

He aha kēia mau kelepona pūnaewele? He mea like kēia me kahi API no ka ʻōnaehana ʻōnaehana hana. I kekahi manawa, loaʻa pololei ka lako polokalamu i ka hāmeʻa i holo ai. Inā, no ka laʻana, pono ia e hōʻike i kekahi mea ma ka pale, ua pāʻani me nā awa a i ʻole nā ​​​​papa inoa palapala hoʻomanaʻo no nā polokalamu wikiō. I ka wā i kaulana ai nā ʻōnaehana kamepiula multitasking, ua noho aliʻi ka haunaele i ka hakakā ʻana o nā noi like ʻole ma luna o ka lako. Hiki i nā hewa i hoʻokahi noi ke hoʻohaʻahaʻa i nā mea ʻē aʻe, inā ʻaʻole ka ʻōnaehana holoʻokoʻa. A laila ua ʻike ʻia nā ʻano hiʻohiʻona (a i ʻole "ka pale ʻana i ke kani") i ka CPU. Ua lilo ka kernel i mea hoʻohanohano loa: ua loaʻa iā ia ke komo piha i ka hāmeʻa, e hoʻopuka ana i nā noi pono liʻiliʻi i koi mua i ke komo ʻana mai ka kernel e launa pū me ka lako ma o nā kelepona ʻōnaehana.

Ma ka pae binary, ʻokoʻa iki kahi kelepona ʻōnaehana mai kahi kelepona hana maʻalahi, akā hoʻohana ka hapa nui o nā polokalamu i kahi wīwī ma ka waihona maʻamau. ʻO kēlā mau. aia ka waihona maʻamau POSIX C i kahi kelepona hana kākau (), aia i loko o nā code kikoʻī kikoʻī a pau no ke kelepona ʻōnaehana kakau.

Debugging lako polokalamu me ka strace

I ka pōkole, hoʻokō ʻia kekahi pilina ma waena o kahi noi a me kona kaiapuni (nā ʻōnaehana kamepiula) ma o nā kelepona ʻōnaehana. No laila, ke hana ka polokalamu ma kekahi mīkini akā ʻaʻole ma kahi ʻē aʻe, he mea maikaʻi ke nānā aku i nā hopena hulina kelepona kelepona. ʻOi aku ka kikoʻī, eia kahi papa inoa o nā manawa maʻamau e hiki ke nānā ʻia me ka hoʻohana ʻana i kahi ʻōnaehana kelepona:

  • Console I/O
  • Pūnaewele I/O
  • Loaʻa i ka ʻōnaehana waihona a me ka faila I/O
  • Ka mālama ʻana i ke ola o kahi pae kaʻina hana
  • Hoʻoponopono hoʻomanaʻo haʻahaʻa haʻahaʻa
  • Loaʻa i nā mea hoʻokele ponoʻī

I ka manawa hea e hoʻohana ai i ka strace?

Ma ke kumumanaʻo, kaulaʻi hoʻohana ʻia me kekahi papahana ma kahi o ka mea hoʻohana, no ka mea, pono e hoʻohana ʻia kēlā me kēia papahana i nā mea hoʻohana i nā kelepona ʻōnaehana. ʻOi aku ka maikaʻi me nā papahana haʻahaʻa i hōʻuluʻulu ʻia, akā hana pū me nā ʻōlelo kiʻekiʻe e like me Python inā hiki iā ʻoe ke ʻoki i ka leo hou mai ka runtime a me ka unuhi ʻōlelo.

I kona nani a pau kaulaʻi Hōʻike ʻo ia iā ia iho i ka wā debugging o ka lako polokalamu e hana maikaʻi ana ma ka mīkini hoʻokahi, akā hoʻōki koke i ka hana ʻana ma kekahi, e hana ana i nā memo pohihihi e pili ana i nā faila, nā ʻae, a i ʻole nā ​​hoʻāʻo kūleʻa e hoʻokō i kekahi mau kauoha a i ʻole kekahi mea ʻē aʻe ... hui maikaʻi me nā pilikia kūlana kiʻekiʻe e like me nā hewa hōʻoia hōʻoia. ʻO ka mea maʻamau, pono kēia i kahi hui kaulaʻi, I kekahi manawa ltrace a me nā mea hana kiʻekiʻe (e like me ka mea hana laina kauoha openssl e hoʻopau i ka palapala hōʻoia).

E hoʻohana mākou i kahi kikowaena kūʻokoʻa ma ke ʻano he laʻana, akā hiki ke hana pinepine ʻia ka huli ʻana i nā kelepona ʻōnaehana ma nā kahua hoʻolaha paʻakikī. Pono wale ʻoe e koho i nā mea hana pono.

Laʻana debugging maʻalahi

E ʻōlelo mākou makemake ʻoe e holo i ka noi kikowaena kikowaena foo, a ʻo kēia ka mea āu e hoʻopau ai:

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

ʻAʻole hiki ke loaʻa ka faila hoʻonohonoho āu i kākau ai. Hana ʻia kēia no ka mea i kekahi manawa i ka wā e hōʻuluʻulu ai nā luna pūʻulu i kahi noi, hoʻopau lākou i nā wahi faila i manaʻo ʻia. A inā ʻoe e hahai i ke alakaʻi hoʻonohonoho no hoʻokahi mahele, ma kahi ʻē aʻe ʻike ʻoe i nā faila ʻokoʻa loa mai kahi āu i manaʻo ai. Hiki ke hoʻoholo ʻia ka pilikia i loko o ʻelua mau kekona inā haʻi ka memo hewa i kahi e ʻimi ai i ka faila hoʻonohonoho, akā ʻaʻole. No laila ma hea kahi e nānā ai?

Inā loaʻa iā ʻoe ke code kumu, hiki iā ʻoe ke heluhelu a ʻike i nā mea āpau. ʻO kahi hoʻolālā hoʻolālā maikaʻi, akā ʻaʻole ka hopena wikiwiki loa. Hiki iā ʻoe ke hoʻohana i kahi debugger step-by-step like gdb a ʻike i ka hana a ka papahana, akā ʻoi aku ka maikaʻi o ka hoʻohana ʻana i kahi hāmeʻa i hoʻolālā ʻia e hōʻike i ka pilina me ke kaiapuni: kaulaʻi.

hopena kaulaʻi Me he mea lā he mea ʻē aʻe, akā ʻo ka nūhou maikaʻi ʻo ka hapa nui o ia mea hiki ke mālama pono ʻia. Hoʻohana pinepine ʻia ka hoʻohana ʻana i ka mea hoʻohana -o e mālama i nā hopena trace i kahi faila ʻokoʻa:

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

Ma kahi o ka ʻaoʻao mua holoʻokoʻa o ka puka kaulaʻi - He hoʻomākaukau haʻahaʻa kēia no ka hoʻomaka ʻana. (Nui nā kelepona mmap, mprotec, quill no nā mea e like me ka ʻike ʻana i ka hoʻomanaʻo haʻahaʻa haʻahaʻa a me ka hōʻike ʻana i nā hale waihona puke kaulaʻi ʻOi aku ka maikaʻi o ka heluhelu ʻana mai ka hope loa. E loaʻa kahi pilikia ma lalo kakau, e hōʻike ana i kahi memo hewa. Nānā mākou i luna a ʻike i ke kelepona ʻōnaehana hewa mua - ke kelepona wehe ʻia, ka mea hoolei hewa ENOENT ("ʻaʻole i loaʻa ka waihona a i ʻole ka papa kuhikuhi") e hoʻāʻo nei e wehe /etc/foo/config.json. ʻO kēia kahi e pono ai ka faila hoʻonohonoho.

He laʻana wale nō kēia, akā e ʻōlelo wau he 90% o ka manawa aʻu e hoʻohana ai kaulaʻi, ʻaʻohe mea ʻoi aku ka paʻakikī e hana ma mua o kēia. Aia ma lalo iho kahi alakaʻi hoʻopau i kēlā me kēia ʻanuʻu:

  • E huhū ma muli o kahi leka uila e pili ana i kahi hewa system-y mai kahi papahana
  • Hoʻomaka hou i ka polokalamu me kaulaʻi
  • E ʻimi i ka memo hewa ma nā hualoaʻa
  • E piʻi kiʻekiʻe a hiki i ka wā e paʻi ai ʻoe i ke kelepona ʻōnaehana hāʻule mua

Malia paha e hōʻike ka ʻōnaehana kelepona ma ka ʻanuʻu 4 i ka mea i hewa.

Nā mea kōkua

Ma mua o ka hōʻike ʻana iā ʻoe i kahi laʻana o ka debugging paʻakikī, e hōʻike wau iā ʻoe i kekahi mau hoʻopunipuni no ka hoʻohana pono ʻana kaulaʻi:

ʻO ke kanaka kou hoaaloha

Ma nā ʻōnaehana *nix he nui, hiki ke loaʻa kahi papa inoa piha o nā kelepona ʻōnaehana i ka kernel ma ka holo ʻana kanaka syscalls. E ʻike ʻoe i nā mea like brk(2), 'o ia ho'i, hiki ke loa'a ka 'ike hou aku ma ka holo kanaka 2 brk.

rake liʻiliʻi: kanaka 2 ʻōpuʻu hōʻike mai iaʻu i ka ʻaoʻao no ka pūpū keola () в GNU libc, ka mea, ua hoʻokō 'ia ma ke kahea ana clone(). Kāhea i nā semantics ke'ō e like me ke kākau ʻana i kahi papahana me ka hoʻohana ʻana keola (), a holo i ka trace - ʻaʻole au e ʻike i nā kelepona ke'ō, ma kahi o lākou clone(). Hoʻopili wale ʻia kēlā mau rake iā ʻoe inā hoʻomaka ʻoe e hoʻohālikelike i ke kumu me ka hopena kaulaʻi.

E hoʻohana -o e mālama i ka hopena i kahi faila

kaulaʻi hiki ke hoʻopuka i nā huahana nui, no laila pono e mālama i nā hopena trace i nā faila ʻokoʻa (e like me ka laʻana ma luna). E kōkua pū kēia i ka pale ʻana i ka hoʻopuka ʻana o ka polokalamu me ka hoʻopuka kaulaʻi ma ka console.

E hoʻohana -s no ka ʻike ʻana i nā ʻikepili hoʻopaʻapaʻa hou aʻe

Ua ʻike paha ʻoe ʻaʻole i hōʻike ʻia ka hapa ʻelua o ka memo hewa ma ke ʻano o ka laʻana ma luna. No ka mea kaulaʻi Hōʻike ka default i nā 32 bytes mua o ka hoʻopaʻapaʻa string. Inā makemake ʻoe e ʻike hou aku, e hoʻohui i kekahi mea like -s 128 i ke kahea kaulaʻi.

-y e maʻalahi ka nānā ʻana i nā faila, nā kumu, a pēlā aku.

"He faila nā mea a pau" 'o ia ho'i 'o *nix nā pūnaewele e hana i nā I/O a pau me ka ho'ohana 'ana i nā mea wehewehe waihona, inā pili ia i ka faila a i 'ole ka pūnaewele a i 'ole nā ​​paipu interprocess. He mea maʻalahi kēia no ka hoʻolālā ʻana, akā paʻakikī ka mālama ʻana i nā mea e hana maoli ana ke ʻike ʻoe i nā mea maʻamau heluhelu и kakau ma ka ʻōnaehana kelepona i nā hopena.

Ma ka hoʻohui ʻana i kahi mea hoʻohana , e hooikaika oe kaulaʻi e hōʻike i kēlā me kēia file descriptor i ka hopena me kahi memo o kāna mea e kuhikuhi ai.

Hoʻopili i kahi kaʻina hana e holo nei me -p**

E like me kāu e ʻike ai mai ka laʻana ma lalo nei, i kekahi manawa pono ʻoe e ʻimi i kahi papahana e holo nei. Inā ʻike ʻia e holo ana ia e like me ke kaʻina hana 1337 (e ʻōlelo, mai ka puka ps), a laila hiki iā ʻoe ke ʻimi e like me kēia:

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

Pono paha ʻoe i nā kuleana kumu.

E hoʻohana -f e nānā i nā kaʻina hana keiki

kaulaʻi Ma ka paʻamau, hoʻokahi wale nō kaʻina hana. Inā hoʻopuka kēia kaʻina hana i nā kaʻina keiki, a laila hiki ke ʻike ʻia ke kelepona ʻōnaehana e hoʻoulu i ke kaʻina keiki, akā ʻaʻole e hōʻike ʻia nā kelepona ʻōnaehana o ke keiki.

Inā manaʻo ʻoe aia ka hewa i ke kaʻina hana keiki, e hoʻohana i ka ʻōlelo -f, e hiki ai i kēia ke ʻimi. ʻO ka haʻahaʻa o kēia, ʻo ka hoʻopuka e huikau hou iā ʻoe. I ka manawa kaulaʻi ʻimi i hoʻokahi kaʻina hana a i ʻole hoʻokahi pae, hōʻike ia i kahi kahawai o nā hanana kelepona. Ke ʻimi ʻo ia i nā kaʻina hana he nui i ka manawa hoʻokahi, ʻike paha ʻoe i ka hoʻomaka ʻana o kahi kelepona i keakea ʻia e kahi memo , a laila - he pūʻulu kelepona no nā lālā hoʻokō ʻē aʻe, a laila wale nō - ka hopena o ka mea mua <… hoʻomaka hou ke kelepona. A i ʻole e hoʻokaʻawale i nā hopena trace i nā faila like ʻole, me ka hoʻohana ʻana i ka mea hoʻohana -ff (nā kikoʻī ma alakaʻi ma kaulaʻi).

Kānā i nā meheu me -e

E like me kāu e ʻike ai, ʻo ka hopena o ka trace he puʻu maoli o nā kelepona ʻōnaehana āpau. Hae -e Hiki iā ʻoe ke kānana i ka trace (e nānā alakaʻi ma kaulaʻi). ʻO ka pōmaikaʻi nui, ʻoi aku ka wikiwiki o ka holo ʻana i kahi trace kānana ma mua o ka hana ʻana i kahi trace piha a laila ʻoliʻoli`ma. ʻO kaʻoiaʻiʻo, ʻaneʻane ʻaʻohe oʻu manaʻo.

ʻAʻole hewa nā hewa a pau

ʻO kahi laʻana maʻalahi a maʻamau he polokalamu e ʻimi ana i kahi faila ma nā wahi he nui i ka manawa hoʻokahi, e like me kahi pūpū e ʻimi ana i kahi papa kuhikuhi i loaʻa kahi faila hiki ke hoʻokō:

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

ʻO nā Heuristics e like me "noi hāʻule hope ma mua o ka hōʻike ʻana i kahi hewa" maikaʻi i ka ʻimi ʻana i nā hewa kūpono. E like me ia, he mea kūpono ke hoʻomaka mai ka hopena.

Hiki i nā haʻawina hoʻolālā C ke kōkua iā ʻoe e hoʻomaopopo i nā kelepona ʻōnaehana.

ʻAʻole kelepona ʻōnaehana nā kelepona maʻamau i nā hale waihona puke C, akā he ʻili ʻili lahilahi wale nō. No laila, inā maopopo ʻoe i ka liʻiliʻi pehea a me ka mea e hana ai ma C, e maʻalahi iā ʻoe ke hoʻomaopopo i nā hopena o ka ʻōnaehana kelepona. No ka laʻana, pilikia ʻoe i ka debugging kelepona i nā ʻōnaehana pūnaewele, e nānā i ka maʻamau like ʻO ke alakaʻi a Bija i ka hoʻolālā pūnaewele.

ʻO kahi laʻana debugging paʻakikī

Ua ʻōlelo mua wau ʻo ka hiʻohiʻona o ka debugging maʻalahi kahi hiʻohiʻona o ka mea aʻu e hana nui ai i ka wā e hana ai kaulaʻi. Eia nō naʻe, i kekahi manawa koi ʻia kahi hoʻokolokolo maoli, no laila eia kahi hiʻohiʻona maoli o ka debugging ʻoi aku ka holomua.

bcon - ka papa hana hoʻonohonoho hana, kahi hoʻokō ʻē aʻe o ka *nix daemon cron. Hoʻokomo ʻia ia ma ke kikowaena, akā ke hoʻāʻo kekahi e hoʻoponopono i ka papa kuhikuhi, eia ka mea e hana ai:

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

ʻAe, ʻo ia hoʻi bcon ua ho'āʻo e kākau i kekahi faila, akā ʻaʻole i holo, a ʻaʻole ʻo ia e ʻae i ke kumu. Ka wehe ʻana kaulaʻi:

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

Aia kahi memo hewa kokoke i ka hopena kakau, akā i kēia manawa he mea ʻokoʻa. ʻO ka mea mua, ʻaʻohe hewa kelepona ʻōnaehana pili, ka mea maʻamau ma mua o kēia. ʻO ka lua, ua maopopo ua heluhelu mua kekahi i ka memo hewa. Me he mea lā aia ma kahi ʻē ka pilikia maoli, a bcontab pāʻani wale i ka leka.

Inā ʻoe e nānā kanaka 2 heluhelu, hiki iā ʻoe ke ʻike i ka hoʻopaʻapaʻa mua (3) he file descriptor, kahi i hoʻohana ʻia e *nix no nā hana I/O āpau. Pehea au e ʻike ai i ke ʻano o ka faile descriptor 3? I kēia hihia kūikawā, hiki iā ʻoe ke holo kaulaʻi me ka mea hoʻohana (ʻike i luna) a e haʻi ʻokoʻa iā ʻoe, akā no ka ʻike ʻana i nā mea e like me kēia, pono e ʻike pehea e heluhelu ai a hoʻopaʻa i nā hopena trace.

ʻO ke kumu o kahi wehewehe faila hiki ke lilo i hoʻokahi o nā kelepona ʻōnaehana he nui (e pili ana ia i ke ʻano o ka wehewehe ʻana - he console, kahi kumu pūnaewele, kahi faila ponoʻī, a i ʻole kekahi mea ʻē aʻe), akā inā paha, ke ʻimi nei mākou. kelepona ma ka hoʻihoʻi ʻana i 3 (ʻo ia hoʻi. ʻimi mākou i "= 3" i nā hopena huli). I kēia hopena, aia 2 o lākou: wehe ʻia ma luna loa a kumu Ma ka waena. wehe ʻia wehe i ka faila akā kokoke(3) a laila e hōʻike i ka pani hou ʻana. (Rake: hiki ke hoʻohana hou ʻia nā mea wehewehe faila ke wehe ʻia a pani ʻia). Kāhea kumu () kūpono no ka mea ʻo ia ka mea hope ma mua heluhelu(), a ua hoʻololi ʻia ua hana ʻo bcontab me kekahi mea ma o kahi kumu. Hōʻike ka laina aʻe e pili ana ka wehewehe faila me unix domain socket ma ke ala /var/run/bcron-spool.

No laila, pono mākou e ʻimi i ke kaʻina hana e pili ana unix socket ma kela aoao. Aia kekahi mau hoʻopunipuni maʻemaʻe no kēia kumu, pono ia mau mea ʻelua no ka debugging server deployments. ʻO ka mea mua e hoʻohana Netstat a i ʻole ka mea hou aku ss (kūlana socket). Hōʻike nā kauoha ʻelua i nā pilina pūnaewele ikaika o ka ʻōnaehana a lawe i ka ʻōlelo -l e wehewehe i nā kumu hoʻolohe, a me ka mea hoʻohana -p e hōʻike i nā polokalamu i pili i ke kumu ma ke ʻano he mea kūʻai aku. (He nui nā koho kūpono, akā ua lawa kēia mau mea ʻelua no kēia hana.)

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

Hōʻike kēia ʻo ka mea hoʻolohe ke kauoha inixserver, e holo ana me ke kaʻina hana ID 20629. (A, coincidentally, hoʻohana ia i ka file descriptor 3 ma ke kumu.)

Ua kapa ʻia ka lua o ka mea hana pono no ka ʻike ʻana i ka ʻike like lsof. Hoʻopaʻa inoa ia i nā faila wehe (a i ʻole nā ​​​​descriptors file) ma ka ʻōnaehana. A i ʻole hiki iā ʻoe ke loaʻa ka ʻike e pili ana i kahi faila kikoʻī:

# 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

ʻO ke kaʻina hana 20629 kahi kikowaena lōʻihi, no laila hiki iā ʻoe ke hoʻopili iā ia kaulaʻi hoʻohana i kekahi mea like strace -o /tmp/trace -p 20629. Inā hoʻoponopono ʻoe i kahi hana cron ma kahi pahu ʻē aʻe, e loaʻa iā ʻoe kahi hopena trace me kahi hewa. A eia ka hopena:

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

(Ka hope ʻae () ʻaʻole e hoʻopau ʻia ke ʻimi ʻana.) Eia hou, ʻaʻole i loaʻa i kēia hopena ka hewa a mākou e ʻimi nei. ʻAʻole mākou ʻike i nā memo a bcontag e hoʻouna ai a loaʻa mai paha mai ke kumu. Akā, e hoʻopau i ke kaʻina hana (clone, kali4, SIGCHLD etc.) Hoʻopuka kēia kaʻina hana i kahi kaʻina keiki, e like me kāu e manaʻo ai, hana i ka hana maoli. A inā pono ʻoe e hopu i kona ala, e hoʻohui i ke kelepona strace -f. ʻO kēia ka mea e loaʻa iā mākou ke ʻimi mākou i ka memo hewa i ka hopena hou me ka 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 +++

I kēia manawa, he mea kēlā. Loaʻa ke kaʻina hana 21470 i kahi hewa "hōʻole ʻia" ke hoʻāʻo nei e hana i kahi faila ma ke ala tmp/spool.21470.1573692319.854640 (e pili ana i ka papa kuhikuhi hana o kēia manawa). Inā ʻike wale mākou i ka papa kuhikuhi hana o kēia manawa, ʻike mākou i ke ala piha a hiki iā mākou ke noʻonoʻo i ke kumu ʻaʻole hiki i ke kaʻina hana ke hana i kāna faila manawaleʻa i loko. ʻO ka mea pōʻino, ua pau ke kaʻina hana, no laila ʻaʻole hiki iā ʻoe ke hoʻohana wale lsof -p 21470 i mea e ʻike ai i ka papa kuhikuhi o kēia manawa, akā hiki iā ʻoe ke hana ma ka ʻaoʻao ʻē aʻe - e ʻimi i nā kelepona ʻōnaehana PID 21470 e hoʻololi i ka papa kuhikuhi. (Inā ʻaʻohe, PID 21470 i hoʻoili iā lākou mai kona makua mai, a ua pau kēia lsof -p ʻAʻole hiki ke ʻike ʻia.) ʻO kēia kelepona ʻōnaehana chdir (he mea maʻalahi ke ʻike me ke kōkua o nā ʻenekini huli pūnaewele hou). A eia ka hopena o nā huli hulina e pili ana i nā hopena trace, a hiki i ka 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 +++

(Inā nalowale ʻoe, makemake paha ʻoe e heluhelu i kaʻu pou mua e pili ana i ka hoʻokele kaʻina hana nix a me nā pūpū.) No laila, ʻaʻole i loaʻa i ka server PID 20629 ka ʻae e hana i kahi faila ma ke ala /var/spool/cron/tmp/spool.21470.1573692319.854640. ʻO ka mea maʻamau, ʻo ke kumu o kēia ka hoʻonohonoho ʻae ʻōnaehana faila maʻamau. E nānā kākou:

# 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

Ma laila e kanu ʻia ai ka ʻīlio! Ke holo nei ke kikowaena ma ke ʻano he cron mea hoʻohana, akā ʻo ke kumu wale nō ka ʻae e kākau i ka papa kuhikuhi /var/spool/cron/tmp/. Kauoha maʻalahi chown cron /var/spool/cron/tmp/ e hooikaika bcon hana pololei. (Inā ʻaʻole ia ka pilikia, a laila ʻo ka mea i manaʻo ʻia he ʻōnaehana palekana kernel e like me SELinux a i ʻole AppArmor, no laila e nānā wau i ka log memo kernel me dmesg.)

Hōʻuluʻulu

Hiki ke paʻakikī nā ʻōkuhi kelepona pūnaewele no ka mea hoʻomaka, akā ke manaʻo nei au ua hōʻike wau he ala wikiwiki lākou e debug i kahi papa holoʻokoʻa o nā pilikia deployment maʻamau. E noʻonoʻo i ka hoʻāʻo ʻana e debug i kahi multiprocess bconme ka hoʻohana ʻana i kahi mea hoʻopau i kēlā me kēia pae.

ʻO ka hoʻopaʻa ʻana i nā hopena i hope ma ke kaulahao kelepona ʻōnaehana pono ke akamai, akā e like me kaʻu i ʻōlelo ai, aneane mau, hoʻohana kaulaʻi, Loaʻa iaʻu ka hopena trace a nānā i nā hewa e hoʻomaka ana mai ka hopena. Eia naʻe, kaulaʻi kōkua iaʻu e mālama i ka manawa nui ma ka debugging. Manaʻo wau he mea pono ia iā ʻoe.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka