Heisenbug e 'ngoe hape e feta koena

Heisenbug e 'ngoe hape e feta koena

$> set -o pipefail

$> fortune | head -1 > /dev/null && echo "Повезло!" || echo "Вы проиграли"
Повезло!

$> fortune | head -1 > /dev/null && echo "Повезло!" || echo "Вы проиграли"
Вы проиграли

ke fortune lenaneo le nang le maemo ntle le exit(rand()).

A na u ka hlalosa? phoso ke efe mona?

Phapang ea mantsoe-ea nalane

Ke qalile ho tloaelana le Heisenbug ena lilemong tse lekholo tse fetileng. Ebe bakeng sa heke ho FaxNET ho ne ho hlokahala ho theha lisebelisoa tse 'maloa ka liphaephe "ho bapala li-checkers" tlasa FreeBSD. Joalo ka ha ho ne ho lebelletsoe, ke ne ke inka ke le moqapi ea tsoetseng pele le ea nang le boiphihlelo. Ka hona, ke ne ke rerile ho etsa ntho e 'ngoe le e' ngoe ka hloko le ka hloko kamoo ho ka khonehang, ho ela hloko ka ho khetheha ho sebetsana le liphoso ...

Phihlelo ea ka ea nakong e fetileng ea ho sebetsana le likokoana-hloko ho sendmail le uucp/uupc e ekelitse boikitlaetso ba ka ba "ho sebetsana le liphoso ka botlalo." Ha ho na thuso ea ho kenella ka lintlha tsa pale eo, empa ke ile ka loana le Heisenbug ena ka libeke tse peli bakeng sa lihora tse 10-14. Ka hona, e ile ea hopoloa, 'me maobane motsoalle enoa oa khale o ile a feta ho etela hape.

TL; DR Karabo

Tšebeliso head ka koala kanale ho tloha fortune hang hang feela ha a bala mola wa pele. Haeba fortune e hlahisa mela e fetang o le mong, ebe call e tsamaellanang write() e tla khutlisa phoso kapa e tlaleha hore li-byte tse fokolang li hlahisoa ho feta kamoo u li kopileng. Ka lehlakoreng le leng, e ngotsoe ka hloko ho sebetsana le liphoso fortune e na le tokelo ea ho bonahatsa boemo bona boemong ba eona ba ho tsoa. Ebe ka lebaka la ho kenya set -o pipefail tla sebetsa || echo "Вы проиграли".

Leha ho le joalo, head e ka se fihle ka nako koala pele fortune e tla qeta ho ntša data. Joale e tla sebetsa && echo "Повезло!".

Ho e 'ngoe ea ka kajeno GNUMakefile ho na le e mong sekhechana:

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

E fetoletsoe ho motho

Ho tloaelehile mona bakeng sa GNU Etsa и Bash ka tsela ea compiler sebelisa khetho --version e botsa hore na ke mang, 'me haeba khetho e sa tšehetsoe, joale ho kenngoa stub "Ka kopo sebelisa pokello e lumellanang ea GCC kapa CLANG".

Joaloka boilerplate e ka fumanoa kae kapa kae. E hlahile sebakeng sena khale mme e sebetsa hantle hohle (Linux, Solaris, OSX, FreeBSD, WSL joalo-joalo). Empa maobane ka altlinux sethaleng Elbrus 2000 (E2K) Ke hlokometse:

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

Ho bua ’nete, ha kea ka ka tseba hang-hang “motsoalle” oa ka oa khale. Ho feta moo, morero ona o se o ntse o lekoa ka makhetlo a mangata ho Elbrus le tlas'a liphallelo tse ngata tse fapaneng, ho akarelletsa le Alt. Ka baqapi ba fapaneng, liphetolelo tsa GNU Make le bash. Ka hona, ke ne ke sa batle ho bona phoso ea ka mona.

Ha u leka ho hlahisa bothata le / kapa ho utloisisa se neng se etsahala, lintho tse ling tse makatsang li ile tsa qala ho etsahala.
Molaetsa oa taelo:

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

Nako le nako e ne e hlahisa mongolo o eketsehileng, ebe eseng... Hangata e 'ngoe ea likhetho e ne e tla tšoarella nako e telele, empa ha u ka sheba nako e telele, u lula u e fumana ka bobeli!

Ho hlakile hore, strace tsohle tsa rona! 'Me ka mor'a ho thaepa tirade, empa ke se na nako ea ho tobetsa Enter, ke ile ka lemoha motsoalle oa ka oa khale Monghali Heisenbug, le bahlahisi. mokopanyi ke lilemo tse 25 tse fetileng, Nostalgie… Mme ke ile ka etsa qeto ya ho hlonama mme ka ngola lengolo lena 😉

