2012-10-14 13 views
6

Delphiでデバッグすると、例外が原因でコードの行が正しく表示されますが、ローカル変数にアクセスすることはできません。これはデバッガの制限ですか?それとも、私は何か簡単なものを逃していますか現時点では、すべてのローカル変数をフォルト前の行にあるグローバルにミラーリングし、プログラムを再コンパイルして同じ例外を繰り返すことができるようにする必要があります。例えばDelphiの例外はローカル変数を参照させません

MyArray[I]:=Foo(...); 

I場合、私は前の行でグローバルスコープのデバッグ変数にそれをミラーリングしない限り、私は、変数Iが何であるかを見ることができない(境界がオンになってチェックして)範囲外にあります。

または私は

MyInteger:=Trunc(MyFloat), 

MyFloat6.1E+17で持っている場合、私はそれの価値が何であるか見当がつかない。

+0

これはデバッガの既知の制限です。あなたができることはあまりありません。 –

+0

私はここに新しいです(最初の投稿)。私は "答えられた質問"を見つけることができないようですが、私は他の人が "質問に答えたことを覚えておいてください"と言いました。それ、どうやったら出来るの? –

+4

私がこの制限に遭遇したとき、私は明示的に例外の直前にローカル変数にアクセスできるように、問題を引き起こす行にブレークポイントを明示的に設定しました(問題が再現可能であると仮定します)。または、try ... exceptでローカルコードを囲みました。ブレークポイントを設定できるexceptブロックに行を挿入します。 – RobertFrank

答えて

7

コールスタックウィンドウで適切な行を選択すると、ローカル変数の値が表示されます。例外が発生する前は、通常は1〜2行です。

これが実装されている時点で正確なバージョンはありませんが、それは間違いなく新しいバージョンの1つです。

+2

私はD7ができないことを確認できますが、D2007はコールスタック内の適切な行をダブルクリックしたときに、ローカル変数ウィンドウの値を表示できます(ただし、ウォッチウィンドウではありません)。 –

+0

これはXE3で動作することを確認しました。スタックトレースに各プロシージャーまたは関数ごとに2つのスタックがあるのはなぜですか?しかし、2つのうちの1つが非常に不正確な結果を示しますが、もう1つは正しい結果を示します。私はまだ実際のデバッグを試みていませんが(ちょうど慎重な例外)、私は99%の時間を前提としています。どちらが正しいのかは明らかです。 –

1

私が知る限り、「問題」はコンパイラによって引き起こされます。コンパイラの最適化機能はガベージコレクタのように機能し、使用されなくなったときに関数内で宣言された変数を解放します。

この問題を解決するには、例外ハンドラを作成し、例外キャッチブロック内の変数を偽に使用します。

関連する問題