1

iOS アプリのヒープ使用量を測定するために割り当てインストゥルメントを使用しています。タグ名「Memory Tag 70」の領域に大量のメモリが割り当てられていることがわかりました。追跡できるように、その責任者を知りたいです。

  • この記憶について何かしようとすることが適切かどうか
  • もしそうなら、私はそれについて何をすべきか (つまり、どのコードがその領域にオブジェクトを割り当てているか)。

OSMalloc_tagAlloc()では、特定の引数を持つ への呼び出しがどこから来ているのかを追跡できますか? デバイス上ではなく、シミュレーターで実行している場合にのみ実行できる可能性があることを受け入れます。しかし、それが事実である場合、どうすればよいでしょうか。タグ名を表示できますか?dtraceもしそうなら、シミュレーターでアプリを起動できdtrace -cますか? どのように?

4

2 に答える 2

0

計測器では​​、ウィンドウの上部と下部の間の仕切りにあるポップアップを選択することで、さまざまな表示を切り替えることができます。「割り当て」については、「呼び出しツリー」を表示するように切り替えることができます(デフォルトでは「統計」に設定されていると思います)。

これにより、すべての割り当てのコール スタックが得られます。ただし、カーネルからユーザー空間までずっとトレースできるかどうかはわかりません。

于 2011-01-06T00:45:31.970 に答える
0

私にとって、このタグは割り当てた大きな UIImages に関連していました。私は、これについてより多くの情報を入手する方法と、(おそらく) 役に立つことを提案する方法について調査を行いました。

あなたが興味を持っているタグは、OSMalloc_tagAlloc() ではなく、vm_allocate などの flags 引数を介して渡されたものだと思います。iOS 3.1 のリリース ノートには、VM 計測器に関連する <mach/vm_statistics.h> および <mach/vm_map.h> ヘッダーが記載されています。

タグは、vm_statistics.h の VM_FLAGS_ALIAS_MASK および次の #defines に従って、vm_allocate フラグ パラメータを介して渡されると思います。(ここでは「エイリアス」と呼びます。)これは、たとえば vm_allocate をプローブし、フラグ パラメータからタグを抽出する dtrace スクリプトを作成できることを意味します。例えば:

sudo dtrace -n 'fbt:mach_kernel:vm_allocate:entry /pid==12345/ { printf("%d", (arg3 & 0xFF000000) >> 24); }'

Instruments を使用して dtrace インストゥルメントを作成し、[Instrument] メニューの [Build New Instrument...] を介して iOS シミュレーターに対して実行するか、コマンドライン dtrace スクリプトを使用して /pid == 123456 を含めることができます。 / 実行中のアプリの述語。

残念ながら、これらの割り当てを見つけるための正しいプローブを見つけることができませんでした。適切な argN 変数を調べると、フラグのタグ/エイリアス部分が常に 0 になっているように見えます。たとえば、上記の fbt:mach_kernel:vm_allocate、fbt:mach_kernel:mach_vm_allocate、fbt:mach_kernel:vm_map_enter などを試しました。カーネルのメモリ割り当てシステムについてはよくわかりません。

そのため、これらのタグがどこでカーネルに渡されているのか正確にはわかりませんが、これが追跡に役立つことを願っています.

于 2011-01-11T14:02:27.993 に答える