[elektro] Szegmentálási hiba

SZIGETI Szabolcs szigiszabolcs at gmail.com
Wed Feb 12 12:34:48 CET 2014


Hali!

Core dump szerintem csak ezért nincs, mert be van állítva, hogy ne legyen
(unlimit paracs, core file size nulla szerintem).
A szegmentálási hiba során a program a SIGSEGV signált fogja kapni, ennek
az alapértelmezése az, hogy kilövi a progit.
Ennek megakadályozására signal kezelőt kell erre a signalra raknod. Erre
régen a signal, manapság a sigaction rendszerhívás szolgál. Írsz egy
függvényt, amit szeretnél, ha végrehajtódna, ha jön a signal.
Ezt a fenti rendszerhívással az adott signalra tudod rakni mint kezelő,
innentől kezdve nem a default dolog fog történni, hanem lefut ez a fv, ha
jön a signal.
Ugyanígy tudod kezelni pl. a CTRL-C nyomást is, hogy rendezetten álljon le
a program.
A SOGKILL és a SIGSTOP kivéltelével minden signalra tudsz saját kezelőt
írni.
A siganl() rendszerhívás egyszerűbb, de van pár hátránya, pl. többszörös
signalok kezelésénél, stb. A sigaction() összetettebb, de jobban működik.
El tudom képzelni, hogy neked jelen esetben a signal is jó, mert gondlom
úgyis kilépteted aztán a programot.
A net tele van példákkal, egy-az-eygben használhatod őket,

De elleneben javasolnám először az egyszerűbb utat. Engedélyezd a
core-dumpot és az alapján debuggold aprogramot. Ha elhasalt, elviszed a
core filet, és a gdb-vel vagy annak valamilyen grafikus verziójával szépen
meg tudod nézni, hogy mit történt a kérdéses esetben.
Nagyon hasznos dolog core file-t debuggolni, érdemes a technikáját
megtanulni.

Szabolcs



.


2014. február 12. 11:27 Acs Gabor írta, <levlista at e8e.eu>:

> Szia, igen, az oprendszer stimt.
>
> Ilyen súlyos hibák szerencsére nem jönnek (core dump). Kérhetnék egy kis
> oktatást, hogy hogyan kell ezt a programban megvalósítani? Szegmentálási
> hibát ír ki, amikor kilövi a programomat, ezt milyen signalok
> kezelésével lehet megfogni?
>
> Gábor
>
> 2014.02.12. 11:10 keltezéssel, SZIGETI Szabolcs írta:
> > Hali!
> >
> > Milyen oprendszer?
> > Unix és társai alatt csak a a SIGKILL és a SIGSTOP signal nem kezelhető
> le,
> > minden más igen. Nekem a SIGSEGV-et kell kezelni, ami defaultban core
> dump
> > és halál, de beállíthatsz más kezelőt.
> > Lásd sigaction() hívás.
> >
> > Szabolcs
> >
> >
> >
> >
> > 2014. február 12. 10:57 Acs Gabor írta, <levlista at e8e.eu>:
> >
> >> Sziasztok!
> >>
> >> A C program ha elszáll szegmentálási hibával, azt meg lehet fogni egy
> >> belső hibakezeléssel, vagy úgyse fogja hagyni az oprendszer, és
> >> mindenképp kirúgja?
> >>
> >>
> >> --
> >> Gábor
> >>
> >> -----------------------------------------
> >>            elektro[-flame|-etc]
> >>
> > -----------------------------------------
> >            elektro[-flame|-etc]
> >
>
> -----------------------------------------
>           elektro[-flame|-etc]
>


More information about the Elektro mailing list