2013-01-10 2 views
1

J'ai donc les lignes suivantes dans mon code:Eigen Jacobi provoquant segfault étrange dans C++

MatrixXd qdash = zeroCentredMeasurementPointCloud_.topLeftCorner(3, zeroCentredMeasurementPointCloud_.cols()); 
Matrix3d H = q * qdash.transpose(); 
Eigen::JacobiSVD<MatrixXd> svd(H, Eigen::ComputeThinU | Eigen::ComputeThinV); 

Maintenant, je suis sûr que qdash et H sont en cours initialisés correctement (q est aussi, juste ailleurs). La dernière ligne, impliquant Eigen::JacobiSVD fait que le programme de lancer cette erreur quand il est laissé dans:

Program received signal SIGSEGV, Segmentation fault. 
0xb0328af8 in _list_release() from /usr/qnx650/target/qnx6/x86/lib/libc.so.3 

0 0xb0328af8 in _list_release() from /usr/qnx650/target/qnx6/x86/lib/libc.so.3 
1 0xb032a464 in __free() from /usr/qnx650/target/qnx6/x86/lib/libc.so.3 
2 0xb0329f7d in free() from /usr/qnx650/target/qnx6/x86/lib/libc.so.3 

C.-À c'est seg-faulting en essayant de le libérer je suppose. Maintenant, selon le tutoriel here, tout ce que je devrait avoir à faire pour utiliser cette fonctionnalité est la suivante:

MatrixXf m = MatrixXf::Random(3,2); 
JacobiSVD<MatrixXf> svd(m, ComputeThinU | ComputeThinV); 

Quelqu'un peut-il voir pourquoi il ne parvient pas dans mon cas?

+0

Ceci est la totalité de la trace de la pile? Comment pouvez-vous être sûr que "la dernière ligne" provoque le SEGFAULT? Lorsque j'avais des applications qui se plantaient sans raison apparente, j'ai couru le code avec les outils valgrind ou eFence afin de déterminer les faiblesses ou les problèmes qui pourraient y être associés. – janr

+0

Quelle est la version Eigen? Assurez-vous de tester votre programme avec des assertions activées, c'est-à-dire sans -DNDEBUG ou les goûts. Et comme l'a dit Janr, la trace de la pile n'est clairement pas complète. – ggael

+0

Je pense que c'est la dernière ligne parce que si je le commente il va exécuter le programme à la fin. Aussi c'est le même bogue qui cause les problèmes [ici] (http://stackoverflow.com/questions/14190767/identify-variable-causing-memory-error) Donc je ne peux pas utiliser le mode valgrind ou debug. Aussi, si j'inclus le code du tutoriel en bas de la question dans le rogramme, alors il se sépare sur la ligne réelle 'JacobiSVD <...', donc je ne suis pas sûr de ce qui se passe. –

Répondre

1

Ok, donc c'est super fou. Il s'avère que j'utilisais Eigen Alignment qui ne fonctionne pas vraiment sur mon système d'exploitation. Cela a provoqué une erreur qui changerait l'emplacement simplement en fonction de la taille de l'exécutable qui a été produit.

La morale de l'histoire est de faire attention à vos inclusions.