Ib tug ntxiv Heisenbug dhau ntawm tus khej

Ib tug ntxiv Heisenbug dhau ntawm tus khej

$> set -o pipefail

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

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

nws yog fortune conditional program tsis muaj exit(rand()).

Koj puas tuaj yeem piav qhia? dab tsi tsis ncaj ncees lawm ntawm no?

Lyrical-historical digression

Kuv thawj zaug tau paub txog Heisenbug no ib lub hlis twg ntawm ib puas xyoo dhau los. Tom qab ntawd rau lub rooj vag hauv FaxNET nws yog qhov tsim nyog los tsim ntau yam khoom siv hluav taws xob ntawm kav dej "ua si checkers" nyob rau hauv FreeBSD. Raws li qhov xav tau, Kuv suav tias kuv tus kheej yog tus kws tshaj lij thiab muaj kev paub dhau los. Yog li ntawd, kuv tau npaj ua txhua yam kom ua tib zoo thiab ua tib zoo raws li qhov ua tau, ua tib zoo saib xyuas kev ua yuam kev ...

Kuv qhov kev paub dhau los ntawm kev cuam tshuam nrog cov kab hauv sendmail thiab uucp / uupc ntxiv rau kuv qhov kev mob siab rau hauv "kev ua yuam kev tag nrho." Tsis muaj lub ntsiab lus hauv kev dhia dej rau hauv cov ntsiab lus ntawm zaj dab neeg, tab sis kuv tau tawm tsam nrog Heisenbug ob lub lis piam rau 10-14 teev. Yog li ntawd, nws tau nco ntsoov, thiab nag hmo no tus qub acquaintance nres los ntawm mus xyuas dua.

TL;DR Answer

Π’ΠΈΠ»ΠΈΡ‚Π° head tau kaw lub channel los ntawm fortune tam sim ntawd sai li sai tau nws nyeem thawj kab. Yog fortune outputs ntau tshaj ib kab, ces tus coj hu write() yuav rov qab ua qhov yuam kev lossis tshaj tawm tias tsawg dua bytes tso zis ntau dua li thov. Nyob rau hauv lem, sau nrog ceev faj yuam kev fortune muaj txoj cai los xav txog qhov xwm txheej no hauv nws txoj kev tawm. Tom qab ntawd vim lub installation set -o pipefail yuav ua haujlwm || echo "Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ".

Txawm li cas los, head yuav tsis ua rau lub sijhawm kaw ua ntej fortune yuav ua kom tiav cov ntaub ntawv tawm. Tom qab ntawd nws yuav ua haujlwm && echo "ПовСзло!".

Hauv ib qho ntawm kuv hnub no GNUMakefile muaj li ntawd tawg tawg:

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

Txhais ua neeg

Nws yog ib qho ntawm no rau GNU Ua ΠΈ bash nyob rau hauv txoj kev compiler siv qhov kev xaiv --version nws nug nws yog leej twg, thiab yog tias qhov kev xaiv tsis tau txais kev txhawb nqa, ces ib lub stub yog ntxig "Thov siv GCC lossis CLANG tshaj compiler".

Zoo li boilerplate tuaj yeem nrhiav tau nyob qhov twg. Nws tau tshwm sim hauv qhov chaw no ntev dhau los thiab ua haujlwm zoo txhua qhov chaw (Linux, Solaris, OSX, FreeBSD, WSL lwm yam). Tab sis nag hmo hauv altlinux saum lub platform Elbrus 2000 (E2K) Kuv pom:

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

Frankly, kuv tsis tau paub tam sim kuv tus qub "neeg paub." Ntxiv mus, qhov project twb tau sim ntau zaus ntawm Elbrus thiab nyob rau hauv ntau qhov sib txawv, suav nrog Alt. Nrog ntau yam compilers, versions ntawm GNU Ua thiab bash. Yog li ntawd, kuv tsis xav pom kuv qhov yuam kev ntawm no.

Thaum sim rov tsim dua qhov teeb meem thiab/lossis nkag siab txog dab tsi tshwm sim, ntau yam txawv txawv pib tshwm sim.
Command kab lus:

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

Tam sim no thiab tom qab ntawd nws yuav tsim cov ntawv ntxiv, ces tsis yog ... Feem ntau ib qho ntawm cov kev xaiv yuav lo rau lub sijhawm ntev, tab sis yog tias koj poked ntev dua, koj ib txwm tau txais ob qho tib si!

Ntawm chav kawm, strace peb txhua yam! Thiab tau ntaus ib txoj kab tirade, tab sis tsis muaj sij hawm los nias Enter, kuv paub kuv tus qub phooj ywg Mr. Heisenbug, thiab cov tsim tawm compiler kuv tus kheej 25 xyoo dhau los, Nostalgie… Thiab kuv txiav txim siab yuav tu siab thiab sau ntawv no πŸ˜‰

Los ntawm txoj kev, zoo li txhua yam kev hwm tus kheej Heisenbug, hauv qab strace nyiam kom tsis txhob yug me nyuam.

