2012-11-16 22 views
8

非常に奇妙な症状が現れます。同じコンパイラで同じプログラムコードが異なるバイナリにつながる

  1. コードは、次のバージョンで私のコンピュータ上でコンパイルされています。

    。 GCCバージョン:4.4.2

    b。 CMAKE verson:2.8.7

    c。 QNX(オペレーティングシステム)のバージョン:6.5.0

とコードは(単に機能の終了時に、任意のコード上で死んではない)、いくつかのメモリを解放し、関数から出ながら、セグメンテーションフォルトを持っています。これについて

奇妙なものがあります:

  1. コードがリリースモードではなく、デバッグモードでそれをしません。コードはスレッド化されているため、これは競合状態を示します。

    b。私は、デバッグモードでそれを入れてデバッグすることはできません。

  2. すべてのバージョンが同じであるワークメイトマシンでコンパイルされた場合のコードには、この問題はありません。

    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); 

は前にそれを何だった:

+2

メモリ問題のように聞こえる - デバッグモードでのvalgrindはまだ試してみる価値があります。メモリであるかどうかを判断するのに役立ちます。 – John3136

+2

"1.コードはリリースモードではありますが、デバッグモードでは動作しません。" - フットプリントの違いによるメモリ問題の珍しい症状ではありません –

+0

@ John3136残念ながら、残念ながらvalgrindは使用できません。サポートなし。関数をLinux(ubuntuまたはfedora)に取り込もうとすることはできますが、それは何年もかかるので、まず他のものを試してみたいです。 –

答えて

7

...同じである彼のマシン上でコンパイルから作成されたバイナリは、約6MB大きい

それは彼だけの場合だ場合でも(違いは何であるかを考え出す価値がありますあなたは、本当のバグを公開しながら)、皮革を構築:

  • をなど、あなたには、検索パスにまったく同じコード(なし非コミットローカルの変更、余分なヘッダをコンパイルしているダブルチェック)
    • cmakeのgcc引数に-Eスイッチを追加することによってトリプルチェックするので、通常のコンパイルと同じインクルードパスでファイルを前処理します。差分プリプロセッサ出力
  • nmまたはobjdumpかからの出力を比較するものは何でもあなたが2つのリンクの実行可能ファイルのために持っている:いくつかのシステムやサードパーティライブラリは1箱の異なるバージョンがある場合、それはここに表示されることがあり可能であればそれは、動的にリンクされている場合
  • lddからの出力を比較、
    • は、ライブラリのバージョンを比較し、彼らは両方とも同じライブラリのバージョンを取得していることを確認し、それは実際は、あまりにも、実行時に取得します。コードのよう

を、実行pldd/proc/pid/map.soエントリを比較し、strace/dtrace/trussの下でプロセスを実行し、実行時リンカーの活性を比較..:うまくいけば、のいずれかを実行することができます。

Eigen::VectorXd ModelSearcher::getMinimumBoundingBox(); 
// ... 
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つのベクトルになります。それらは両方ともfree/deleteです。

オペレータがまったく定義されていない場合、デフォルトではこのシャローコピーが行われることに注意してください。

+0

+1出力をチェック/差分する。 – Macke

+0

偉大な答えは、2番目の部分は、メモリエラーの問題について説明します。私は最初の部分を見て、私が見つけたものを見ます。 –

0

はあなたがから変更する必要が言いましたか?

それがあった場合:

void ModelSearcher::getMinimumBoundingBox(Eigen::MatrixXd input); 

とコピーコンストラクタ/代入演算子は、それが問題を引き起こした可能性が適切に実装されていませんでした。

どのように実装されているか確認してください。ここにはsome infoがあります。

+0

それは前に何があったのかという質問があります。これは問題ではありません。しかし、助けてくれてありがとう。 –

+0

する必要があります。あなたは3つのルールに従わなかった。 –

+0

@ LightnessRacesinOrbitいいえ、そうではありませんでした。 –

関連する問題