Ka tsela, joalo ka boitlhompho leha e le bofe Heisenbug, tlasa strace e ratang ho se ikatise.

Joale ho etsahalang?

  • Tšebeliso head e na le tokelo (kapa ho e-na le hoo, e bile e qobelloa) ho koala kanale e baloang hang ha e bala palo e batloang ea mela.
  • Sengoli sa lenaneo le hlahisang data (tabeng ena cc) ka hatisa mela e mengata le mahala etsa sena ka mehala e mengata write().
  • haeba 'mali o tla ba le nako ea ho koala mocha ka lehlakoreng la hae pele ho bofelo ba ho rekota ka lehlakoreng la mongoli, joale mongoli o tla fumana phoso.
  • Lenaneo la mongoli tokelo ea ho ka bobeli ba iphapanyetsa phoso ea ho ngola mocha 'me ba e bonts'a khoutong ea hau ea ho qetela.
  • Ka lebaka la ho kenya set -o pipefail khoutu ea ho phethela lipeipi e tla ba e seng zero (phoso) haeba sephetho e se zero bonyane ho karolo e le 'ngoe, ebe e tla sebetsa. || echo "Please use GCC or CLANG compatible compiler".

Ho ka 'na ha e-ba le phapang ho itšetlehile ka hore na lenaneo la mongoli le sebetsa joang ka lipontšo. Mohlala, lenaneo le ka emisa ka mokhoa o sa tloaelehang (ka ho iketsetsa boemo ba ho se be le zero/phoso), kapa write() e tla khutlisa sephetho sa ho ngola li-byte tse seng kae ho feta kamoo u kōpileng le ho beha errno = EPIPE.

Ke mang ea lokelang ho beha molato?

Tabeng e hlalositsoeng hanyane ho tsohle. Phoso ea ho sebetsa cc (lcc:1.23.20:Sep—4-2019:e2k-v3-linux) ha e joalo sa hlokahaleng. Maemong a mangata ho molemo ho etsa phoso ka lehlakoreng la tlhokomeliso, le hoja sena se pepesa liphoso tsa tšohanyetso ka har'a boilerplate e etselitsoeng boitšoaro ba setso.

Ke lokela ho etsa eng?

E fosahetse:

fortune | head -1 && echo "Повезло, но вы рискуете!" || echo "WTF?"

E nepahetse:

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

    Mona, ho koala phala pele ho nako ho tla sebetsoa ke toloko ea taelo ha ho sebetsoa phaephe e behiloeng ("ka har'a" masakaneng). Ka hona, haeba fortune e tla tlaleha phoso ka ho ngolla mocha o koetsoeng boemong, ebe tlhahiso || echo "Ошибка" e ke ke ea fihla kae kapa kae, kaha mocha o se o koetsoe.

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

    Mona ke lisebelisoa cat e sebetsa joalo ka damper hobane e iphapanyetsa phoso EPIPE ha o hula. Sena se lekane hona joale sephethong fortune e nyane (mela e 'maloa) mme e lumellana le buffer ea kanale (ho tloha ho li-byte tse 512 ho isa ho ≈64K, ho boholo ba OS ≥4K). Ho seng joalo bothata bo ka khutla.

Mokhoa oa ho sebetsa ka nepo EPIPE le liphoso tse ling tsa ho rekota?

Ha ho na tharollo e le 'ngoe e nepahetseng, empa ho na le litlhahiso tse bonolo:

  • EPIPE e hlokehang e tlameha ho sebetsoa ('me e bonts'a boemo ba ho tsoa) ha o ntša data e hlokang botšepehi. Ka mohlala, nakong ea ts'ebetso ea li-archivers kapa li-backup utilities.
  • EPIPE molemo ho iphapanyetsa ha o hlahisa tlhahisoleseding le melaetsa e thusang. Mohlala, ha o hlahisa tlhahisoleseling mabapi le likhetho --help kapa --version.
  • Haeba khoutu e ntseng e ntlafatsoa e ka sebelisoa ka phaephe pele | head, joale EPIPE Ho molemo ho hlokomoloha, ho seng joalo ho molemo ho sebetsa le ho bonahatsa boemo ba ho tsoa.

Ke rata ho nka monyetla ona ho hlahisa liteboho tsa ka ho lihlopha MCST и altlinux bakeng sa mosebetsi o moholo o hlahisang litholoana. Boikemisetso ba hau boa hlolla!
Tsoela pele Camarades, holimo likopano tsa hoetla!

Спасибо berez bakeng sa ho lokisa typos le liphoso.
KDPV ho tloha George A.

Source: www.habr.com

Eketsa ka tlhaloso