1

EXC_BAD_ACCESS から回復するにはどうすればよいですか? 、から回復する方法を見つけましたEXC_BAD_ACCESSが、アクセスの悪いポインターがグローバルに格納されていました。明らかに、これはスケーリングしません。iOS シミュレータ (i386) でコードを実行すると、関数内でデバッガfaultvaddrのセクションにレジスタが表示されます。ただし、その値は から返されたポインターと同じではないか、近くありません。この値を動的に取得する方法はありますか?Exception State Registerscatch_exception_raisevm_allocate

以下の関数が与えられたcatch_exception_raise場合、原因となったアドレスをどのように発見しますEXC_BAD_ACCESSか?

kern_return_t
catch_exception_raise(mach_port_t exception_port,
                      mach_port_t thread,
                      mach_port_t task,
                      exception_type_t exception,
                      exception_data_t code_vector,
                      mach_msg_type_number_t code_count)
{
    fprintf(stderr, "catch_exception_raise %d\n", exception);
    return KERN_SUCCESS;
}
4

1 に答える 1

2

これについては、OS X and iOS Internals book ( http://www.newosxbook.com ) に詳細が記載されています。本のリスト 11-21 (同書) は、実際にそのためのサンプル コードを示しています。簡単に言えば、次の 2 つのオプションがあります。

A) 例外データから例外自体を調べます。状態を arm_thread_state に変換します。次のようにします。

struct arm_thread_state *atsh = &exc.old_state;
printf ("CPSR is %p, PC is %p, etc.\n", atsh->cpsr, atsh->pc);

または

B)thread_get_stateをスレッドポートに呼び出し(引数#2としてそこにあるため)、pc(命令ポインター)またはその他のレジスターのいずれかを取得します

編集

A) を機能させる方法はわかりませんが、32 ビット iOS シミュレーターで B) の場合、次のように機能します (ここにあります)。arm register に相当するものがわからないので、 arm を__faultvaddr試す前にそれを理解する必要があります。

// types from thread_status.h
x86_exception_state32_t x86_exception_state32; 
mach_msg_type_number_t sc = x86_EXCEPTION_STATE32_COUNT;

thread_get_state(thread,
                 x86_EXCEPTION_STATE32,
                 (thread_state_t)&x86_exception_state32,
                 &sc);
于 2013-10-18T12:22:42.447 に答える