Accedendo elemento di spinta sparse_matrix sembra stallo programma
-
19-09-2019 - |
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.
Soluzione
Alcune cose da provare per eseguire il debug del codice (non necessariamente cambiamenti permanenti):
- Modificare il
bool
ad unint
nel tipo matrice perc
, 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.