Heisenbug ina inadutsa ng'ona

Heisenbug ina inadutsa ng'ona

$> set -o pipefail

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

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

ndi fortune pulogalamu yokhazikika popanda exit(rand()).

Kodi mungafotokoze? chavuta ndi chiyani apa?

Lyrical-mbiri digression

Ndidakumana koyamba ndi Heisenbug zaka zana zapitazo. Ndiye pachipata mu FaxNET kunali kofunikira kupanga zida zingapo kudzera mapaipi "kusewera ma checkers" pansi pa FreeBSD. Monga momwe ndimayembekezera, ndidadziwona kukhala wotsogola komanso wodziwa zambiri. Chifukwa chake, ndidafuna kuti ndichite chilichonse mosamala komanso mosamala momwe ndingathere, ndikusamala kwambiri pakuwongolera zolakwika ...

Zomwe ndidakumana nazo m'mbuyomu pothana ndi nsikidzi mu sendmail ndi uucp/uupc zidandiwonjezera khama langa pa "kusamalira zolakwika." Palibe chifukwa chodumphira mwatsatanetsatane za nkhaniyi, koma ndinalimbana ndi Heisenbug iyi kwa milungu iwiri kwa maola 10-14. Chotero, izo zinakumbukiridwa, ndipo dzulo mnzanga wakale ameneyu anaimapo kudzachezanso.

TL; DR Yankho

Zothandiza head mungathe Tsekani tchanelo kuchokera fortune nthawi yomweyo akangowerenga mzere woyamba. Ngati fortune imatulutsa mizere yopitilira umodzi, kenako kuyimba kofanana write() adzabwezera zolakwika kapena kunena kuti ma byte ochepa amatuluka kuposa momwe akufunira. Komanso, olembedwa ndi kusamala zolakwika akuchitira fortune ali ndi ufulu wowonetsa momwe zinthu zilili potuluka. Ndiye chifukwa unsembe set -o pipefail idzagwira ntchito || echo "Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ".

Komabe, head sangafike munthawi yake kutseka kale fortune adzamaliza kutulutsa deta. Ndiye izo zigwira ntchito && echo "ПовСзло!".

Mu chimodzi changa lero GNUMakefile pali mmodzi chidutswa:

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

Kumasuliridwa kukhala munthu

Ndizofala kuno GNU Pangani ΠΈ bash m'njira yophatikizira pogwiritsa ntchito njirayo --version imafunsa kuti iye ndi ndani, ndipo ngati chisankhocho sichikuthandizidwa, ndiye kuti stub imayikidwa "Chonde gwiritsani ntchito compiler yogwirizana ndi GCC kapena CLANG".

Monga mbale mbale angapezeke paliponse. Idawonekera pamalo ano kalekale ndipo idagwira ntchito mwangwiro kulikonse (Linux, Solaris, OSX, FreeBSD, WSL etc.). Koma dzulo mu altlinux pa nsanja Elbrus 2000 (E2K) Ndawona chomwecho:

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

Kunena zoona, sindinamuzindikire mwamsanga β€œmnzanga” wanga wakale. Komanso, ntchitoyi yayesedwa kale nthawi zambiri pa Elbrus komanso pansi pa magawo osiyanasiyana, kuphatikiza Alt. Ndi ma compilers osiyanasiyana, mitundu ya GNU Make ndi bash. Chifukwa chake, sindinkafuna kuwona kulakwitsa kwanga apa.

Poyesa kubweretsanso vutolo ndi/kapena kumvetsetsa zomwe zikuchitika, zinthu zachilendo zinayamba kuchitika.
Mzere wa Command Line:

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

Nthawi ndi nthawi zimatulutsa mawu owonjezera, ndiye osati... Nthawi zambiri imodzi mwazosankhayo imatha kukhala kwa nthawi yayitali, koma ngati mutaya nthawi yayitali, mumakhala ndi zonse ziwiri!

Inde, strace zathu zonse! Ndipo nditayipa strace tirade, koma osakhala ndi nthawi yosindikiza Enter, ndidazindikira bwenzi langa lakale Bambo Heisenbug, ndi opanga mapulogalamu. wopanga ine zaka 25 zapitazo, Nostalgie… Ndipo ndinaganiza zokhala wachisoni ndikulemba kalatayi πŸ˜‰

Mwa njira, monga kudzilemekeza kulikonse Heisenbug, pansi strace amakonda kusabereka.

Ndiye chikuchitika ndi chiyani?

  • Zothandiza head ali ndi ufulu (kapena m'malo mwake, amakakamizika) kutseka tchanelo chomwe chikuwerengedwa akangowerenga nambala yomwe yafunsidwa.
  • Wolemba mapulogalamu opanga deta (pankhaniyi cc) mungathe kusindikiza mizere ingapo ndi mfulu chitani izi kudzera pama foni angapo write().
  • ngati wowerenga adzakhala ndi nthawi yotseka njira kumbali yake isanathe kujambula kumbali ya wolemba, ndiye wolemba adzalandira cholakwika.
  • Pulogalamu ya wolemba ali ndi ufulu onse amanyalanyaza cholakwika cholemba tchanelo ndikuchiwonetsa pamakhodi anu omaliza.
  • Chifukwa cha kukhazikitsa set -o pipefail khodi yomaliza mapaipi idzakhala yopanda ziro (yolakwika) ngati zotsatira zake siziri ziro kuchokera ku chinthu chimodzi, ndiyeno zidzagwira ntchito. || echo "Please use GCC or CLANG compatible compiler".

Pakhoza kukhala zosiyana malinga ndi momwe pulogalamu yolembera imagwirira ntchito ndi zizindikiro. Mwachitsanzo, pulogalamuyo itha kutha modabwitsa (ndi kutulutsa kopanda zero/kuthetsa zolakwika), kapena write() adzabweza zotsatira zolembera ma byte ochepa kuposa momwe adafunira ndikuyika errno = EPIPE.

Ndani ali ndi mlandu?

Pankhani yofotokozedwayo pang'ono pa chirichonse. Zolakwika pogwira cc (lcc:1.23.20:Sepβ€”4-2019:e2k-v3-linux) sichoncho zosafunikira. Nthawi zambiri ndikwabwino kulakwitsa kumbali yosamala, ngakhale izi zimawonetsa zolakwika zadzidzidzi mu boilerplate yopangidwira chikhalidwe chachikhalidwe.

Chochita?

Zolakwika:

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

Molondola:

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

    Apa, kutseka koyambirira kwa chitoliro kudzayendetsedwa ndi womasulira wolamula pokonza payipi yomwe ili m'chisa ("mkati" mwamakolo). Chifukwa chake, ngati fortune adzanena cholakwika polemba ku tchanelo chotsekedwa mu mawonekedwe, kenako zotuluka || echo "Ошибка" sichifika paliponse, popeza tchanelo chatsekedwa kale.

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

    Nayi zothandiza cat imakhala ngati damper chifukwa imanyalanyaza cholakwika EPIPE pakutuluka. Izi ndi zokwanira pomaliza tsopano fortune yaing'ono (mizere ingapo) ndipo imalowa mu buffer ya tchanelo (kuchokera pa 512 byte mpaka β‰ˆ64K, mu OS yambiri β‰₯4K). Apo ayi vuto likhoza kubwerera.

Momwe mungasinthire bwino EPIPE ndi zolakwika zina zojambulira?

Palibe yankho limodzi lolondola, koma pali malingaliro osavuta:

  • EPIPE zofunikira ziyenera kukonzedwa (ndi kuwonetsedwa mumayendedwe otuluka) potulutsa deta yomwe imafunikira kukhulupirika. Mwachitsanzo, pakugwira ntchito kwa archives kapena zosunga zobwezeretsera.
  • EPIPE bwino kunyalanyaza powonetsa zambiri ndi mauthenga othandizira. Mwachitsanzo, powonetsa zambiri pazosankha --help kapena --version.
  • Ngati code ikupangidwa ingagwiritsidwe ntchito paipi kale | head, ndiye EPIPE Ndi bwino kunyalanyaza, apo ayi ndi bwino pokonza ndi kusonyeza potuluka udindo.

Ndikufuna kutenga mwayi uwu kuti ndipereke kuthokoza kwanga kumagulu Mtengo wa MCST ΠΈ altlinux za ntchito yopindulitsa kwambiri. Kutsimikiza kwanu ndi kodabwitsa!
Pitirizani nazo Camarades, mmwamba misonkhano mu kugwa!

Бпасибо berez pakukonza typos ndi zolakwika.
KDPV kuchokera George A.

Source: www.habr.com

Kuwonjezera ndemanga