Yog li dab tsi tshwm sim?

  • Π’ΠΈΠ»ΠΈΡ‚Π° head muaj txoj cai (los yog theej, txawm raug yuam) kaw cov channel uas tau nyeem sai li sai tau thaum nws nyeem cov kab lus thov.
  • Cov ntaub ntawv-tsim program-writer (hauv qhov no cc) tau luam ntau kab thiab dawb ua qhov no los ntawm ntau lub xov tooj write().
  • Yog hais tias tus tus nyeem ntawv yuav muaj sijhawm los kaw cov channel ntawm nws sab ua ntej qhov kawg ntawm kev kaw ntawm tus kws sau ntawv sab, ces tus kws sau ntawv yuav tau txais qhov yuam kev.
  • Program kws sau ntawv muaj txoj cai ob qho tib si tsis quav ntsej cov channel sau yuam kev thiab cuam tshuam nws hauv koj cov lej ua tiav.
  • Vim lub installation set -o pipefail txoj kev ua tiav cov kav dej yuav tsis yog xoom (erroneous) yog tias qhov tshwm sim tsis yog xoom los ntawm yam tsawg kawg ib lub caij, thiab tom qab ntawd nws yuav ua haujlwm. || echo "Please use GCC or CLANG compatible compiler".

Tej zaum yuav muaj kev hloov pauv nyob ntawm seb qhov kev sau ntawv ua haujlwm li cas nrog cov cim. Piv txwv li, qhov kev zov me nyuam tuaj yeem txiav tawm qhov txawv txav (nrog lub cim tsis siv neeg ntawm qhov tsis yog xoom / yuam kev txiav tawm), lossis write() yuav rov qab cov txiaj ntsig ntawm kev sau ntawv tsawg dua bytes dua li thov thiab teeb tsa errno = EPIPE.

Leej twg yog liam?

Hauv cov lus piav qhia me ntsis ntawm txhua yam. yuam kev tuav hauv cc (lcc:1.23.20:Sepβ€”4-2019:e2k-v3-linux) tsis yog redundant. Feem ntau nws yog qhov zoo dua los ua yuam kev ntawm ib sab ntawm kev ceev faj, txawm hais tias qhov no ua rau pom qhov tsis txaus ntseeg hauv lub boilerplate tsim rau kev coj cwj pwm.

Kuv yuav ua li cas?

Tsis ncaj ncees lawm:

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

Yog lawm:

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

    Ntawm no, thaum ntxov kaw ntawm cov yeeb nkab yuav raug tswj hwm los ntawm tus neeg txhais lus hais kom ua haujlwm thaum ua haujlwm hauv cov kav dej nested ("hauv" kab lus). Raws li, yog tias fortune yuav tshaj tawm qhov yuam kev hauv kev sau ntawv mus rau qhov kaw channel hauv cov xwm txheej, tom qab ntawd cov zis || echo "Ошибка" nws yuav tsis tau nyob qhov twg, vim channel twb kaw lawm.

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

    Ntawm no yog cov khoom siv hluav taws xob cat ua raws li damper vim nws tsis quav ntsej qhov yuam kev EPIPE thaum tshem tawm. Qhov no txaus rau tam sim no xaus fortune me me (ntau kab) thiab haum rau hauv cov channel tsis (los ntawm 512 bytes rau β‰ˆ64K, hauv feem ntau OS β‰₯4K). Txwv tsis pub qhov teeb meem yuav rov qab los.

Yuav ua li cas kom raug EPIPE thiab lwm yam kev kaw lus yuam kev?

Tsis muaj ib qho kev daws teeb meem, tab sis muaj cov lus pom zoo yooj yim:

  • EPIPE yuav tsum tau yuav tsum tau ua (thiab muaj kev cuam tshuam nyob rau hauv cov xwm txheej tawm) thaum tso tawm cov ntaub ntawv uas yuav tsum muaj kev ncaj ncees. Piv txwv li, thaum lub sijhawm ua haujlwm ntawm archivers lossis cov khoom siv thaub qab.
  • EPIPE zoo dua tsis quav ntsej thaum tso saib cov ntaub ntawv thiab cov lus pab. Piv txwv li, thaum tso saib cov ntaub ntawv ntawm kev xaiv --help los yog --version.
  • Yog tias cov cai tsim tau tuaj yeem siv rau hauv cov kav dej ua ntej | head, ces EPIPE Nws yog qhov zoo dua los tsis quav ntsej, txwv tsis pub nws yog qhov zoo dua los ua cov txheej txheem thiab xav txog hauv txoj cai tawm.

Kuv xav siv lub sijhawm no los qhia kuv ua tsaug rau cov pab pawg MCST ΠΈ altlinux rau kev ua haujlwm zoo heev. Koj qhov kev txiav txim siab zoo kawg nkaus!
Cia nws mus Camarades, nce cov rooj sib tham hauv lub caij nplooj zeeg!

Бпасибо berez rau kho typos thiab yuam kev.
KDPV los ntawm Georgy A.

Tau qhov twg los: www.hab.com

Ntxiv ib saib