|
| 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...
| |
|
|