/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Segmentation fault? Linux
Fra : mtg


Dato : 23-06-04 10:06

HEj NG,

Har skrevet et C++ program i KDevelop under Red hat 8, hvor main-funktionen
meget forenklet er således:

int main(...)
{
Type objekt1;
while(1)
{
Funktionskald 1
...
...
objekt1.Funktionskald X
Funktionskald X+1
}
}

Programmet kører fint i nogle minutter, men fejler pludselig med
segmentation fault under kald til 'Funktionskald X'.
Det er selve kaldet der fejler, programmet kommer fint ud af Funktionskald
X-1, fejler i den linie hvor Funktionskald X finder sted, og eksekverer
aldrig linie 1 i Funktion X.
HVAD ER ÅRSAGEN? Er det noget der går galt med stacken under kaldet eller
hvad?
Funktionen kaldes på et objekt som er initialiseret korrekt, der er på
fejltidspunktet kaldt mange andre funktioner på objektet uden problemer osv.
osv., men problemet opstår ALTID samme sted i main sløjfen.

Håber nogen kan komme med bud på hvad der er galt, da jeg snart er løbet tør
for hovedhår....




 
 
Klaus Petersen (23-06-2004)
Kommentar
Fra : Klaus Petersen


Dato : 23-06-04 10:27

> Programmet kører fint i nogle minutter, men fejler pludselig med
> segmentation fault under kald til 'Funktionskald X'.
> Det er selve kaldet der fejler, programmet kommer fint ud af Funktionskald
> X-1, fejler i den linie hvor Funktionskald X finder sted, og eksekverer
> aldrig linie 1 i Funktion X.
> HVAD ER ÅRSAGEN?

En programmeringsfejl.

(hvis du vil have et mere præcist svar kunne du f.eks. vise koden)



mtg (23-06-2004)
Kommentar
Fra : mtg


Dato : 23-06-04 10:36


"Klaus Petersen" <spectual2@getTOnet.dk> wrote in message
news:i1cCc.43$Ye2.34@news.get2net.dk...

> > HVAD ER ÅRSAGEN?
>
> En programmeringsfejl.

Ja tak, det havde jeg nok selv regnet ud....
Jeg havde jo nok håbet på et mere oplysende svar, f. eks. i retning af "jeg
har oplevet noget lignende, og dengang var årsagen at ...".

> (hvis du vil have et mere præcist svar kunne du f.eks. vise koden)

Pseudokoden giver det overordnede billede, hvis jeg viste hele koden, som du
åbenbart lægger op til, ville min post blive så lang at ingen gad læse den.
Jeg er også mere ude efter nogle overordnede hints til hvor/hvordan jeg skal
lede efter fejlen, end at du lige netop fortæller mig at "det er variabel X
det er galt med i line 2543". For den type fejl kan jeg godt selv finde,
hvis jeg ved nogenlunde hvor jeg skal kigge!



Klaus Petersen (23-06-2004)
Kommentar
Fra : Klaus Petersen


Dato : 23-06-04 10:48


> Ja tak, det havde jeg nok selv regnet ud....
> Jeg havde jo nok håbet på et mere oplysende svar, f. eks. i retning af
"jeg
> har oplevet noget lignende, og dengang var årsagen at ...".

Jeg har da oplevet det "en million" gange før med "en million" forskellige
årsager.

Men du fortæller stort set ingenting om det program du laver og derfor er
det også umuligt at sige noget om hvad der kan være årsagen udover at det
formindtlig er en programmeringsfejl.

> Pseudokoden giver det overordnede billede

Synes du virkelig? den siger da ikke en skid udover at du har en løkke og et
funktionskald (det har 99.99999% af alle programmer da) (no affence).

> hvis jeg viste hele koden, som du åbenbart lægger op til, ville min post
blive så lang at ingen > gad læse den.

Ja så ser det ud til at du må løse det selv. Den korte version er ligeså
ubrugelig.

> Jeg er også mere ude efter nogle overordnede hints til hvor/hvordan jeg
skal
> lede efter fejlen, end at du lige netop fortæller mig at "det er variabel
X
> det er galt med i line 2543". For den type fejl kan jeg godt selv finde,
> hvis jeg ved nogenlunde hvor jeg skal kigge!

