33

でデバッグしたいiPhoneアプリのメモリの問題がありMallocStackLoggingます。エラーにはジャイロスコープが関係しているため、シミュレータではなくデバイスでデバッグする必要があります。

環境変数を設定するMallocStackLoggingと、iPhoneはマロックスタックログを適切に記録します。

MyApp(1856) malloc: recording malloc stacks to disk using standard recorder
MyApp(1856) malloc: stack logs being written into /private/var/mobile/Applications/1FD1F8D2-5D30-4AA7-B426-C52FE20266DE/tmp/stack-logs.1856.MyApp.index
MyApp(1856) malloc: Please issue: cp /private/var/mobile/Applications/1FD1F8D2-5D30-4AA7- B426-C52FE20266DE/tmp/stack-logs.1856.MyApp.e8z3IL.link /tmp/

では、どうすれば彼らと協力できますか?

XcodeOrganizerを使用してそれらをMacに転送できます。しかし、これら2つのファイルをどうすればよいでしょうか。

  • stack-logs.1856.MyApp.index
  • stack-logs.1856.MyApp.e8z3IL.link

Macの/tmpにあるファイルを移動してみて、次のように呼び出しました。

$ malloc_history 1856 -all_events
malloc_history cannot examine process 1856 because the process does not exist.

明らかに、このmalloc_historyコマンドはローカルマシンで実行中のプロセスを探します。ログファイルを手動で指定するオプションがありません。

(ジェイルブレイクされていない)デバイスでXcodeを直接操作するか、ログをMacに転送した後に、これを機能させる方法はありますか?

4

3 に答える 3

5

これがideviceでmallocスタック履歴を使用してAPPをデバッグする方法です。これは非常に複雑ですが、プールメモリの自動解放の問題に対処する他の方法はありません。

  1. 開発者ツールがインストールされたジェイルブレイクideviceが必要で、gdbがあります。

  2. mallocスタックlogginを有効にするには、環境変数MallocStackLoggingNoCompactとMallocStackLoggingを設定する必要があります。これを行うには、いくつかのトリックが必要です。

まず、アプリにroot権限を付与する必要があります。

 mv -f /User/Application/xxxxxxxxxxxxx/YOUR_APP.app /Application/YOUR_APP.app
 cd /Application
 chown -R root:wheel YOUR_APP.app
 chmod 4755 YOUR_APP.app/YOUR_APP

プログラムの名前を変更します

mv YOUR_APP.app/YOUR_APP   YOUR_APP.app/BACK_UP_NAME

短いシェルスクリプトを使用してプログラムを開始し、環境を維持できるようにします。YOUR_APP.app/YOUR_APPに保存します

#!/bin/bash
export MallocStackLogging=1
export MallocStackLoggingNoCompact=1

exec /Applications/YOUR_APP.app/BACK_UP_NAME

終わり。

アプリを起動するか、アイコンをタッチするか、openコマンドを使用するだけで、/tmpディレクトリにスタックログファイルが表示されます。

ps aux | grep YOUR_APPプロセスIDの検索を使用gdb -p PROCESS_IDし、進行状況にアタッチし、ブレークポイントを作成し、試行するとinfo malloc ADDRESS、malloc履歴が表示されます。

于 2014-03-05T11:39:49.020 に答える
2

シミュレーターまたはデバイスで実行されているアプリを診断できるInstrumentsアプリケーションでは、Allocationsインスツルメントはメモリアドレスと割り当て履歴を記録します。オブジェクト/割り当てタイプまたは特定のメモリアドレスで参照できます。これは、あなたが望むことを達成するための最も簡単な方法である可能性があります。

デバイスでmalloc_historyを実行するには、デバイスへのssh接続を有効にするためにジェイルブレイクするか、コード内からmalloc_historyを実行する必要があります。しかし、malloc_historyがiOSデバイスに存在するかどうかはわかりません。また、malloc_historyのヘルプテキストには、すでに知っている可能性のある既存のプロセスではなく、ログファイルを操作するためのオプションについては記載されていません。

于 2013-09-16T18:56:01.557 に答える
-5

派手に聞こえるつもりはありませんが、デバイスを接続して、接続中にデバッガーで実行してみましたか?

デバイス上でアプリケーションを実行している間、広範囲にわたるデバッグを行います。デバッガーでアプリケーションを起動する必要があります。

于 2011-03-14T09:44:24.483 に答える