PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SIGSEGV in vfprintf () from /lib/libc.so.6



nobody0
22-05-2002, 23:11
Diese komische Meldung bekomme ich von diesem Programm:


#include <errno.h>
#include <math.h>
#include <stdio.h>
#include <float.h>
#include <values.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>


#define N 1000000000 // Anzahl der Teilintervalle zur numerischen Berechnung der beiden Intervalle (1e9)




void sig_handler(int sig)
{
printf("Signal %d - program exiting...\n", sig);
exit(0);
}





int main(void)
{


const long double a_0=5.5e-8; // a_D: h/(2*pi*sqrt(0,2 m_e E_D))
const long double w_max=1e8;
const long double n_d=1e20;
const long double dr=1e-13; // Raumschritt-Breite (in m), wobei obere Integrationsgrenzen = dr * N
const long double dt=1e-9; // Zeitschritt: zunächst 1ns (dann 1,5, 2,25, ...)
// (insges. 42 Zeiten, die rund )

FILE *fp = NULL;
long double r=0;
long double t=0;
long double f1=0, f2=0;

signal(SIGHUP, sig_handler);
signal(SIGINT, sig_handler);
signal(SIGQUIT, sig_handler);
signal(SIGFPE, sig_handler);
signal(SIGTERM, sig_handler);

fp = fopen ("test0.dat", "w+");
if (ferror (fp))
{
perror ("\a can't open output-file\n");
exit (errno);
}
for( t = 0.0 ; t < 0.2 ; t = (t==0.0) ? dt : ( t *= 1.5 ) ) // t=0 ... 0.2s
{
f1=0.0;
f2=0.0;
for(r=dr/2.0;r<N*dr;r+=dr)
{
// Erster Faktor der rechten Seite der Gl. 14
f1 += w_max * expl(-2.0*r/a_0) *expl(-w_max * expl(-2.0*r/a_0) * t)*r*r*dr;
// zweiter Faktor
f2 += ( expl(-w_max * expl(-2.0*r/a_0))*t - 1.0 )*r*r*dr;
}
fprintf(fp,"t= %Le I= %Le\n",t,4*M_PI*n_d*f1*expl(f2*4*M_PI*n_d));
fflush(fp);
fclose(fp);
}
return(0);
} // main



Kompiliert wurde mit dieser Funktion in profile:

function d {
gcc -O2 -D__SMP__ -D_REENTRANT -lm -lvga -Wall -pedantic -ggdb -lefence -o $1 $1.c
}

Und der gdb gibt folgendes aus:


Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1024 (LWP 22187)]
0x400fa064 in vfprintf () from /lib/libc.so.6
(gdb) list
44 const long double a_0=5.5e-8; // a_D: h/(2*pi*sqrt(0,2 m_e E_D))
45 const long double w_max=1e8;
46 const long double n_d=1e20;
47 const long double dr=1e-13; // Raumschritt-Breite (in m), wobei
obere Integrationsgrenzen = dr * N
48 const long double dt=1e-9; // Zeitschritt: zunächst 1ns (dann
1,5, 2,25, ...)
49 // (insges. 42 Zeiten, die rund )
50
51 FILE *fp = NULL;
52 long double r=0;
53 long double t=0;
(gdb) print f1
$1 = -1172926478
(gdb) print f2
$2 = -560977740


Aber wie kann das sein bei einem Programm ohne Pointer und arrays, dass die äussere for-Schleife auch einmal prolemlos durchläuft?
:confused:

Merkwürdig sind ja auch die Werte von f1 und f2, aber die können ja kein Problem sein, denn notfalls kommt +inf, -inf oder NAN heraus, aber das war bisher kein Problem.

nobody0
22-05-2002, 23:15
Nachtrag: das ist unter SuSE 8.0.

nobody0
25-05-2002, 02:23
Hat sich (sicherlich) erledigt; das fclose ist irgendwann mal vor die geschweifte Klammer danach gerutscht und dadurch war das fflush auf die geschlossene Datei nicht mehr möglich und der gdb hat das nicht richtig gemeldet :mad: