3

私はiOSシミュレーター内のlldbデバッガーにいて、ブロックのアドレスを持っています。実行してみたいです。最初に頭に浮かんだこと(以下を参照)を試しましたが、うまくいきませんでした。これを行う方法はありますか?

(lldb) po 0x2c7140
(int) $2 = 2912576 <__NSGlobalBlock__: 0x2c7140>
(lldb) po 0x2c7140(NO, @"Test")
error: called object type 'int' is not a function or function pointer

私も呼び出しを試みましたが、どうやらそれはllvmのコマンドではありませんか?それはgdbで利用可能でした。

(lldb) call (void)0x2c7140(NO, @"Test")
error: 'call' is not a valid command.

poはvoidの戻り値では機能しないため、最初の試行はとにかく失敗することに気づきましたが、問題はまだ残っています...

4

1 に答える 1

10

番号をブロック ポインターにキャストする必要があります。

expr ((void (^)(BOOL,NSString*))0x2c7140)(NO, @"Test")
       |        |    |          |        |
  Return type  Argument types  Address  Call

(exprは lldb の に代わるものですcall)

これが機能することを実際にテストしていませんが、lldb がキャストを認識することを確認しました。exprキャストを実行するコマンドと呼び出しを実行するコマンドの2 つのコマンドに分割する必要がある場合があります。

expr (void (^)(BOOL,NSString*))0x2c7140
expr $n(NO, @"Test")

where$nは最初の式の結果に与えられる識別子で、lldb の出力の一部になります。$「以前の結果」を意味するために単に使用できると思いますが、これはテストしていません。

于 2012-04-24T23:43:47.957 に答える