2012-10-23 13 views
23

はコードの私の二行です:lldbエラー:ここでは変数は使用できません

NSString *frontFilePath = [[NSBundle mainBundle] pathForResource:[self.bookendFileNames objectAtIndex:self.randomIndex] ofType:@"caf"]; 
NSLog(@"frontFilePath = %@", frontFilePath); 

私は2番目の行にブレークポイントを置いて、そこに、私はそれを印刷しようとすると:

(lldb) po frontFilePath 

しかし、私は次のエラーが表示されます:

error: variable not available 

私はNSLogステートメントをステップオーバーすると、変数は確かにコンソールに印刷しますe。

時にはから最初の行をデバッグしようとしていますが、それはNULLを返します。なぜなら、今のところ、なぜか分かりません。

+14

これは、Xcodeをますます使いやすく、使いやすくするアップルの努力の一部に過ぎないと思います。 – Suboptimus

答えて

40

これは、最適化されたコードのデバッグの成果物です。ビルド設定でコンパイラの最適化が有効になっているときは、メモリとレジスタ間の変数を最適なものとして移動します。 lldbの変数を調べている時点では、レジスタやメモリには表示されないように見えますが、レジスタやメモリには存在しない可能性があります。

コンパイラが出力するデバッグ情報の欠点である可能性があります。コンパイラは変数をレジスタにコピーして使用することがあり、デバッグ情報のレジスタ位置のみをリストすることがあります。その後、レジスタは他の用途のために再利用されます。値はまだスタックに存在しますが、コンパイラは値がそこにあることをデバッガに知らせていません。

本当にそれが不十分なデバッグ情報ですまたは値が本当にその特定の命令で存在しない場合は、手動でアセンブリコードを調べることです。かどうかを伝えるための唯一の方法コンパイラを使用して最適化をオンにすると、ソースコードは特定の順序で実際に実行されているものの弱いビューになります。

最適化されたコードデバッグの厄介な世界に迷うのではなく、できるだけビルドとデバッグの最適化(ビルド設定の最適化レベル)をオフにすることを強くお勧めします。最適化を使ってアプリケーションをデバッグする必要がある場合は、Xcodeでサポートされている最新のApple LLVMコンパイラを使用してビルドしていることを確認してください - 最適化されたコードのデバッグを改善するための作業が常にあります。これまでのツールを使用することができます。

+1

ちょうど明白である - 私は私の答えの細部に分かれている - lldbが言っていることは、この特定の指導ポイントでは、あなたの変数の価値を見つける方法を知らないということです。変数はその時点では利用できないかもしれませんし、コンパイラのデバッグ情報は説明が不十分であるかもしれませんが、lldbが何をしなければならないのかは分かりません。 –

+1

「デバッグ」カテゴリでは、ビルド設定>最適化レベルが「なし」に設定されていました。 「リリース」カテゴリでは「最速、最小」に設定されています。私は「デバッグ」していて「リリース」していないと思っていますが、どのように伝えるべきか分かりません。 –

+2

デバッグの代わりにリリースモードでこの問題に遭遇しましたが、この回答のおかげで、私はそれをより素早く見つけ出して元に戻すことができました:) – Luke

関連する問題