10

私は長年 Microsoft の開発者であり、Xcode を使用した iPhone 開発は初めてです。そこで、Objective-C を使用して iPhone アプリケーションを作成する方法を独学で学ぼうと、本を読んだり、例を調べたりしています。これまでのところすべて問題ありませんが、objc_exception_throw実行時に一般的な ' ' メッセージが表示されることがあります。これが発生した場合、この例外の原因を見つけるのは非常に困難です。いくつかの試行錯誤の後、私は自分の答えを見つけました。パラメーターの 1 つにスペルミスがありました。

以下に示すように、ボタンの 2 番目の「t」を省略して、「otherButtonTitles」パラメーターのスペルを間違えました。

UIAlertView *alert = [[UIAlertView alloc] 
                      initWithTitle:@"Date and Time Selected" 
                      message:message 
                      delegate:nil
                      cancelButtonTitle:@"Cancel"
                      otherButonTitles:nil];

これを見つけるのに時間がかかった理由は、コードが正常にビルドされたためです。これは、Objective-C コンパイラの通常の動作ですか? このような一般的な構文エラーを作成すると、.NET コンパイラでビルドが失敗することに慣れています。これらの間違いを犯したときにビルドを失敗させるために変更できるコンパイラ設定はありますか?

4

5 に答える 5

25

まず第一に、~/.gdbinit(それはあなたのホームディレクトリで呼び出されるファイルです.gdbinit-はい、ドットで始まります)そしてそれにこれを入れてください:

fb -[NSException raise]
fb objc_exception_throw
fb malloc_error_break

これにより、GDBが3つのデフォルトのブレークポイントで初期化されます。ブレークポイントが発生すると、GDBはアプリケーションを停止し、スタックトレースを表示します。これはXcodeと非常によく統合されているため、どこかで例外が発生したり、mallocが失敗したりするとすぐに、スタックトレース要素をクリックしてコードをうまくウォークスルーできます。

次に、プロジェクトのパネルを開きGet Info(またはプロジェクトを選択して(の一番上の項目Groups & Files)を押してcmd-i)、Buildタブに移動してプロジェクトのBase SDKをに設定しますDevice - iPhone OS [someversion]。一番下までスクロールして、GCC 4.0 - Warningsセクションを見つけます。三; 快適に感じる数の警告をオンにしますが、必ずオンにしてくださいTreat Warnings as Errors(これはと同等ですGCC_TREAT_WARNINGS_AS_ERRORS)。個人的に、私はそれをこれに設定しています:

GCC警告ビルド設定
(ソース:lyndir.com

これで、コードで間違って実行できるほとんどのことについてコンパイラの警告が表示されるはずです。コンパイラは、修正するまでコードを実行できません。物事がコンパイラーの鼻を通り過ぎたとき、GDBが便利な場所で壊れることで問題を簡単に見つけることができるはずです。

また、を調べる必要がありますNSZombie*。これらは環境変数であり、メモリの割り当てやアクセスの状況が悪い場合に早期に中断するのに非常に便利です。例えば; 本当にNSZombieEnabledリリースされるものはありません。Deallocでは上書きされ_NSZombie、この割り当て解除されたメモリに再度アクセスしようとすると(割り当て解除されたポインタを逆参照)、GDBで何かが中断されます。通常のように呼び出しが行われるのではなく、ランダムなデータに対してのみ発行されます。 (もちろん、これはあなたが望んでいたものではありません)。詳細については、を参照してください。http://www.cocoadev.com/index.pl?NSZombieEnabled

于 2009-04-03T05:38:30.013 に答える
9

常に-WerrorGCC 設定を使用します ( GCC_TREAT_WARNINGS_AS_ERRORS = YES)。コードに警告を含めるべきではありません。これは、警告が重大なエラーである例です。

また、 が表示された場合はobjc_exception_throw、コンソールに切り替えて (Command-Shift-R)、最初の「小さい」番号のアドレスを探します。

2009-04-01 13:25:43.385 CrashExample[41720:20b] Stack: (
    2528013804,
    2478503148,
    2528036920,
    2528053460,
    2358032430,
    11076,
    11880,
    816174880,
    345098340,
    145973440,
    816174880,
)

この場合は「11076」になります。コンソールに次のように入力します。

info line *11076

これにより、例外がスローされたコード内の行がわかります。

于 2009-04-02T23:30:00.927 に答える