Enye i-Heisenbug enye idlula ingwenya

Enye i-Heisenbug enye idlula ingwenya

$> set -o pipefail

$> fortune | head -1 > /dev/null && echo "ПовСзло!" || echo "Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ"
ПовСзло!

$> fortune | head -1 > /dev/null && echo "ПовСзло!" || echo "Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ"
Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ

kuyinto fortune inkqubo enemiqathango ngaphandle exit(rand()).

Ngaba unokucacisa? yintoni engalunganga apha?

Ukuphambuka ngokwembali ngokwelizwi

Ndaqala ukuqhelana nale Heisenbug kwikota yenkulungwane eyadlulayo. Ke kwisango kwiFaxNET bekuyimfuneko ukwenza izinto ezininzi nge iipayipi "ukudlala iitshekhi" phantsi kweFreeBSD. Njengoko bekulindelekile, bendizithatha njengeprogramu ephuhlileyo kwaye enamava ngokufanelekileyo. Ke ngoko, bendizimisele ukwenza yonke into ngocoselelo nangenyameko kangangoko, ndinike ingqwalasela eyodwa ekuphatheni iimpazamo...

Amava am angaphambili okujongana ne-bugs kwi-sendmail kunye ne-uucp / uupc yongeza kwinkuthalo yam "yokuphatha iimpazamo ngokucokisekileyo." Akukho sizathu sokuntywila kwiinkcukacha zelo bali, kodwa ndazabalaza nale Heisenbug iiveki ezimbini kwiiyure ze-10-14. Ngoko ke, yakhunjulwa, kwaye izolo lo mntu wakudala wadlula ukuze atyelele kwakhona.

TL;DR Impendulo

Uncedo head kungaba vala itshaneli ukusuka fortune kwangoko nje ukuba efunde umgca wokuqala. Ukuba fortune ikhupha ngaphezu kwelayini enye, emva koko ifowuno ehambelanayo write() izakubuyisela imposiso okanye inike ingxelo yokuba zimbalwa ii-bytes eziphumayo kuneziceliweyo. Ngokulandelayo, ibhalwe ngokuphathwa kwempazamo ngononophelo fortune inelungelo lokubonisa le meko kwimeko yayo yokuphuma. Emva koko ngenxa yofakelo set -o pipefail izakusebenza || echo "Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ".

Nangona kunjalo, head ayinakuyenza ngexesha vala ngaphambili fortune iyakugqiba ukukhupha idatha. Emva koko iya kusebenza && echo "ПовСзло!".

Kwenye yam namhlanje GNUMakefile kukho enjalo iqhekeza:

echo '#define MDBX_BUILD_COMPILER "$(shell set -o pipefail; $(CC) --version | head -1 || echo 'Please use GCC or CLANG compatible compiler')"'

Iguqulelwe ebantwini

Ixhaphakile apha I-GNU Yenza ΠΈ ukutshatyalaliswa kwindlela yomqokeleli usebenzisa ukhetho --version ibuza ukuba ngubani na, kwaye ukuba ukhetho aluxhaswanga, emva koko i-stub ifakiwe "Nceda usebenzise i-GCC okanye iCLANG compiler ehambelanayo".

Njengo Ibhoyile inokufumaneka naphi na. Yavela kule ndawo kwakudala kwaye yasebenza ngokugqibeleleyo kuyo yonke indawo (Linux, Solaris, OSX, FreeBSD, I-WSL njl.). Kodwa izolo ku I-AltLinux eqongeni Elbrus 2000 (E2K) Ndiqaphele:

#define MDBX_BUILD_COMPILER "lcc:1.23.20:Sep--4-2019:e2k-v3-linux Please use GCC or CLANG compatible compiler"

Ngeliphandle, andizange ndikhawuleze ndimbone β€œumhlobo” wam wakudala. Ngaphezu koko, le projekthi sele ivavanyiwe amaxesha amaninzi kwi-Elbrus kwaye phantsi konikezelo oluninzi olwahlukeneyo, kubandakanya i-Alt. Ngabaqulunqi abahlukeneyo, iinguqulelo ze-GNU Yenza kunye ne-bash. Ke ngoko, bendingafuni ukubona impazamo yam apha.

Xa uzama ukuvelisa kwakhona ingxaki kunye / okanye ukuqonda oko kwakuqhubeka, izinto ezingaqhelekanga zaqala ukwenzeka.
Upelo lomgca womyalelo:

echo "#define MDBX_BUILD_COMPILER '$(set -o pipefail; LC_ALL=C cc --version | head -1 || echo "Please use GCC or CLANG compatible compiler")'"

Ngalo lonke ixesha izakuvelisa umbhalo owongezelelweyo, emva koko hayi... Rhoqo enye yeendlela zokukhetha inokuncamathela ixesha elide, kodwa ukuba uthe waphoxa ixesha elide, uhlala ufumana zombini!

Kakade, strace yonke into yethu! Kwaye emva kokuchwetheza istrace tirade, kodwa ndingenaxesha lokucofa u-Enter, ndiye ndaqaphela umhlobo wam wakudala uMnu. Heisenbug, kunye nabaphuhlisi. umqokeleli mna kwiminyaka engama-25 eyadlulayo, Nostalgie... Ndaye ndagqiba ekubeni mandibe buhlungu ndibhale le note πŸ˜‰