Brug udelukkelsesmetoden. Frakobl så meget funktionalitet som du kan. Indfør
så meget fejlhåndtering som muligt. Udskriv evt. input data ud og tjek om
det ser rigtigt ud. Overvej om det kan være et thread issue. Kig efter
memoryleaks. Er der noget der ikke bliver lukket eller frigjort. Udled så
meget information om programmet tilstand ved fejlen som muligt.



Mogens Hansen (23-06-2004)
Kommentar
Fra : Mogens Hansen


Dato : 23-06-04 15:51


"mtg" <mtg@nospam.dk> wrote in message
news:cbbh39$1klk$1@news.cybercity.dk...
> HEj NG,
>
> Har skrevet et C++ program i KDevelop under Red hat 8, hvor
main-funktionen
> meget forenklet er således:
>
> int main(...)
> {
> Type objekt1;
> while(1)
> {
> Funktionskald 1
> ...
> ...
> objekt1.Funktionskald X
> Funktionskald X+1
> }
> }

Det siger ikke alverden.

>
> Programmet kører fint i nogle minutter,

Hvordan _ved_ du det ?
Måske kører det ikke fint, men du ved det blot ikke endnu.

> men fejler pludselig med
> segmentation fault under kald til 'Funktionskald X'.
> Det er selve kaldet der fejler, programmet kommer fint ud af Funktionskald
> X-1, fejler i den linie hvor Funktionskald X finder sted, og eksekverer
> aldrig linie 1 i Funktion X.
> HVAD ER ÅRSAGEN? Er det noget der går galt med stacken under kaldet eller
> hvad?

Det er typisk fordi dit program et eller andet sted har "undefined
behaviour".
Det kan f.eks. være fordi du tilgår noget hukommelse der er frigivet, eller
har lavet ged i noget pointer aritmetik.
Ikke sjældent er der stor afstand (i tid og/eller kodelinier) mellem årsagen
til fejlen og stedet der viser symptomer på fejl.

> Funktionen kaldes på et objekt som er initialiseret korrekt, der er på
> fejltidspunktet kaldt mange andre funktioner på objektet uden problemer
osv.
> osv., men problemet opstår ALTID samme sted i main sløjfen.

Det er da dejligt - det gør det væsentligt nemmere at rette fejlen

>
> Håber nogen kan komme med bud på hvad der er galt, da jeg snart er løbet
tør
> for hovedhår....

Undefined behaviour.
Sørg for at dit program er fri for de mest almindelige memory fejl.
Det kan verificeres med forskellige værktøjer.
Når nu det er Linux kan det være en ide at kigge på Valgrind
(http://valgrind.kde.org/) eller Purify
(http://www-306.ibm.com/software/awdtools/purify/unix/).

Venlig hilsen

Mogens Hansen



Preben (23-06-2004)
Kommentar
Fra : Preben


Dato : 23-06-04 16:15

Hej

> int main(...)
> {
> Type objekt1;
> while(1)
> {
> Funktionskald 1
> ...
> ...
> objekt1.Funktionskald X
> Funktionskald X+1
> }
> }
>
> Programmet kører fint i nogle minutter, men fejler pludselig med
> segmentation fault under kald til 'Funktionskald X'.
> Det er selve kaldet der fejler, programmet kommer fint ud af Funktionskald
> X-1, fejler i den linie hvor Funktionskald X finder sted, og eksekverer
> aldrig linie 1 i Funktion X.

Er du sikker på Funktionskald X og X+1 eksisterer, har du prøvet at
stoppe ved X-1 istedet og se om fejlen er der stadigvæk!


Mvh / Preben Holm
(som ikke har programmeret særlig meget i C, men dog har haft
segmentation fault!)

Christoffer Olsen (23-06-2004)
Kommentar
Fra : Christoffer Olsen


Dato : 23-06-04 16:56

"mtg" <mtg@nospam.dk> writes:

> Programmet kører fint i nogle minutter, men fejler pludselig med
> segmentation fault under kald til 'Funktionskald X'.
> Det er selve kaldet der fejler, programmet kommer fint ud af Funktionskald
> X-1, fejler i den linie hvor Funktionskald X finder sted, og eksekverer
> aldrig linie 1 i Funktion X.

Måske du kan se hvor den går ned hvis du kører det igennem gdb,
Electric fence eller valgrind (som jeg blev anbefalet her i gruppen).

--
Mvh
Christoffer Olsen

http://my.opera.com/dev/discussion/openweb/20030206/

Nicolai Hansen (24-06-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 24-06-04 07:47

> Har skrevet et C++ program i KDevelop under Red hat 8, hvor main-funktionen
> meget forenklet er således:
>
> int main(...)
> {
> Type objekt1;
> while(1)
> {
> Funktionskald 1
> ...
> ...
> objekt1.Funktionskald X
> Funktionskald X+1
> }
> }
>
> Programmet kører fint i nogle minutter, men fejler pludselig med
> segmentation fault under kald til 'Funktionskald X'.
> Det er selve kaldet der fejler, programmet kommer fint ud af Funktionskald
> X-1, fejler i den linie hvor Funktionskald X finder sted, og eksekverer
> aldrig linie 1 i Funktion X.

Er funktionskald X virtuel? Virtuelle metoder ligger som pointere i en
lille tabel i objektet (så hudt jeg hvisker ligger de lige inden
objektet), og det hænder at denne tabel bliver overskrevet. F.eks. ved
at man har en char[x] som sidste del af hukommelsen af objektet inden,
og kommer til at skrive til char[x+1]. Den slags fejl.

Bare et skud fra hoften herfra, hvis jeg var dig ville jeg køre
programmet i gdb og debugge mig ud af problemet.

Mogens Hansen (24-06-2004)
Kommentar
Fra : Mogens Hansen


Dato : 24-06-04 18:07


"Nicolai Hansen" <nic@aub.dk> wrote:

[8<8<8<]
> Er funktionskald X virtuel? Virtuelle metoder ligger som pointere i en
> lille tabel i objektet

Næsten.

Den mest almindelige måde at implementere virtuelle metoder (i C++), er at
objektet indeholder en _pointer_ til en tabel med adressen på funktionerne.
På den måde bliver tabellen delt af _alle_ objekter af en given type,
hvilket giver en væsentlig hukommelses besparelse.


Venlig hilsen

Mogens Hansen



Nicolai Hansen (25-06-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 25-06-04 08:04

"Mogens Hansen" <mogens_h@dk-online.dk> wrote in message news:<cbf1o8$1mvl$1@news.cybercity.dk>...
> "Nicolai Hansen" <nic@aub.dk> wrote:
>
> [8<8<8<]
> > Er funktionskald X virtuel? Virtuelle metoder ligger som pointere i en
> > lille tabel i objektet
>
> Næsten.
>
> Den mest almindelige måde at implementere virtuelle metoder (i C++), er at
> objektet indeholder en _pointer_ til en tabel med adressen på funktionerne.
> På den måde bliver tabellen delt af _alle_ objekter af en given type,
> hvilket giver en væsentlig hukommelses besparelse.
>
>
> Venlig hilsen
>
> Mogens Hansen

Okay - i så fald er det et andet sted der skal ledes efter et overflow :)

Troels Thomsen (24-06-2004)
Kommentar
Fra : Troels Thomsen


Dato : 24-06-04 12:50

> osv., men problemet opstår ALTID samme sted i main sløjfen.
>

Det er jo en stor luksus at du kan fremprovokere fejlen.

1)
Barber kode væk, lav det hele simplere og simplere, kort sagt lav det
mindste program du overhovedet kan, som stadig laver fejlen. Enten indser du
problemet selv undervejs, eller også er der sikkert så lidt kode tilbage at
du kan poste det her.

2)
En debugger med en call stack mv på crash tidspunktet, ville jo være sweet
......

tpt



Per Abrahamsen (25-06-2004)
Kommentar
Fra : Per Abrahamsen


Dato : 25-06-04 10:40

"mtg" <mtg@nospam.dk> writes:

> HVAD ER ÅRSAGEN?

Dit program prøver at referere et stykke memory som ikke er allokeret
af systemet. Som andre har foreslået, kør programmet under valgrind
for flere oplysninger. Det er trivielt, i stedet for at skrive

prompt% program argumenter...

skriver du

prompt% valgrind program argumenter...


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408915
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste