Domanda

Ho uno strano bug che spero un'esperienza più programmatore potrebbe avere qualche informazione in. Sto utilizzando la spinta uBLAS matrici sparse, in particolare mapped_matrix, e non v'è un errore intermittente che si verifica alla fine, ma non nelle fasi iniziali del programma. Questo è un grande programma, quindi non possono inserire tutto il codice ma l'idea di base è che chiamo una funzione che appartiene a una classe particolare:

bool MyClass::get_cell(unsigned int i, unsigned int j) const
{
    return c(i,j);
}

La variabile c è definito come un membro della classe

boost::numeric::ublas::mapped_matrix<bool> c;

Quando si verifica l'errore, il programma sembra fermarsi (ma non va in crash). Debug con Eclipse, posso vedere che il programma entra il codice mapped_matrix spinta e continua parecchi livelli giù in std :: map, std :: _ Rb_tree, e std :: meno. Inoltre, il programma tracce di tanto in tanto fino a std :: map, std :: _ Rb_tree, e std :: _ Select1st. Mentre il codice è in esecuzione e la linea attiva che cosa è in cambiamenti di memoria in _Rb_tree, l'esecuzione non sembra mai di tornare nel livello di std :: map. La linea in std :: mappare il programma è bloccato sul è il ritorno della seguente funzione.

const_iterator
find(const key_type& __x) const
{ return _M_t.find(__x); }

Mi sembra che ci sia qualche elemento nella matrice c che il programma sta cercando ma in qualche modo il meccanismo di archiviazione sottostante ha "fuori luogo esso". Tuttavia, io non sono sicuro perché o come risolvere il problema. Questo potrebbe anche essere di base completamente fuori.

Qualsiasi aiuto è possibile fornire sarebbe molto apprezzato. Se non ho incluso le informazioni giuste in questa domanda, per favore fatemelo sapere che cosa mi manca. Grazie.

È stato utile?

Soluzione

Alcune cose da provare per eseguire il debug del codice (non necessariamente cambiamenti permanenti):

  • Modificare il bool ad un int nel tipo matrice per c, per vedere se la matrice aspetta tipi numerici.
  • Modificare tipo a matrice ad un altro con un'interfaccia simile, eventualmente pianura vecchio matrix.
  • Valgrind l'applicazione (se siete su linux) per verificare che non stai corrompere la memoria.

Se non funziona, si potrebbe provare a chiamare get_cell ogni volta che si modifica la matrice per vedere quello che potrebbe essere la causa del problema.

In mancanza di questo, potrebbe essere necessario cercare di ridurre il problema a un sottoinsieme molto più piccolo di codice che potete inserire qui.

Potrebbe aiutare se ci dicono che cosa compilatore e sistema operativo che si sta utilizzando.

Altri suggerimenti

E 'questa parte di un programma multithread?

chiedo, perché di solito quando vedo problemi in STL, esso finisce per essere un problema con l'accesso non sincronizzato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top