13

デバッガーでインスタンス変数のアドレスを表示する場合、指定されたメモリ アドレスを入力してクラスを取得するにはどうすればよいですか?

p someObjectInstanceデバッガーまたはコード内から反対のこと (インスタンスからアドレスを取得すること) が可能であることを知っていNSLog(@"%p", someObjectInstance);ます。これを逆に行う同様の方法はありますか?

4

4 に答える 4

24

あなたが求めているのは非常に安全ではありません。不明なメモリの場所にアクセスすることは一般的に悪い考えですが、あなたが尋ねたので:

編集:gdbまたは内の場合lldb、次のことができます:

po [(id)(0xDEADBEEF) class]

ただし、コードから実行する場合は、次を使用します。

NSString *input = @"0xFAFAFA";

unsigned address = UINT_MAX; // or UINT_MAX
[[NSScanner scannerWithString:input] scanHexInt:&address];

if (address == UINT_MAX)
{
    // couldn't parse input...
    NSLog(@"failed to parse input");
    return 0;
}

void *asRawPointer = (void *) (intptr_t) address;
id value = (__bridge id) asRawPointer;

// now do something with 'value'
NSLog(@"%@", [value class]);
于 2012-07-13T01:07:06.530 に答える
4

デバッガーpoでは、有効なObjective-Cオブジェクトであると思われるアドレスで使用できます。たとえば、私のプログラムの1つを実行する0x9549ee0と、UIFontオブジェクトを指していることがわかります。

使用するpoと、次のようになります。

(gdb) po 0x9549ee0
<UICFFont: 0x9549ee0> font-family: "Helvetica"; font-weight: normal; font-style: normal; font-size: 14px

これにより、以下を使用して取得したのと同じ情報が出力されます。

NSLog(@"%@", someObject);

つまり、の結果です[someObject description]。多くの場合、これにはクラス名だけではなく、より有用な情報が含まれています(上記の例からわかるように)。

リチャードJ.ロスIIIは、これを慎重に行う必要があると述べています。デバッガーは、アドレスが無効であるかどうかを判断できることがよくあります。次に例を示します。

(gdb) po 0x9449ee0
0x9449ee0 does not appear to point to a valid object.

しかし、これを行う方法は絶対確実ではありません。プログラムのコードでそれを行うと、クラッシュする可能性があります。

もちろんpo、変数を直接使用することもできます。

(gdb) po font
<UICFFont: 0x9549ee0> font-family: "Helvetica"; font-weight: normal; font-style: normal; font-size: 14px

お役に立てれば。

于 2012-07-13T01:24:21.343 に答える
1

デバッグ領域を右クリックし、[Debug Area Help] -> [Viewing Memory Locations] を選択します。

または、Xcode のドキュメントで次の場所に移動します。

Xcode Developer Library->Xcode->IDEs->Debug Area Help-> Viewing Memory Locations

于 2012-11-12T18:09:44.957 に答える