0

実行可能ファイルをデバッグする必要があります。ソース ファイルの 1653 行目にブレークポイントを設定しました。1653 行から 1658 行にはいくつかの宣言が含まれています。今、私はプログラムの実行を開始しました。中断は 1653 行目では発生していません。代わりに 1659 行目で発生しています。理由と解決方法を教えてください。

前もって感謝します.....

4

2 に答える 2

2

あなたのコードはおそらくデバッグ用にビルドされていません。最適化をオンにしてコンパイルすると、ソース コードの行が生成されたコードのどこにも対応しなくなる可能性があります。

最適化せずに、できるだけ多くのデバッグ情報を有効にしてビルドしてください。これを行う方法は、コンパイラによって異なります。

実行可能ファイルを再コンパイルできない場合は、持っているものを使用する必要があります。

于 2012-11-16T13:43:07.270 に答える
1

アンワインドが示唆するように、これはプログラムが最適化されてビルドされたことが原因である可能性がありますが、最適化されていないビルドでも発生する可能性があります。コンパイラは、デバッグ情報に行テーブルを含めます。行テーブルは、コードが生成されたソース行をデバッガに伝えます。例えば、

15 puts ("This probably resulted in some code being generated.");
16 
17 const int arrsize = 32;  // code generated?  Maybe, maybe not at -O0.
18 char buf[arrsize];       // code generated?  Unlikely.
19
20 // Now we'll start our real work...
21 
22 puts ("This probably resulted in some code being generated.");

15 行目または 22 行目のブレークポイントは、おそらく期待どおりの動作をします。しかし、16 行目から 21 行目まではコードが生成されない可能性があり、デバッガーに関する限り、これらの行は存在しません。18 行目にブレークポイントを設定すると、デバッガーは 18 行目以降にコードが生成されている次のソース行を探し、そこにブレークポイントを設定します。

unwindが言うように、この問題は、コンパイラによって最適化が行われるとすぐに劇的に悪化します。これは、ソース行が予期しない方法で再配置されたり、完全に省略されたりする可能性があるためです (そのように見えるソース行であっても、確実にコードが生成される可能性があります) 。.)。最適化されたコードをデバッグする最良の方法は、ソースとアセンブリを混在させて表示し、プログラムの IMO をステップ実行する際に理解できるアセンブリ言語を十分に理解することです。

于 2012-11-16T21:09:42.517 に答える