Pertanyaan Bagaimana cara menggunakan MallocStackLogging di perangkat?


Saya memiliki masalah memori di aplikasi iPhone yang ingin saya debug MallocStackLogging. Kesalahan melibatkan giroskop jadi saya harus melakukan debug pada perangkat bukan simulator.

Saya telah mengatur MallocStackLogging variabel lingkungan dan iPhone mencatat log stack mallock dengan benar:

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/

Sekarang bagaimana saya bisa bekerja dengan mereka?

Saya dapat mentransfernya ke Mac menggunakan Xcode Organizer. Tapi apa yang harus saya lakukan dengan dua file ini?

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

Saya mencoba memindahkan file di / tmp pada Mac dan memanggil:

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

Jelas, itu malloc_history perintah mencari proses yang berjalan pada mesin lokal. Saya tidak memiliki opsi untuk menentukan file log secara manual.

Apakah ada cara untuk membuatnya bekerja baik secara langsung bekerja dengan Xcode pada perangkat (non-jailbroken) atau setelah mentransfer log ke Mac?


32
2018-03-02 12:38


asal


Jawaban:


Berikut adalah cara saya men-debug APP dengan sejarah tumpukan malloc pada idevice, itu benar-benar rumit, tapi saya tidak punya cara lain untuk menangani masalah memori pool release otomatis.

  1. Anda membutuhkan Jailbreak Idevice dengan alat pengembang terinstal, maka Anda memiliki gdb.

  2. Untuk mengaktifkan malloc stack loggin, Anda perlu mengatur variabel lingkungan MallocStackLoggingNoCompact dan MallocStackLogging, kami memerlukan beberapa trik untuk melakukannya.

Pertama, kami perlu memberikan hak istimewa root aplikasi Anda.

 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

Ubah nama program Anda

mv YOUR_APP.app/YOUR_APP   YOUR_APP.app/BACK_UP_NAME

Gunakan scrip shell pendek untuk memulai program Anda, jadi kita bisa menjaga env. Simpan ke YOUR_APP.app/YOUR_APP

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

exec /Applications/YOUR_APP.app/BACK_UP_NAME

Selesai

Cukup mulai aplikasi Anda, menyentuh ikon atau menggunakan perintah terbuka, Anda akan melihat file log tumpukan di / tmp direktori.

Menggunakan ps aux | grep YOUR_APP temukan id proses, gdb -p PROCESS_ID melampirkan ke kemajuan, membuat breakpoint, coba info malloc ADDRESS, sejarah malloc akan muncul.


4
2018-03-05 11:39



Dalam aplikasi Instrumen, yang dapat mendiagnosis aplikasi yang berjalan di simulator atau di perangkat, instrumen Alokasi merekam alamat memori dan riwayat alokasi. Anda dapat menelusuri berdasarkan jenis objek / alokasi atau alamat memori tertentu. Ini mungkin cara paling mudah untuk mencapai apa yang Anda inginkan.

Menjalankan malloc_history di perangkat akan membutuhkan jailbreaking untuk mengaktifkan koneksi ssh ke perangkat, atau menjalankan malloc_history dari dalam kode Anda. Tapi saya tidak yakin apakah malloc_history ada di perangkat iOS. Dan teks bantuan malloc_history tidak menyebutkan opsi untuk beroperasi di file log daripada proses yang sudah ada, yang mungkin sudah Anda ketahui.


2
2017-09-16 18:56



Saya tidak bermaksud terdengar kurang ajar, tetapi apakah Anda sudah mencoba memasukkan perangkat dan menjalankannya di bawah debugger saat tersambung?

Saya melakukan debugging ekstensif sementara menjalankan aplikasi pada perangkat. Anda perlu memulai aplikasi di bawah debugger.


-3
2018-03-14 09:44