Hal Heisenbug oo kale ayaa dhaafay yaxaaska

Hal Heisenbug oo kale ayaa dhaafay yaxaaska

$> set -o pipefail

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

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

waa fortune barnaamij shuruud la'aan ah exit(rand()).

Ma sharaxi kartaa? maxaa ka qaldan halkan?

Qoob-ka-cayaar-taariikheed

Waxaan markii ugu horreysay bartay Heisenbug-gan rubuc qarni ka hor. Kadibna albaabka FaxNET waxa lagama maarmaan noqotay in la abuuro adeegyo badan oo loo maro tuubooyinka "kuwa ciyaarista" ee hoos timaada FreeBSD. Sidii la filayey, waxaan isu haystay in aan ahay barnaamij-yaqaan horumarsan oo caddaalad ah. Sidaa darteed, waxaan ugu tala galay in aan wax walba u sameeyo si taxadar leh oo taxadar leh intii suurtagal ah, anigoo fiiro gaar ah u leh maaraynta khaladaadka...

Waayo-aragnimadaydii hore ee wax ka qabashada dhiqlaha emailka iyo uucp/uupc ayaa igu daray dadaalkayga "xakamaynta khaladka saxda ah." Ma jirto wax macno ah oo lagu quusinayo tafaasiisha sheekadaas, laakiin waxaan la halgamay Heisenbug-gan laba toddobaad 10-14 saacadood. Sidaa darteed, waa la xusuustay, oo shalay odaygan is-yaqaana ah ayaa joojiyay inuu mar kale soo booqdo.

TL; Jawaabta DR

Faa'iidada head awooddo kanaalka ka xidh fortune Isla markiiba isla marka uu akhriyo safka hore. Hadii fortune soo saara wax ka badan hal xariiq, ka dibna wacitaanka u dhigma write() waxay soo celin doontaa khalad ama waxay soo sheegi doontaa in bytes ka yar inta la codsaday. Dhanka kale, qoraal si taxadar leh u maamula qaladka fortune waxay xaq u leedahay inay xaaladan ka tarjumto xaaladeeda bixitaan. Markaas ay sabab u tahay rakibidda set -o pipefail shaqayn doona || echo "Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ".

Si kastaba ha ahaatee, head waxaa laga yaabaa in aysan ku dhicin waqtiga hore u dhow fortune dhamayn doona soo saarista xogta. Markaa way shaqayn doontaa && echo "ПовСзло!".

Mid ka mid ah maanta GNUMakefile waxaa jira mid jajab:

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

Waxaa loo turjumay dad

Waa wax caadi ah halkan GNU Samee ΠΈ bash habka compiler iyadoo la isticmaalayo ikhtiyaarka --version waxay waydiinaysaa cidda uu yahay, haddii ikhtiyaarka aan la taageerin, markaa suunka ayaa la gelinayaa "Fadlan isticmaal GCC ama CLAG compiler ku habboon".

Sida biyo kululeeyaha meel walba waa laga heli karaa. Waxay ka soo muuqatay meeshan wakhti dheer ka hor waxayna si fiican uga shaqeysay meel kasta (Linux, Solaris, OSX, FreeBSD, WSL iwm.). Laakiin shalay gudaha altlinux on platform ah Elbrus 2000 (E2K) Waxaan ogaaday:

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

Si daacadnimo ah, isla markiiba ma aqoonsan "is-barashadaydii" hore. Waxaa intaa dheer, mashruuca ayaa marar badan lagu tijaabiyay Elbrus iyo qaybo badan oo kala duwan, oo ay ku jiraan Alt. Iyada oo leh isku-dubaridyo kala duwan, noocyada GNU Make iyo bash. Sidaa darteed, ma aanan rabin inaan halkan ku arko khaladkayga.

Markaad isku dayeyso inaad dib u soo saarto dhibaatada iyo/ama fahamto waxa socda, waxyaabo badan oo yaab leh ayaa bilaabay inay dhacaan.
higaada khadka taliska:

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

Had iyo jeer waxay soo saari doontaa qoraal dheeri ah, ka dibna maaha... Inta badan mid ka mid ah xulashooyinka ayaa ku sii jiri doona wakhti dheer, laakiin haddii aad dheeraato, marwalba waxaad heleysaa labadaba!

Dabcan, strace wax walba! Oo markii aan qoray tirade strace ah, laakiin aan haysan wakhti aan ku riixo Gelida, waxaan aqoonsaday saaxiibkay hore Mr. Heisenbug, iyo horumarinta ururiye naftayda 25 sano ka hor, Nostalgie… Oo waxaan go'aansaday inaan murugooto oo aan qoro qoraalkan πŸ˜‰

