0

NSClassFromStringのように、実行時にグローバル変数を見つける方法があるかどうか知りたいです。変数BOOLは静的ライブラリで定義されており、「nm」を使用して名前を見つけました。これにより、「0001924db_gStartSessionCalled」という出力が得られました。XCodeでデバッグする場合、式「gStartSessionCalled」を追加して、アプリの実行中に値が変化することを確認できます。

私がやりたいのは、gStartSessionCalledの値を見つけて、値を変更することです。これを行うのはちょっと変だと思いますが、その理由は無視してください。

4

2 に答える 2

1

グローバル変数はObjective-C固有の構成ではありません。これはプレーンCであり、次のように宣言することで、名前を知っているときにすべてのグローバル変数にアクセスできます。

extern <type> <name>;

例えばあなたの場合

extern BOOL gStartSessionCalled;
…
gStartSessionCalled = YES;

アップデート:

コンパイル時に変数の名前がわからない場合でも、実行時に。などを使用してシンボルアドレスを見つけることができますdlsym。MacOSでもLinuxでも同じかどうかはわかりませんが、似たようなものがあるでしょう。

于 2012-10-02T11:40:46.720 に答える
1

nm出力の小文字「b」

0001924d b _gStartSessionCalled

gStartSessionCalledがローカル(非外部)シンボルであることを示します。たとえば、次のように定義できます。

static BOOL gStartSessionCalled;

あなたの図書館で。私の知る限り、ローカルシンボルが定義されているオブジェクトファイルの外部からローカルシンボルにアクセスすることはできません。

デバッガーはシンボルテーブルを使用してアドレスを検索し、変数を表示できますが、リンカは別のオブジェクトファイルのローカルシンボルとのリンクを拒否します。

于 2012-10-02T12:11:16.700 に答える