2011-01-19 5 views
0

私がやる:私はこれは私は、次の奇妙なデータを取得free_entire_storeの先頭にブレークポイントを置くgdbを場合ポインタを渡す:スタックに異なる値がありますか?

typedef struct { 
    Scene *scene; 
    MeshStore *store; 
    float angle; 
} DebugModel 

... 
free_entire_store(debug_model.store); 

/* Frees the store and any meshes related to it */ 
void free_entire_store(MeshStore *store) { 
    /* implementation not important for the problem at hand */ 
} 

は今..

(gdb) p debug_model 
$5 = {scene = 0x1044a680, store = 0x1044a630, angle = 87.8401108} 
(gdb) p store 
$6 = (MeshStore *) 0x10438b40 

debug_modelは、グローバル、上記のデバッグ出力であります彼がプログラムと同じポイントintからです。

私は単純にパラメータとしてポインタを渡しても、何とか変更されます。スタックは壊れていますが、非常に予測可能です(実行ごとに同じデータが表示されます)。これが原因でしたか?私はこの関数を呼び出す前にanythignを何回か解放したとは思わない。パラメータとして渡された値は、スタックの値とどのように対応していませんか?

+4

valgrindで実行してください。 – EmeryBerger

+4

文脈がなければ、言うことは不可能です。問題を引き続き表示するために必要な最小限のコードを削減してください。 –

+0

私はスタックの破損がこれを引き起こす可能性があるのだろうかと思います。私がgdbから知ることができるのは、スタックされた値intがパラメータとして渡された値ではないということだけです。ヴァルグリンドはそれ以上のことを教えてくれるだろうか? – buddhabrot

答えて

0

ブレークポイントを正しく配置してもよろしいですか? ストアがまだ割り当てられていない可能性があります(特に、最適化を使用してコンパイルした場合)。 メソッドの最初の行の後に改行を入れて、既に割り当てられていることを確認してください。

+0

はい私は関数を入力するときにそれを置いた。 – buddhabrot

+0

すべての最適化を無効にしてコンパイルしました。エラーを見つけることができました。最適化によって-O0でコンパイルしたときに消えた異常な「破損したスタック」という現象が発生しました。 – buddhabrot

+1

gdbでデバッグ最適化されたCコードをデバッグできません、gdbはすべて混乱します。 – nos

0

これは、関数内でポインタをコピーしてローカルに変更できるためだと思います。どちらも同じことを指すはずです。

関数内と外部でまったく同じポインタを使用する場合は、ポインタへのポインタを渡す必要があります。

typedef struct { 
    Scene *scene; 
    MeshStore *store; 
    float angle; 
} DebugModel 

... 
free_entire_store(&(debug_model.store)); 

/* Frees the store and any meshes related to it */ 
void free_entire_store(MeshStore **store) { 
    MeshStore *originalStore = *store; 
    /* implementation not important for the problem at hand */ 
} 
+0

すでにこれを試してみましたが、同じ結果が得られました(ダブルポインタも&(debug_model.store)の場合とはスタックが異なります)。ポインタ値が変更された理由はありませんか? – buddhabrot

+0

私はポインタへのポインタが違うと思いますが、 'MeshStore * originalStore = * store;'のようなローカル変数を 'free_entire_store'メソッドの中に作ると、その値は' debug_model.store ' – Argote