By habka, sida qof kasta oo is-ixtiraamaya Heisenbug, hoosta strace door biday in aanu taran.

Haddaba maxaa dhacaya?

  • Faa'iidada head waxay xaq u leedahay (ama halkii, xataa waa lagu qasbay) inuu xidho kanaalka la akhrinayo isla marka uu akhriyo tirada la codsaday.
  • Qoraaga barnaamijka xog-ururinta (kiiskan cc) awooddo daabac khadadka badan iyo bilaasha tan ku samee wicitaano badan write().
  • haddii akhristuhu wuxuu heli doonaa wakhti uu ku xidho kanaalka dhinaciisa ka hor dhamaadka duubista dhinaca qoraaga, ka dibna qoraagu wuxuu heli doonaa qalad.
  • Barnaamijka qoraaga Xaq u leeyahay Labaduba iska indhatiraan kanaalka inay qoraan khalad oo ka turjumaan koodkaaga dhammaystirka.
  • Rakibaadda awgeed set -o pipefail koodka dhamaystirka dhuumaha wuxuu noqonayaa mid aan eber ahayn (khalad ah) haddii natiijadu tahay eber ka mid ah ugu yaraan hal element, ka dibna way shaqayn doontaa || echo "Please use GCC or CLANG compatible compiler".

Waxaa jiri kara kala duwanaansho ku xiran tahay sida barnaamijka qoraagu ugu shaqeeyo calaamadaha. Tusaale ahaan, barnaamijku wuxuu u joojin karaa si aan caadi ahayn (oo leh jiil toos ah oo aan eber ahayn/qalada joojin), ama write() waxay soo celin doontaa natiijada qorista bytes ka yar intii la codsaday oo dejin doonta errno = EPIPE.

Yaa dambiile ah?

Xaaladda la tilmaamay wax kasta oo yar. Khalad wax ka qabashada cc (lcc:1.23.20:Sepβ€”4-2019:e2k-v3-linux) ma ahan xad dhaaf ah. Marar badan way fiican tahay in laga qaldamo dhinaca taxadarka, in kasta oo tani ay soo bandhigayso cilladaha lama filaanka ah ee kuleyliyaha loogu talagalay habdhaqan dhaqameed.

Maxaa la sameeyaa?

Khalad

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

Sax ah:

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

    Halkan, xidhitaanka hore ee tuubada waxa maamuli doona tarjumaanka taliska marka uu shaqaynayo dhuumaha buulka leh ("gudaha" qawladaha). Sidaas awgeed, haddii fortune wuxuu u sheegi doonaa qalad qoraal ah kanaalka xiran ee xaaladda, ka dibna wax soo saarka || echo "Ошибка" meelna ma gaari doonto, maadaama kanaalka mar hore la xiray.

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

    Waa kan utility-ga cat waxay u dhaqantaa sidii qoyaan badan sababtoo ah way iska indhatirtaa khaladka EPIPE marka laga baxo. Tani waa ku filan hadda gabagabada fortune yar yar (dhowr khad) oo ku habboon kaydiyaha kanaalka (laga bilaabo 512 bytes ilaa β‰ˆ64K, inta badan OS β‰₯4K). Haddii kale dhibaatadu way soo noqon kartaa.

Sida saxda ah ee loo habeeyo EPIPE iyo khaladaadka kale ee duubista?

Ma jiro hal xal oo sax ah, laakiin waxaa jira talooyin fudud:

  • EPIPE loo baahan yahay waa in la farsameeyaa (oo ka muuqda heerka bixitaanka) marka la soo saarayo xogta u baahan daacadnimo. Tusaale ahaan, inta lagu jiro hawlgalka kaydinta ama kaydka utilities.
  • EPIPE fiican in la iska indhatiro marka la soo bandhigayo macluumaadka iyo fariimaha caawinta. Tusaale ahaan, marka la soo bandhigayo macluumaadka xulashooyinka --help ama --version.
  • Haddii koodka la soo saarayo hore loo isticmaali karo dhuumaha | head, ka dibna EPIPE Way fiicantahay in la iska indhatiro, haddii kale way fiicantahay in la farsameeyo oo la muujiyo heerka bixitaanka.

Waxaan jeclaan lahaa inaan ka faa'iidaysto fursadan si aan ugu mahadceliyo kooxaha MCST ΠΈ altlinux shaqo wanaagsan oo wax soo saar leh. Go'aankaagu waa yaab!
Ka sii wad Camarades, kor shirarka dayrta!

Бпасибо berez si loo saxo qoraalada iyo khaladaadka.
KDPV ka George A.

Source: www.habr.com

Add a comment