非常に奇妙な症状が現れます。同じコンパイラで同じプログラムコードが異なるバイナリにつながる
コードは、次のバージョンで私のコンピュータ上でコンパイルされています。
。 GCCバージョン:4.4.2
b。 CMAKE verson:2.8.7
c。 QNX(オペレーティングシステム)のバージョン:6.5.0
とコードは(単に機能の終了時に、任意のコード上で死んではない)、いくつかのメモリを解放し、関数から出ながら、セグメンテーションフォルトを持っています。これについて
奇妙なものがあります:
:
コードがリリースモードではなく、デバッグモードでそれをしません。コードはスレッド化されているため、これは競合状態を示します。
b。私は、デバッグモードでそれを入れてデバッグすることはできません。
すべてのバージョンが同じであるワークメイトマシンでコンパイルされた場合のコードには、この問題はありません。
a。これについての厄介なことは、ワークメイトのコードが動作するだけでなく、彼のマシン上でコンパイルされて作成された同じバイナリが約6mB大きいことです。それはあまりにも大きくても仕事のためであるので
は今、うるさく、私はコードを投稿することはできません。しかし、誰もがこれを修正する道に沿って私を指すことができます。私はQNXを使用しておりますので、私は私のデバッグツールのための限られています
、私はValgrindのを使用することはできません、それはQNXではサポートされていないため、GDBは本当に助けにはなりません。
私は、同様の/同じ問題を抱えていた人、原因が何であったか、どのように修正したのかを探しています。
EDIT:
すっごく...私はそれが何であったかが分かったが、それが起こったのかについてのイムは、まだ少し混乱。 getMinimumBoundingBox
の定義が本である場合
Eigen::VectorXd msBb = data.modelSearcher->getMinimumBoundingBox();
:
Eigen::VectorXd ModelSearcher::getMinimumBoundingBox();
、それは常にVectorXd output(6, 1)
として初期化されるVectorXdを返し
原因コードは、このありました。だから私はすぐにVectorXdが初期化されていないので、右のそれがでなければならない、と思ったが、これに変更する:
Eigen::VectorXd msBb(6, 1); msBb = data.modelSearcher->getMinimumBoundingBox();
しかし、これは動作しませんでした。だから今この
Eigen::VectorXd msBb(6, 1); data.modelSearcher->getMinimumBoundingBox(msBb);
に新しい質問
void ModelSearcher::getMinimumBoundingBox(Eigen::MatrixXd& input);
とコール:
何実際、私はこれに関数の定義を変更することにより、それを修正する必要がありました地獄?なぜ最初の変更作業はしませんでしたが、2番目の変更は、なぜ私は参照渡しする必要がありますか?ああ、大きな疑問は、私の同僚がそれを集めて走ったときにどうしてこのことが壊れていないのですか?それはまっすぐなメモリエラーです、確かにそれはどのコンピュータがそれをコンパイルするかに依存すべきではありません、特にコンパイラと他のすべての重要な事柄は同じです!!
あなたの助けを借りてくれてありがとう。
void ModelSearcher::getMinimumBoundingBox(Eigen::MatrixXd& input);
は前にそれを何だった:
メモリ問題のように聞こえる - デバッグモードでのvalgrindはまだ試してみる価値があります。メモリであるかどうかを判断するのに役立ちます。 – John3136
"1.コードはリリースモードではありますが、デバッグモードでは動作しません。" - フットプリントの違いによるメモリ問題の珍しい症状ではありません –
@ John3136残念ながら、残念ながらvalgrindは使用できません。サポートなし。関数をLinux(ubuntuまたはfedora)に取り込もうとすることはできますが、それは何年もかかるので、まず他のものを試してみたいです。 –