Articles

co dělat s chybou segmentace 11

z nějakého důvodu jsem se rozhodl vytvořit produkt pomocí plain C. pokud byl cílem účinnost kódu, byla to katastrofa. Ale jako nástroj pro osobní růst, myslím, že jsem se naučil mnohem více o programování v tomto procesu.

například nyní vím přesněji, proč se slovník Pythonu a seznam chovají odlišně a co to vlastně znamená “ projít odkazem.“

Pokud by však existovala jedna bariéra, která by mě nikdy nechtěla vrátit do C, byla by to obávaná „segmentační chyba 11″, následovaná těsně “ Abort Trap 6.“

tyto dvě chyby se vyskytují během běhu, což ztěžuje jejich ladění. XCode, Eclipse nebo jiné ladicí nástroje jsou opravdu užitečné, ale naučil jsem se, že je mnohem důležitější zjistit, jaké jsou tyto věci, a přijít s postupy pro řešení procesu ladění. To jsou jen moje poznámky o mých vlastních běžných chybách. Doufám, že to bude seznam řešení problémů pro každého, kdo má své vlastní problémy. Chci alespoň pokrýt své hloupé problémy, takže se můžete soustředit na skutečné problémy s kódováním.

chyba segmentace znamená, že se váš program pokusil získat přístup k něčemu, co neměl. To je součást problému. Existuje mnoho důvodů, proč program může přistupovat k věcem, které nemá, ale kompilovaný kód do značné míry říká „#$ # @^ * &!“ místo. Pokud o tom přemýšlíte,nechtěli byste někomu vysvětlovat, proč vás strkají do citlivého místa. Jen chcete, aby to přestali dělat. Naštěstí jsou počítače hloupé a překvapivě trpělivé po asi 75 letech inženýrství. Budou posílat chyby Seg, ale (obvykle) nepřestanou být přáteli poté, co se to stane 1000.

co je Abort Trap?

není to až tak rozdílné. Někde si počítač řekl, aby program přerušil. Opět není moc užitečné. Nicméně, to obvykle dochází, když se pokusíte udělat něco, jako je přístup string dvou-char string "nw" nebo nepodaří přidělit dostatek paměti char string string, nebo pole, jako je "way".

co byste měli dělat s chybou Seg?

výukové programy, které jsem četl, se zaměřují na používání ladicích nástrojů, jako jsou lldb, gdb a tak dále. To je všechno v pořádku a dandy. Ano, měli byste spustit gcc -glldb executable_namerun -flag1 -flag2 uvidíme, jestli to vám pomůže na to přijít. Ale někdy není vůbec žádná pomoc. Mám však seznam věcí, které je třeba zkontrolovat.

  • zkontrolujte, zda potřebné globální proměnné programu mají hodnoty. Většinou se to stalo, protože jsem vytvořil vlajky, které vyplňovaly spoustu hodnot, které bylo třeba nastavit před spuštěním. Co když však nic nedají? Segedín 11! Několikrát jsem si myslel, že vary byly nastaveny, když nebyly, a to pro náročné chyby. Ještě lepší je pokusit se udržet globály na hranici, aby byly snadněji sledovatelné.
  • malloc je váš přítel i váš nepřítel. Zejména u uživatelských záznamů může být velmi náročné přidělit paměť a poté zkopírovat, zřetězit a dělat cokoli jiného po silnici. Znáte tento příkaz dobře a jak to funguje. A nezapomeňte free() paměť, když jste hotovi!
  • použijte char var k určení velikosti char * pro přidělení paměti. Většina problému jsem zahrnoval přiřazení proměnných nakonec přijmout řetězec. Viděl jsem další rady, ale pokud je to řetězec, se kterým pracujete, myslím, že strlen() pracoval nejvíce důsledně. Pro ukončení řetězce na konci potřebujete +1 pro \0 (null).
  • použijte int arr) +1)] pro pole jiných typů. Je to divný způsob, jak dělat věci, ale to je to, co dostanete s nízkou úrovní jazyka.
  • \0 představuje null a ukončí pole. Může to být užitečné, když se snažíte zabránit problémům s přetečením vyrovnávací paměti.
  • zkuste co nejvíce použít definované konstanty. Kdykoli budete moci definovat věci v předkompilu, ušetří vám to čas ladění později.
  • pochopte, k čemu jsou hlavičkové soubory určeny. Mnoho tutoriálů vám řekne, co obsahuje hlavičkový soubor, ale není vždy jasné, k čemu jsou. Hlavičkové soubory jsou zachyceny v době před kompilací a poskytují souhrn proměnných a funkcí, které má program k dispozici * před kompilací*. To znamená, že .C soubory obsažené v programu budou mít přístup k těmto funkcím, za předpokladu, že #include <headerfile.h> je přidán do souboru. Dobrá konvence je vytvořit .h soubor při každém vytvoření .
  • většina smyček jde takto: for (int i=0; i < stop; i++) snadný způsob, jak mít past na přerušení, je umístit ≤ před stop.
  • Udržujte své problémy obsažené. Zkuste to udělat tak, aby každý soubor dělal několik diskrétních věcí a nic jiného. Máte-li lovit přes různé soubory znovu a asi, to může najít vaše problémy seg poruchy opravdu obtížné.
  • počítačová Matematika je těžká. Není to tak, ale malé věci způsobují velké problémy. char variable například znamená pole obsahující dvě položky, ale protože indexy začínají na 0, znamená to, že můžete jít pouze na číslo 1.
  • vytiskněte řetězce formátu jako správný typ. Naštěstí se to obvykle chytí v době kompilace, ale stále to může způsobit problémy. Ujistěte se, že váš formátový znak %{whatever} vyhovuje libovolné proměnné, kterou do něj chcete vložit.

to je vše, co mám pro tuto chvíli. Doufám, že vám moje utrpení ušetřilo bolesti hlavy po silnici! Pokud vše ostatní selže,nyní mám seznam věcí, které musím zkontrolovat, než vytáhnu vlasy!