Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Segfault -> brauche Hilfe

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
04.10.2006, 23:26 Uhr
~testo
Gast


Hallo,
ich kämpfe seit tagen an dem problem...

begonnen hat alles damit dass eine bibliotheksfunktion ein array veränderte welches überhaupt nichts mit ihr zu tun hatte. Ich dachte da an einen Buffer Oveflow in der Bibliotheksfunktion...

Nun wollte ich "auf andere Art" etwas die IMplementierung umschreiben und bekomme einen seltsamen segfault. Er kann meinen vektor einfach nicht füllen...




C++:


    std::vector<double> erg;
     for(int i = 0; i < 100; i++)
     {
         std::cout << "iter: " <<  i << std::endl;
         erg.push_back(1.0);
     }





bei iteration 2 hört er auf...

im Debugger angeschmissen...
ich komme kurz bevor der segfault kommt an diese stelle in den bibliotheken:



C++:


push_back(const value_type& __x)
       {
     if (_M_finish != _M_end_of_storage)
       {
         _Construct(_M_finish, __x);
         ++_M_finish;
       }



auf einen weiteren step kommt:


C++:


      iterator
       end() { return iterator (_M_finish); }




und dann kommt der segfault....

eine augabe meines top unter linux ergibt im debugger nur noch freien speicher von ca. 3222 kb. also ziemlich voll - obwohl ich an der stelle nicht weiß ob das überhaupt eine aussage ist mit top weil ja evtl. einfach der maximale speicher reserviert wird durch den debugger...keine Ahnung..

hier noch der stack trace:

C++:
Invalid read of size 4
==5899==    at 0x1CE65642: std::__default_alloc_template<true, 0>::allocate(unsigned) (in /usr/lib/libstdc++.so.5.0.7)
==5899==    by 0x8069B59: std::vector<double, std::allocator<double> >::_M_insert_aux(__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >, double const&) (stl_alloc.h:232)
==5899==    by 0x8067560: Spai::Create_A_Hat_test(std::vector<double, std::allocator<double> >, int&, int&, std::vector<double, std::allocator<double> >, std::vector<double, std::allocator<double> >) (stl_vector.h:371)
==5899==    by 0x806600B: Spai::Spai_Algorithm(std::vector<double, std::allocator<double> > const&, std::vector<double, std::allocator<double> > const&, int) (stl_alloc.h:242)
==5899==    by 0x8065637: Spai::Spai() (Spai.cpp:245)
==5899==    by 0x806B2E9: Caching::Caching() (Caching.cpp:12)
==5899==    by 0x80507BB: UIMainWindow::UIMainWindow() (UIMainWindow.cpp:25)
==5899==    by 0x8050480: main (UIMain.cpp:16)
==5899==  Address 0x74F75AC is not stack'd, malloc'd or (recently) free'd
==5899==
==5899== Process terminating with default action of signal 11 (SIGSEGV)
==5899==  Access not within mapped region at address 0x74F75AC
==5899==    at 0x1CE65642: std::__default_alloc_template<true, 0>::allocate(unsigned) (in /usr/lib/libstdc++.so.5.0.7)
==5899==    by 0x8069B59: std::vector<double, std::allocator<double> >::_M_insert_aux(__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >, double const&) (stl_alloc.h:232)
==5899==    by 0x8067560: Spai::Create_A_Hat_test(std::vector<double, std::allocator<double> >, int&, int&, std::vector<double, std::allocator<double> >, std::vector<double, std::allocator<double> >) (stl_vector.h:371)
==5899==    by 0x806600B: Spai::Spai_Algorithm(std::vector<double, std::allocator<double> > const&, std::vector<double, std::allocator<double> > const&, int) (stl_alloc.h:242)
==5899==    by 0x8065637: Spai::Spai() (Spai.cpp:245)
==5899==    by 0x806B2E9: Caching::Caching() (Caching.cpp:12)
==5899==    by 0x80507BB: UIMainWindow::UIMainWindow() (UIMainWindow.cpp:25)
==5899==    by 0x8050480: main (UIMain.cpp:16)




Für Jede Hilfe bin ich tausend mal dankbar!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.10.2006, 23:52 Uhr
~testo
Gast


da ich einfach nicht weiter weiss und verzweifelt bin...wenn ich diese methode auskommentiere dann iteriert er weiter als bis 2 aber bricht dann bei 46 ab...

kann es evtl. sein dass die Referenzen irgendwie dafür verantwortlich sind?




C++:
        Insert_m_k_hat      (M,
                                     p_col,
                                     e_k_hat);

...

void
Spai::Insert_m_k_hat(std::vector< double >& M,
                     const std::vector< double >& p_col,
                     const std::vector< double >& e_k_hat)
{
    std::vector< double >::const_iterator el = e_k_hat.begin();
    for( std::vector< double >::const_iterator i = p_col.begin();
         i != p_col.end();
         ++i )
    {
        if( !(fabs(*i - 0.0) <= epsilon) )
            M.push_back(*el++);  
        else
            M.push_back(0.0);  
    }
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.10.2006, 07:34 Uhr
virtual
Sexiest Bit alive
(Operator)


Für mich hört sich das so an, als würde Dir etwas vorher den Speicher zerschiessen. Was das ist, kann ich Dri so auch nicht sagen, aber du kannst es zB mit valgrind versuchen herauszubekommen.

Und nein, die Ausgabe von top ist nicht sinnvoll: du kannst zu free noch buffered hinzurechnen, dann hast Du den Speicher, der noch nicht belegt ist
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.10.2006, 08:50 Uhr
(un)wissender
Niveauwart


Deine Frage habe ich schon im anderen Thread beantwortet. el wird inkrementiert und nicht gegen end() getestet.
Die Schleife ist so schlicht falsch. Oder es muss sichergestellt werden das e_k_hat.size() >= p_col.size()
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.10.2006, 19:43 Uhr
~testo
Gast


Danke aber im anderen Thread hat es sich anscheinen ausgepostet...und da habe ich auch erwähnt dass p_col IMMER weniger oder gleich viele belegungen (mit belegung meine ich wert ungleich 0.0) hat wie e_k_hat. D.h es wird nie passieren. Aber um sicherzughen habe ich auch eine abfrage reingehauen mit && (el != e_k_hat.end()) und das hat nichts verändert.

mit valgrind komme ich so net wirklich weiter...der trace ist der einzige der ausgegeben wird...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.10.2006, 19:51 Uhr
0xdeadbeef
Gott
(Operator)


Meine Vermutung ist eine ungültige Referenz. Vielleicht sowas wie

C++:
std::vector<double> &broken_function() {
  std::vector<double> v;
  return v;
}

Spai foo;

foo.Insert_m_k_hat(broken_function(), bar, baz);


Ist aber nur ins blaue geschossen. Ums sicher zu sagen, bräuchte ich mehr Code.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.10.2006, 19:59 Uhr
~testo
Gast


hmm danke ich könnte die eine klasse mal posten in der der fehler liegen muss aber obs was bringt...?? kompilieren werdet ihr es net können weil ich fortran aufrufe drin hab....aber hier mal der teil der dafür verantwortlich sein muss:



C++:

std::vector< double >
Spai::Spai_Algorithm(const std::vector< double >& A,
                     const std::vector< double >& P,
                     const int dimension
                     )
{  
    int                             m,
                                    n,
                                    lda,
                                    k,
                                    info,
                                    lwork,
                                    one = 1;
                                  
    char                            *SIDE="L",
                                    *TRANS="T", //from left and transpose
                                    *UPLO="U",
                                    *NCHAR="N"; // upper triangular matrix not transposed
      
    std::vector< double >            work,
                                     tau,
                                     M,
                                     A_hat,
                                     e_k_hat,
                                     p_col(dimension);
                        
    std::vector< double >::iterator  iter;
    
    for(int col = 0; col < dimension; col++)
    {

        Get_Pattern_Column          (p_col,
                                     P,
                                     col,
                                     dimension);
    
        

        Create_e_k                  (col,
                                     dimension,
                                     e_k_hat);
        
        

        Create_A_Hat__e_k_Hat       (A,
                                     n,
                                     m,
                                     p_col,
                                     A_hat,
                                     e_k_hat);

        

        Update_Lapack_Values        (m,
                                     n,
                                     k,
                                     lda,
                                     tau,
                                     lwork,
                                     work);
        
        

        get_opt_lwork               (A_hat,
                                     m,
                                     n);

        dgeqrf_                     (&m,
                                     &n,
                                     &A_hat[0],
                                     &lda,
                                     &tau[0],
                                     &work[0],
                                     &lwork,
                                     &info);  
        

        //Computing :   Q^T * e_k_hat
        dormqr_                     (SIDE,
                                     TRANS,
                                     &m,
                                     &n,
                                     &k,
                                     &A_hat[0],
                                     &lda,
                                     &tau[0],
                                     &e_k_hat[0],
                                     &lda,
                                     &work[0],
                                     &lwork,
                                     &info);

                
      
        Ectract_quadratic_content   (A_hat,
                                     m,
                                     n);
  
        

        dtrtrs_                     (UPLO,
                                     NCHAR,
                                     NCHAR,
                                     &n,
                                     &one,
                                     &A_hat[0],
                                     &n,
                                     &e_k_hat[0],
                                     &n,
                                     &info);
        
        Insert_m_k_hat              (M,
                                     p_col,
                                     e_k_hat);
        
    }
    return M;
}



void
Spai::Get_Pattern_Column(std::vector< double >& p_col,
                         const std::vector< double >& P,
                         const int col,
                         const int dimension)
{
    p_col.clear();
    p_col.insert(p_col.begin(),
                 P.begin() + dimension * col,
                 P.begin() + dimension * ( col + 1 ));
}



void
Spai::Create_e_k(const int col,
                 const int dimension,
                 std::vector< double >& e_k_hat)
{
    e_k_hat.clear();
    e_k_hat.resize(dimension, 0.0);
    e_k_hat[col] = 1.0;
}



void
Spai::Create_A_Hat__e_k_Hat(const std::vector< double >& A,
                            int& A_hat_dim_x,
                            int& A_hat_dim_y,
                            const std::vector< double >& p_col,
                            std::vector< double >& A_hat,
                            std::vector< double >& e_k_hat)
{  
    A_hat_dim_x = 0;
    A_hat_dim_y = p_col.size();

    
    
    A_hat.clear();
    for(int y = 0; y < p_col.size(); y++)
    {  
        if(fabs(p_col[y] - 1.0) <= epsilon)
        {
            A_hat.insert(A_hat.end(),
                         A.begin() + p_col.size() * y,
                         A.begin() + p_col.size() * (y + 1));
            A_hat_dim_x++;
        }
    }
    Erase_Zero_Rows(A_hat, A_hat_dim_x, A_hat_dim_y, e_k_hat);
}



void
Spai::Erase_Zero_Rows(std::vector< double >& matrix,
                      int& x_dim,
                      int& y_dim,
                      std::vector< double >& vector)
{
    std::vector< bool >     mask( y_dim );
    
    for ( int y = 0; y < y_dim; ++y )
    {
        mask[ y ] = true;
        if(fabs(vector[ y ] - 1.0) <= epsilon)
            mask[ y ] = false;
        for ( int x = 0; x < x_dim; ++x )
        {
            if ( matrix[ x * y_dim + y ] != 0 )
            {
                mask[ y ] = false;
                break;
            }
        }
    }
    
    matrix.erase( std::remove_if( matrix.begin(),
                  matrix.end(),
                  IS_MASKED( matrix, mask ) ),
    matrix.end() );
    vector.erase( std::remove_if( vector.begin(),
                  vector.end(),
                  IS_MASKED( vector, mask ) ),
    vector.end() );
  
    y_dim = matrix.size() / x_dim;    
}



void
Spai::Update_Lapack_Values(const int m,
                           const int n,
                           int& k,
                           int& lda,
                           std::vector< double >& tau,
                           int& lwork,
                           std::vector< double >& work)
{
    tau.clear();
    work.clear();
    k = std::min(m,n);
    lda = std::max(m,1);
    lwork = std::max(n,1);            
    tau.resize(k);  
    work.resize(std::max(1,lwork));
}



void
Spai::Insert_m_k_hat(std::vector< double >& M,
                     const std::vector< double >& p_col,
                     const std::vector< double >& e_k_hat)
{
    std::vector< double >::const_iterator el = e_k_hat.begin();
    for( std::vector< double >::const_iterator i = p_col.begin();
         i != p_col.end();
         ++i )
    {
        if( !(fabs(*i - 0.0) <= epsilon) )
            M.push_back(*el++);  
        else
            M.push_back(0.0);  
    }
}



void
Spai::Ectract_quadratic_content(std::vector< double >& A_hat,
                                const int m,
                                const int n)
{
    if (m <= n)
        A_hat.erase(A_hat.begin() + m * m, A_hat.end());
    else
    {
        std::vector< bool >     mask( m );
        for ( int y = 0; y < m; ++y )
        {
            mask[ y ] = false;
            if(y >= n)
                mask[ y ] = true;
        }
    
        A_hat.erase( std::remove_if( A_hat.begin(),
                     A_hat.end(),
                     IS_MASKED( A_hat, mask ) ),
                     A_hat.end() );
    }  
}



int
Spai::get_opt_lwork(std::vector< double >& A_hat,
                    int m,
                    int n)
{
    int                     lw = -1,
    info = 0,
    lwork = 0;
            
    double                  work = 0.0;
    
    std::vector< double >   tau;

    dgeqrf_(&m,
            &n,
            &A_hat[0],
            &m,
            &tau[0],
            &work,
            &lw,
            &info);
    
    lwork = static_cast< int > (work);

    return lwork;
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
06.10.2006, 00:14 Uhr
~testo
Gast


ich habe nun vergeblich versucht mein programm abzuändern...mittlerweile weiß ich einfach nicht weiter....ich habe nun ALLE referenzen aufgelöst und übergebe funktionsargumente nur noch so damit lokale kopien angelegt werden...es hat nichts gebracht...

mittlerweile bekomme ich folgende meldung mit der ich nichts anfangen kann:


Code:
Conditional jump or move depends on uninitialised value(s)
==7212==    at 0x1CE65746: std::__default_alloc_template<true, 0>::deallocate(void*, unsigned) (in /usr/lib/libstdc++.so.5.0.7)
==7212==    by 0x8064E3A: Spai::ttt() (Spai.cpp:280)
==7212==    by 0x806B3E9: Caching::Caching() (Caching.cpp:12)
==7212==    by 0x80507BB: UIMainWindow::UIMainWindow() (UIMainWindow.cpp:25)
==7212==    by 0x8050480: main (UIMain.cpp:16)
==7212==
==7212== Conditional jump or move depends on uninitialised value(s)
==7212==    at 0x1B906C5D: operator delete(void*) (vg_replace_malloc.c:155)
==7212==    by 0x1CE6575B: std::__default_alloc_template<true, 0>::deallocate(void*, unsigned) (in /usr/lib/libstdc++.so.5.0.7)
==7212==    by 0x8064E3A: Spai::ttt() (Spai.cpp:280)
==7212==    by 0x806B3E9: Caching::Caching() (Caching.cpp:12)
==7212==    by 0x80507BB: UIMainWindow::UIMainWindow() (UIMainWindow.cpp:25)
==7212==    by 0x8050480: main (UIMain.cpp:16)
==7212==
==7212== Invalid free() / delete / delete[]
==7212==    at 0x1B906CA8: operator delete(void*) (vg_replace_malloc.c:155)
==7212==    by 0x1CE6575B: std::__default_alloc_template<true, 0>::deallocate(void*, unsigned) (in /usr/lib/libstdc++.so.5.0.7)
==7212==    by 0x8064E3A: Spai::ttt() (Spai.cpp:280)
==7212==    by 0x806B3E9: Caching::Caching() (Caching.cpp:12)
==7212==    by 0x80507BB: UIMainWindow::UIMainWindow() (UIMainWindow.cpp:25)
==7212==    by 0x8050480: main (UIMain.cpp:16)
==7212==  Address 0x1CE9C440 is not stack'd, malloc'd or (recently) free'd




nach 5 tagen würde ich am liebsten den rechner zertrümmern
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.10.2006, 20:41 Uhr
~testo
Gast


der fehler scheint merkwürdigerweise in der funktion
Create_e_k() zu liegen....

wenn ich statt dieser methode folgende methode implementiere:

C++:
e_k_hat = Create_e_k_test(col, dimension);

...

std::vector<double>
Class::Create_e_k_test(const int col,
                                   const int dimension)
{
    std::vector< double > erg(dimension, 0.0);
    erg[col] = 1.0;
    return erg;
}



also mit rückgabewert vector dann läuft alles prima durch....???
ABER WARUM???

Kann es sein dass das irgendwie nur eine adresse hier überschrieben wird in der funktion und die dann den segfault einleitet oder irgendwas und damit die funktion Create_e_k() gar nicht der fehler ist????
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
07.10.2006, 20:48 Uhr
~testo
Gast


hier noch der backtrace der für die segfault methode ausgegeben wird unter gdb

Code:

#0  0x4155b642 in std::__default_alloc_template<true, 0>::allocate () from /usr/lib/libstdc++.so.5
#1  0x08066291 in Spai::Create_e_k (this=0xbffff610, e_k_hat=@0xbffff3f0, col=0, dimension=4) at stl_alloc.h:232
#2  0x08065de5 in Spai::Spai_Algorithm (this=0xbffff610, A=@0xbffff5d0, P=@0xbffff5b0, dimension=4) at Spai.cpp:312
#3  0x08065638 in Spai (this=0xbffff610) at Spai.cpp:246
#4  0x08068f9a in Caching (this=0xbffff640) at Caching.cpp:12
#5  0x080507bc in UIMainWindow (this=0xbffff690) at UIMainWindow.cpp:25
#6  0x08050481 in main (argc=1, argv=0x0) at UIMain.cpp:16

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: