Imwezve Heisenbug yapfuura garwe

Imwezve Heisenbug yapfuura garwe

$> set -o pipefail

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

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

zviri fortune conditional program pasina exit(rand()).

Unogona here kutsanangura? chii chiri kunetsa apa?

Lyrical-nhoroondo digression

Ndakatanga kuziva iyi Heisenbug chikamu chezana remakore rapfuura. Zvino kune gedhi muFaxNET zvaive zvakakodzera kugadzira akati wandei maturusi kuburikidza pipes "kutamba macheki" pasi peFreeBSD. Sezvaitarisirwa, ndakazviona ndiri munhu wepamusoro uye ane ruzivo rwakakwana. Naizvozvo, ini ndaida kuita zvese nekuchenjerera uye nekuchenjerera sezvinobvira, ndichipa tarisiro pakubata kukanganisa ...

Chiitiko changu chekare chekubata nemabhugi mune sendmail uye uucp/uupc yakawedzera kune yangu kushingaira mu "kunyatso gadzirisa kukanganisa." Iko hakuna chikonzero chekunyura mune izvo zvenyaya, asi ndakanetseka neHeisenbug iyi kwemavhiki maviri kwemaawa gumi nemana. Naizvozvo, zvakarangarirwa, uye nezuro uyu muzivikanwi akapfuura kuti ashanyire zvakare.

TL;DR Mhinduro

Zvinobatsira head may vhara chiteshi kubva fortune ipapo paanongoverenga mutsara wekutanga. Kana fortune inoburitsa mutsara unopfuura mumwechete, kozoti runhare rwunoenderana write() ichadzosa kukanganisa kana kuzivisa kuti mashoma mabhayiti anobuda pane zvakumbirwa. Zvakare, yakanyorwa nekungwarira kubata kukanganisa fortune ine kodzero yekuratidza mamiriro ezvinhu aya mukubuda kwayo. Zvadaro nekuda kwekuiswa set -o pipefail zvichashanda || echo "Π’Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ".

Zvisinei, head haugone kuzviita nenguva kuvhara kare fortune ichapedza kuburitsa data. Zvadaro zvichashanda && echo "ПовСзло!".

Mune imwe yangu nhasi GNUMakefile pane imwe chidimbu:

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

Yakaturikirwa mumunhu

Zvakajairika pano GNU Gadzira ΠΈ Bash nenzira yekuunganidza uchishandisa sarudzo --version inobvunza kuti ndiani, uye kana sarudzo isingatsigirwi, ipapo stub inoiswa "Ndokumbira ushandise GCC kana CLANG inoenderana compiler".

Kufanana boilerplate inogona kuwanikwa chero kupi. Yakaonekwa munzvimbo ino kare kare uye yakashanda zvakakwana kwese (Linux, Solaris, OSX, FreeBSD, WSL etc.). Asi nezuro mu altlinux pachikuva Elbrus 2000 (E2K) Ndakaona:

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

Kutaura chokwadi, handina kukurumidza kuziva β€œmuzivikanwi” wangu wekare. Uyezve, purojekiti yakatoedzwa kakawanda paElbrus uye pasi pekugovera kwakasiyana kwakasiyana, kusanganisira Alt. Nemakongiresi akasiyana-siyana, shanduro dzeGNU Gadzira uye bash. Naizvozvo, ndakanga ndisingadi kuona kukanganisa kwangu pano.

Pakuedza kuburitsa dambudziko uye/kana kunzwisisa zvaiitika, zvimwe zvinhu zvinoshamisa zvakatanga kuitika.
Command line spell:

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

Nguva nenguva yaibva yaburitsa mamwe mavara, kwete... Kazhinji imwe yesarudzo yairamba ichimira kwenguva yakati rebei, asi kana ukatora nguva yakareba, waigara uchiwana zvese!

Ichokwadi, strace zvese zvedu! Saka, pandakanga ndanyora strace tirade, asi ndisina nguva yekudzvanya Enter, ndakaziva shamwari yangu yekare Mr. Heisenbug, nevagadziri. compiler ini makore 25 apfuura, Nostalgie… Uye ndakafunga kusuruvara ndokunyora chinyorwa ichi πŸ˜‰

Nenzira, sekuzviremekedza kupi zvako Heisenbug, pasi strace anofarira kusabereka.

Saka chii chiri kuitika?

  • Zvinobatsira head ine kodzero (kana kuti, inotomanikidzwa) kuvhara chiteshi chiri kuverengwa painongoverenga nhamba yakakumbirwa yemitsara.
  • Iyo data-inogadzira chirongwa-munyori (mune iyi kesi cc) may dhinda mitsetse yakawanda uye vakasununguka ita izvi kuburikidza nekufona kwakawanda write().
  • kana muverengi achawana nguva yekuvhara chiteshi parutivi rwake kusati kwapera kurekodha kudivi remunyori, ipapo munyori achawana kukanganisa.
  • Chirongwa chemunyori kodzero yeku zvese furatira chikanganiso chekunyora chiteshi uye chiratidze mukodhi yako yekupedzisa.
  • Nekuda kwekuisa set -o pipefail iyo pombi yekupedzisa kodhi ichave isiri zero (yakakanganisa) kana mhedzisiro isiri zero kubva pane imwechete chinhu, uyezve ichashanda. || echo "Please use GCC or CLANG compatible compiler".

Panogona kuve nekusiyana zvichienderana nekuti chirongwa chemunyori chinoshanda sei nemasaini. Semuyenzaniso, chirongwa chinogona kupera zvisina tsarukano (nekuzvigadzira otomatiki kweiyo isiri zero/kukanganisa kumisa chimiro), kana write() ichadzorera mhedzisiro yekunyora mashoma mabhaiti pane akumbirwa uye kuseta errno = EPIPE.

Ndiani ane mhosva?

Muchiitiko chakatsanangurwa zvishoma zvezvose. Kukanganisa kubata mukati cc (lcc:1.23.20:Sepβ€”4-2019:e2k-v3-linux) kwete redundant. Muzviitiko zvakawanda zviri nani kukanganisa padivi rekuchenjerera, kunyangwe izvi zvichiburitsa zvikanganiso zvakangoerekana zvaitika mubhoilerplate yakagadzirirwa maitiro echinyakare.

Chii chandinofanira kuita?

Zvakashata:

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

Zvakarurama:

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

    Pano, kuvhara kwepombi kwekutanga kuchabatwa nemuturikiri wekuraira paunenge uchisevha pombi yakagara ("mukati" maparentheses). Naizvozvo, kana fortune inoshuma kukanganisa mukunyora kune yakavharwa chiteshi mune iyo mamiriro, ipapo zvinobuda || echo "Ошибка" hapana kwainosvika, sezvo gwara rakatovharwa.

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

    Heino utility cat inoshanda seyakanyorova nekuti inofuratira kukanganisa EPIPE pakubvisa. Izvi zvakwana for now mhedziso fortune diki (mitsetse yakati wandei) uye inokodzera mugero buffer (kubva pa512 bytes kusvika β‰ˆ64K, mune yakawanda OS β‰₯4K). Zvikasadaro dambudziko rinogona kudzoka.

Maitiro ekugadzirisa nemazvo EPIPE nezvimwe zvikanganiso zvekurekodha?

Iko hakuna mhinduro imwechete yakarurama, asi kune mazano akareruka:

  • EPIPE inodikanwa inofanira kugadziriswa (uye inoratidzwa muchimiro chekubuda) paunenge uchiburitsa data inoda kuvimbika. Semuenzaniso, panguva yekushanda kwearchives kana backup utilities.
  • EPIPE zviri nani kufuratira pakuratidza ruzivo uye mameseji ebetsero. Semuenzaniso, paunenge uchiratidza ruzivo pane zvingasarudzwa --help kana --version.
  • Kana iyo kodhi iri kugadzirwa inogona kushandiswa mupombi pamberi | head, ipapo EPIPE Zviri nani kufuratira, kana zvisina kudaro zviri nani kugadzirisa uye kuratidza muchimiro chekubuda.

Ndinoda kutora mukana uno kuratidza kutenda kwangu kuzvikwata MCST ΠΈ altlinux nokuda kwebasa guru rinobereka zvibereko. Kutsunga kwako kunoshamisa!
Ramba wakadaro Camarades, kumusoro misangano mumatsutso!

Бпасибо berez pakugadzirisa typos uye kukanganisa.
KDPV kubva George A.

Source: www.habr.com

Voeg