Ngendlela, njengaye nawuphi na ukuzihlonipha Heisenbug, ngaphantsi strace ukhetha ukungaphindi.

Kuqhubeka ntoni?

  • Uncedo head unelungelo (okanye kunoko, unyanzelekile) ukuvala isitishi esifundwayo nje ukuba sifunde inani eliceliweyo lemigca.
  • Umbhali wenkqubo ovelisa idatha (kule meko cc) kungaba printa imigca emininzi kwaye simahla yenza oku ngeefowuni ezininzi write().
  • ukuba umfundi uya kuba nexesha lokuvala itshaneli kwicala lakhe phambi kokuphela kokurekhoda kwicala lombhali, ngoko umbhali uya kufumana impazamo.
  • Inkqubo yombhali unelungelo zombini ziyayihoya impazamo yokubhala isitishi kwaye ziyibonise kwikhowudi yakho yokugqiba.
  • Ngenxa yofakelo set -o pipefail ikhowudi yokugqibezela umbhobho iyakuba ayingo-zero (impazamo) ukuba isiphumo asingo-zero ukusuka kwinto enye noko, kwaye ke iyakusebenza. || echo "Please use GCC or CLANG compatible compiler".

Kusenokubakho ukuhluka ngokuxhomekeke kwindlela inkqubo yombhali esebenza ngayo ngemiqondiso. Umzekelo, inkqubo inokuphelisa ngokungaqhelekanga (ngokwenza ngokuzenzekelayo imo engeyiyo i-zero/imposiso yokuphelisa), okanye write() iya kubuyisela isiphumo sokubhala iibhayithi ezimbalwa kuneziceliweyo kwaye iseti errno = EPIPE.

Ngubani onetyala?

Kwimeko echazwe kancinci kuyo yonke into. Ukuphatha impazamo cc (lcc:1.23.20:Sepβ€”4-2019:e2k-v3-linux) ayikho engafunekiyo. Kwiimeko ezininzi kungcono ukwenza impazamo kwicala lokulumkisa, nangona oku kuveza iziphene zequbuliso kwi-boilerplate eyenzelwe ukuziphatha kwendabuko.

Yintoni endiyenzayo?

Banzi:

fortune | head -1 && echo "ПовСзло, Π½ΠΎ Π²Ρ‹ рискуСтС!" || echo "WTF?"

Ngokuchanekileyo:

  1. (fortune && echo "УспСшно" || echo "Ошибка") | head -1

    Apha, ukuvala kwangethuba kombhobho kuya kusingathwa yitoliki yomyalelo xa kulungiswa umbhobho ovalelwe ("ngaphakathi" kwizibiyeli). Ngokufanelekileyo, ukuba fortune izakuxela imposiso ngokubhaliweyo kwisitishi esivaliweyo kubume, emva koko imveliso || echo "Ошибка" ayizukufika naphi na, ekubeni ijelo sele livaliwe.

  2. fortune | cat - | head -1 && echo "УспСшно" || echo "Ошибка"

    Nantsi into eluncedo cat isebenza njengento edambisayo kuba ayihoyi impazamo EPIPE ekurhoxisweni. Oku kwanele ngoku kwisiphelo fortune encinci (imigca emininzi) kwaye ingena kwi-buffer yesitishi (ukusuka kwi-512 bytes ukuya kwi-β‰ˆ64K, kwii-OS ezininzi β‰₯4K). Kungenjalo ingxaki inokubuya.

Indlela yokuqhuba ngokuchanekileyo EPIPE kunye nezinye iimpazamo zokurekhoda?

Akukho sicombululo esinye esilungileyo, kodwa kukho iingcebiso ezilula:

  • EPIPE ku funeka kufuneka iqwalaselwe (kwaye ibonakaliswe kwimeko yokuphuma) xa ukhupha idatha efuna ingqibelelo. Ngokomzekelo, ngexesha lokusebenza kwee-archivers okanye i-backup utility.
  • EPIPE ngcono ukungahoyi xa ubonisa ulwazi kunye nemiyalezo encedisayo. Umzekelo, xa ubonisa ulwazi kwiinketho --help okanye --version.
  • Ukuba ikhowudi ephuhliswayo ingasetyenziswa kumbhobho ngaphambili | head, ngoko EPIPE Kungcono ukungayinaki, ngaphandle koko kungcono ukucubungula kunye nokubonakalisa kwimeko yokuphuma.

Ndingathanda ukuthatha eli thuba ndivakalise umbulelo wam kumaqela I-MCST ΠΈ I-AltLinux ngomsebenzi omkhulu onemveliso. Ukuzimisela kwakho kuyamangalisa!
Qhubeka njalo Camarades, phezulu iintlanganiso ekwindla!

Бпасибо berez ukulungisa ii-typos kunye neempazamo.
KDPV ukusuka UGeorge A.

umthombo: www.habr.com

Yongeza izimvo