GNU/Linux >> Znalost Linux >  >> Linux

Je „chyba segmentace“ systémovou chybou nebo chybou programu?

V současné době spouštím skript statistického modelování, který provádí fylogenetickou ANOVA. Skript běží dobře, když analyzuji celou datovou sadu. Ale když vezmu podmnožinu, začne analyzovat, ale rychle skončí s chybou segmentace. Nemohu ve skutečnosti zjistit pomocí googlu, zda by to mohlo být způsobeno problémem z mé strany (např. ukázková datová sada je malá pro analýzu) a/nebo chybou ve skriptu nebo zda to má něco společného s mým linuxovým systémem. Četl jsem, že to souvisí se zápisem dat do paměti, ale proč je vše v pořádku s větší datovou sadou? Snažil jsem se najít více informací pomocí google, ale tím to bylo složitější.

Děkuji za objasnění předem!

Přijatá odpověď:

(tl;dr:Je to téměř jistě chyba ve vašem programu nebo knihovně, kterou používá.)

Chyba segmentace znamená, že přístup do paměti nebyl legální. To znamená, že na základě vydaného požadavku CPU vydá chybu stránky, protože požadovaná stránka buď není rezidentní, nebo má oprávnění, která nejsou v souladu s požadavkem.

Poté jádro zkontroluje, zda o této stránce prostě nic neví, zda jen ještě není v paměti a mělo by ji tam umístit, nebo zda potřebuje provést nějakou speciální manipulaci (například copy-on -write stránky jsou pouze pro čtení a toto platí chyba stránky může znamenat, že bychom ji měli zkopírovat a aktualizovat oprávnění). Podívejte se na Wikipedii s informacemi o vedlejších vs. hlavních (např. poptávkové stránkování) vs. neplatných chybách stránky.

Získání chyby segmentace znamená neplatný případ:stránka nejenže není v paměti, ale jádro také nemá žádné nápravné akce, které by bylo třeba provést, protože proces logicky nemá tuto stránku svého virtuálního adresního prostoru namapovanou. Jako takové to téměř jistě ukazuje na chybu buď v programu nebo v jedné z jeho základních knihoven – například při pokusu o čtení nebo zápis do paměti, což není pro proces platné. Pokud by adresa byla náhodou platná, mohlo to způsobit poškození zásobníku nebo přepsání jiných dat, ale čtení nebo zápis un mapovaná stránka je zachycena hardwarem.

Důvod, proč to funguje s vaší větší datovou sadou a ne s vaší menší datovou sadou, je zcela specifický pro daný program:pravděpodobně jde o chybu v logice tohoto programu, která se z nějakého důvodu vypne pouze u menší datové sady (například vaše datová sada může mít pole představující celkový počet záznamů, a pokud není aktualizováno, váš program může slepě číst do nepřidělené paměti, pokud neprovádí další kontroly zdravého rozumu).

Je to o několik řádů méně pravděpodobné, než že se jedná pouze o softwarovou chybu, ale chyba segmentace může být také indikátorem hardwarových problémů, jako je vadná paměť, vadný procesor nebo chyba vašeho hardwaru (jako příklad viz zde).

Související:Debian – Automatizace instalace jednotlivých balíčků debian 8 s interaktivními výzvami?

Získání segfault kvůli selhání hardwaru často vede k nefunkčnímu chování, ačkoli špatný kousek ve fyzické paměti RAM může být mapován stejným způsobem při opakovaném spuštění programu, pokud mezi tím nespustíte nic jiného. Tuto možnost můžete většinou vyloučit spuštěním memtest86+, abyste zkontrolovali, zda selhává RAM, a použitím softwaru jako Prime95 pro zátěžové testování vašeho CPU (včetně FP matematických FMA prováděcích jednotek).

Můžete spustit program v debuggeru, jako je gdb a získat zpětné sledování v době chyby segmentace, což pravděpodobně bude indikovat viníka:

% gdb --args ./foo --bar --baz
(gdb) r   # run the program
[...wait for segfault...]
(gdb) bt  # get the backtrace for the current thread

Linux
  1. Fix PHP Error – Není bezpečné spoléhat se na nastavení časového pásma systému

  2. Jak přesměrovat informace o chybě spustitelného programu C na Stdout? (mac Os X)?

  3. Jak vytvořit vlastní chybové stránky

  1. Fixing System nebyl zaveden s systemd as init system Error

  2. Dokážete zjistit, zda stránka existuje, i když vyhodí 404?

  3. Zobrazení zpráv systémové konzoly v GUI

  1. Jak vytvořit vlastní chybové stránky v cPanel

  2. Síť pojmenované chyby je nedostupná v systémových protokolech [Oprava]

  3. Jak nainstalovat starší verzi programu?