コードに問題があり、非常に奇妙な症状が見られます。
コードは、次のバージョンのコンピューターでコンパイルされています。
を。GCC バージョン: 4.4.2
b. CMAKE バージョン: 2.8.7
c. QNX (オペレーティング システム) バージョン: 6.5.0
また、一部のメモリを解放して関数を終了する際に、コードにセグメンテーション違反があります (どのコードでも終了せず、関数を終了するだけです)。
これについての奇妙な点は次のとおりです。
コードはリリース モードで実行しますが、デバッグ モードでは実行しません。
を。コードはスレッド化されているため、これは競合状態を示しています。
b. デバッグモードにしてデバッグできません。
すべてが同じバージョンの Workmates マシンでコンパイルされたコードには、この問題はありません。
を。これに関する奇妙な点は、同僚のコードが機能することですが、彼のマシンでコンパイルして作成されたバイナリは同じで、約 6mB 大きいことです。
迷惑なことに、コードが大きすぎて仕事にも使えないため、コードを投稿できません。しかし、誰でもこれを修正するための道筋を教えてもらえますか?
QNX を使用しているため、デバッグ ツールが限られているため、Valgrind を使用できません。Valgrind は QNX でサポートされていないため、GDB はあまり役に立ちません。
似たような/同じ問題を抱えていて、その原因と解決方法を知っている人を探しています。
編集:
すっごく... 原因は分かったけど、どうやって起こったのかまだ少し混乱している。
犯人コードはこれでした:
Eigen::VectorXd msBb = data.modelSearcher->getMinimumBoundingBox();
の定義getMinimumBoundingBox
は次のとおりです。
Eigen::VectorXd ModelSearcher::getMinimumBoundingBox();
そして、常に として初期化される VectorXd を返しますVectorXd output(6, 1)
。だから私はすぐに、VectorXdが初期化されていないが、これに変更されているためだと思いました:
Eigen::VectorXd msBb(6, 1); msBb = data.modelSearcher->getMinimumBoundingBox();
しかし、これはうまくいきませんでした。実際、関数の定義を次のように変更して修正する必要がありました。
void ModelSearcher::getMinimumBoundingBox(Eigen::MatrixXd& input);
そしてこれへの呼び出し
Eigen::VectorXd msBb(6, 1); data.modelSearcher->getMinimumBoundingBox(msBb);
だから今、新しい質問:
なんてこったい?最初の変更が機能しなかったのに、2 番目の変更が機能したのはなぜですか? なぜ参照渡しをしなければならないのですか? ああ、大きな問題です。同僚がコンパイルして実行したとき、どうしてこれが壊れなかったのですか? それは単純なメモリエラーです。特に、コンパイラと他のすべての重要なものが同じであるため、コンパイルするコンピューターに依存するべきではありません!!??
助けてくれてありがとう。