3

iPadアプリからクラッシュをデバッグしようとすると、LLDBがあまり役に立たないと判断し、変数(スタックまたはクラスメンバー)の出力が機能しないことがあります(非常に頻繁に意味します)。

左側のデバッグウィンドウで変数を右クリック(またはCTRL +クリック)してから[説明の印刷]を実行すると、次のようなエラーメッセージが表示されます。

Printing description of error:
(NSURLError *) error = <register sp is not available>

また

Printing description of error:
(NSURLError *) error = <register ebp is not available>

自分でデバッグコンソールを使用しようとすると、次のようになります。

(lldb) po error
(NSError *) $3 = 0x2124fc10 [no Objective-C description available]

その後、右クリックで動作が開始され、次のようになります。

Printing description of error:
(NSURLError *) error = 0x2124fc10

しかし、私が得るのはメモリアドレスだけであり、それを呼び出すことができないdescriptionようです。メッセージを送信しようとすると、次のようになりdescriptionます。

(lldb) po [error description]
error: Execution was interrupted.
The process has been returned to the state before execution.

したがって、これも役に立ちません。デバッガーを再び使用可能にするために何ができるでしょうか?私は必死にクラッシュをキャッチする必要がありますが、それを引き起こすことができるたびに上記が発生し、エラーのコアに到達する方法がわかりません。

「registernotavailablelldb」をグーグルで検索しましたが、何も見つかりませんでした。いくつかのペーストビンログだけで、回答がありません。

参考:Xcode 4.5.2、iOS SDK 6.0を使用して、「デバッグ」プロファイルをコンパイルします。最適化はオンになりません。LLDBデバッガー、iOS展開ターゲット5.0は、シミュレーターまたはデバイス(iPad 1および3、iPhone 4S、iPhone)でのデバッグ時に発生します。 3GS)、デバッグされたアプリはGCDを非常に広範囲に使用しています。

4

1 に答える 1

9

Xcode 4.5.xのlldbで、i386の揮発性レジスタリストでバグが発生しています。

レジスタは、揮発性と不揮発性(または呼び出し先保存)の2つのクラスに分類されます。関数が別の関数を呼び出すと、すべての「揮発性」レジスタの内容が上書きされる可能性があります。不揮発性/呼び出し先に保存されたすべてのレジスタは、再利用される前に呼び出された関数(呼び出し先関数)によって保持され、戻る前に以前の値が復元されます。

デバッグ情報には、変数が揮発性レジスタに格納されていると表示される場合があります。その関数がスタックの真ん中にあり、その変数を調べたい場合、デバッガーはそのレジスターの値を再構築できません-それは失われます。gdbは、単純に揮発性レジスタの値をスタックの中央までコピーし、変数を(潜在的に)偽の値で出力するため、開発者は非常に混乱します。

lldbは、揮発性レジスタと不揮発性レジスタの違いを認識しており、そのようなスタックの途中で揮発性レジスタを再利用することはできません。代わりに、レジスタ値が使用できないと表示されます。

残念ながら、この場合、lldbは、使用可能な変数を再構築できないと主張しています。それらは、不揮発性である必要があるときに揮発性として誤って分類されます。多くのアセンブリ言語検査を行わなければ、これを回避するのは簡単ではありません。ここでの唯一の解決策は、その関数に戻るまで(つまり、フレーム0になるまで)実行を再開することです。そうすると、すべてのレジスタ値が使用可能として正しくマークされます。

これは、2013年9月にリリースされたXcode5で修正されています。

于 2012-12-04T22:16:50.060 に答える