Pembaruan: Plugin Xcode sebelumnya telah diatur ulang menjadi Paket Swift untuk digunakan di aplikasi lain. Gunakan produk Xprobe
di aplikasi klien dan produk XprobeUI
di sisi server.
XprobePlugin memberi Anda gambaran tentang objek di dalam aplikasi Anda baik secara detail hingga tingkat ivars atau secara global sebagai grafik objek utama dan cara mereka terhubung. Tampilan ini dapat dianimasikan secara real time, menyorot objek berwarna merah saat pesan tersebut dikirim dan jalur aliran pesan. Hal ini dilakukan secara otomatis dengan melakukan "sapuan" untuk menemukan semua objek yang dirujuk oleh sekumpulan seed, objek yang dirujuk, objek yang dirujuk, dan seterusnya untuk membuat daftar objek langsung yang dapat ditampilkan di Xcode :
Dalam simulator, penyapu memori dimuat dari bundel di dalam plugin menggunakan lldb yang tidak memerlukan perubahan pada sumber proyek aplikasi. Untuk menggunakan plugin, bangun proyek ini dan mulai ulang Xcode. Setelah aplikasi Anda berjalan, gunakan item menu "Produk/Xprobe/Muat" untuk memuat tampilan awal sapuan memori aplikasi Anda. Jika Anda seorang pengembang plugin, Anda menggunakan "Produk/Xprobe/Xcode" untuk memeriksa objek aplikasi Xcode itu sendiri.
Anda kemudian dapat memfilter objek yang terdaftar ke dalam aplikasi atau metodenya menggunakan sebuah pola. Jika tidak ada objek yang cocok dengan polanya dan itu adalah nama kelas maka akan ditampilkan. Pola yang diawali dengan '+' atau '-' akan mencari semua kelas yang terhubung ke aplikasi untuk menemukan metode yang cocok dengan pola tersebut. Pointer mentah yang diawali dengan "0x" dapat dimasukkan untuk memeriksa objek yang diteruskan sebagai argumen ke jejak. Anda juga dapat memasukkan objek "jalur" yang dimulai dengan "benih". dari jalur yang dicatat saat Anda menelusuri aplikasi sehingga Anda dapat menemukan jalan kembali ke objek dengan mudah.
Jika Anda menginstal plugin injectionforxcode, Xprobe akan memungkinkan Anda mengevaluasi Objective-C atau Swift terhadap instance yang dipilih yang sumbernya Anda miliki untuk mencatat atau mengubah aspek apa pun dari status objek saat run time.
Xprobe.mm sekarang dapat mengambil snapshot aplikasi Anda ke file html mandiri jika terjadi kesalahan. Tindakan ini melakukan penyisiran dan dapat mendokumentasikan status aplikasi Anda pada saat kesalahan terjadi untuk dianalisis nanti. Contoh file snapshot untuk proyek contoh ReactNative "TickTackToe" dapat dilihat di sini.
Untuk mengambil snapshot, sertakan Xprobe.mm di aplikasi Anda dan gunakan panggilan berikut:
[Xprobe snapshot: @" /path/to/snapshot.html.gz " seeds: @[app delegate, rootViewController]];
Jika Anda mengalami kesulitan, Anda dapat mengubah pola nama kelas agar tidak ditangkap dengan argumen tambahan kecuali:(NSString *)pola. Nilai default untuk ini adalah:
@" ^(?:UI|NS((Object|URL|Proxy)$|Text|Layout|Index|.*(Map|Data|Font))|Web|WAK|SwiftObject|XC|IDE|DVT|Xcode3|IB|VK) "
Fitur lainnya paling mudah disajikan sebagai serangkaian poin-poin:
Klik pada tautan objek untuk melihat konten ivarnya.
Klik tautan itu lagi untuk menutup tampilan detail.
Klik pada link superclass untuk melihat ivarnya
Klik pada nama ivar untuk menyegarkan nilainya dari aplikasi
Klik pada nilai ivar untuk mengedit dan mengatur nilainya di aplikasi
Properti kelas, metode, dan protokol apa pun dapat dilihat.
Daftar metode dapat dicari (juga menemukan metode superclass)
Gunakan tautan "jejak" untuk mulai mencatat panggilan ke metode pada instans tersebut.
Untuk melihat semua metode yang dilacak untuk suatu objek, klik lacak setiap kelas.
Output jejak dapat difilter menggunakan ekspresi reguler
Tautan subview akan menampilkan pohon subview secara rekursif di bawah tampilan.
Tautan "render" akan menangkap gambar saat objeknya berupa tampilan.
Tautan saudara akan menampilkan semua objek yang ditemukan yang berbagi kelas objek tersebut.
Refresh daftar objek dengan mengetikkan enter di Bidang Pencarian untuk memaksa sapuan baru.
Menekan tombol Grafik akan membuka tampilan ringkasan objek terpenting dan objek "kit" apa pun yang terkait langsung dengannya yang diambil dari sapuan terakhir.
Objek direpresentasikan sebagai persegi jika berupa tampilan (merespon "subview".)
Tampilan grafik memerlukan instalasi "Graphviz/dot" di komputer Anda.
Klik pada suatu objek untuk melihat isinya saat ini seperti dibahas di atas.
Pemfilteran berbeda terhadap objek mana yang akan disertakan dapat diterapkan.
"Pesan Animasi" memberi jejak pada objek sehingga objek tersebut menampilkan "merah" saat dikirimi pesan.
Grafik dapat diekspor ke format Graphviz atau .png untuk dicetak.
Sayangnya, dukungan Swift terbatas saat ini karena ivar_getTypeEncoding() mengembalikan NULL untuk bidang ivar yang mencegah mereka mengambil bagian dalam "sapuan".
Xprobe bekerja dengan memuat bundel di simulator yang terhubung ke Xcode saat dimuat. Suatu aplikasi membuat daftar node benihnya diketahui Xprobe dengan mengimplementasikan kategori berikut:
@implementation Xprobe (Seeding)
+ ( NSArray *)xprobeSeeds {
UIApplication *app = [UIApplication sharedApplication ];
NSMutableArray *seeds = [ NSMutableArray arrayWithObject: app];
[seeds addObjectsFromArray: [app windows ]];
// support for cocos2d
Class ccDirectorClass = NSClassFromString ( @" CCDirector " );
CCDirector *ccDirector = [ccDirectorClass sharedDirector ];
if ( ccDirector )
[seeds addObject: ccDirector];
return seeds;
}
@end
Atau untuk OSX:
+ ( NSArray *)xprobeSeeds {
NSApplication *app = [ NSApplication sharedApplication ];
NSMutableArray *seeds = [[app windows ] mutableCopy ];
if ( app. delegate )
[seeds insertObject: app.delegate atIndex: 0 ];
return seeds;
}
Setelah aplikasi diinisialisasi, panggil [Xprobe connectTo:"your.ip.address" RetainObjects:YES] untuk terhubung ke server TCP yang berjalan di dalam Xcode. Argumen RetainObjects: menentukan apakah akan mempertahankan objek yang ditemukan dalam sapuan. Hal ini akan membuat Xprobe lebih andal namun akan memengaruhi siklus hidup objek di aplikasi Anda. Setelah ini, panggil [Xprobe search:@""] untuk melakukan sapuan awal mulai dari objek ini untuk mencari objek akar. Setiap kali "pencarian:" dipanggil atau filter kelas objek diubah, sapuan dilakukan lagi. Aplikasi perlu dibuat dengan Xprobe dan Xtrace.{h,mm}.
Di zaman sekarang ini, petunjuk "kuat" dan "lemah" yang bersih dan bagus, sapuan tersebut tampaknya sangat dapat diandalkan jika objek entah bagaimana terlihat oleh benih. Beberapa kelas lama tidak berperilaku baik dan menggunakan properti "assign" yang dapat berisi pointer ke objek yang tidak dialokasikan. Untuk menghindari menyapu ivars kelas-kelas ini, Xprobe memiliki filter pengecualian yang dapat diganti (dengan peringatan) dalam kategori:
static NSString *swiftPrefix = @" _TtC " ;
@implementation Xprobe (ExclusionOverride)
+ ( BOOL )xprobeExclude:( NSString *)className {
static NSRegularExpression *excluded;
if ( !excluded )
excluded = [ NSRegularExpression xsimpleRegexp: @" ^(_|NS|XC|IDE|DVT|Xcode3|IB|VK|WebHistory) " ];
return [excluded xmatches: className] && ![className hasPrefix: swiftPrefix];
}
@end
Pengecualian ini memungkinkan Xprobe bekerja dengan baik di dalam Xcode itu sendiri yang berguna jika Anda seorang pengembang plugin. Untuk saran atau masukan apa pun, Anda dapat menghubungi penulis di xprobe di johnholdsworth.com. Rilisan besar akan diumumkan di twitter @Injection4Xcode.
Dengan Swift 2.3+, Xprobe tidak lagi dapat memindai ivar yang tidak memiliki properti yaitu kelas yang tidak mewarisi dari NSObject.
Xprobe.{h,mm} - fungsionalitas inti Xprobe diperlukan untuk snapshot IvarAccess.h - rutinitas yang diperlukan untuk akses ke kelas ivars dengan nama Xprobe+Service.mm - layanan interaktif opsional yang terhubung ke Xcode
Hak Cipta (c) 2014-5 John Holdsworth. Dilisensikan untuk mengunduh, memodifikasi, dan penggunaan apa pun selama pengembangan aplikasi Objectice-C, pendistribusian ulang hanya dapat dilakukan melalui repo publik github namun termasuk pemberitahuan hak cipta ini. Untuk redistribusi biner dengan aplikasi Anda, hubungi kami!
Rilis ini mencakup versi perpustakaan canviz yang sangat sedikit dimodifikasi untuk merender file "titik" dalam kanvas HTML yang tunduk pada lisensi MIT. Perubahannya adalah meneruskan ID node ke tag label node (baris 212), membalikkan rendering node dan garis yang menghubungkannya (baris 406) dan menyimpan jalur tepi sehingga dapat diwarnai (baris 66 dan 303) di "canviz-0.1/canviz.js".
Sekarang juga mencakup editor JavaScript CodeMirror untuk kode yang akan dievaluasi menggunakan injeksi di bawah lisensi MIT.
PERANGKAT LUNAK INI DISEDIAKAN "APA ADANYA", TANPA JAMINAN APA PUN, TERSURAT MAUPUN TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN KELAYAKAN UNTUK DIPERDAGANGKAN, KESESUAIAN UNTUK TUJUAN TERTENTU, DAN TIDAK ADA PELANGGARAN. DALAM KEADAAN APA PUN PENULIS ATAU PEMEGANG HAK CIPTA TIDAK BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN ATAU TANGGUNG JAWAB LAINNYA, BAIK DALAM TINDAKAN KONTRAK, HUKUM ATAU LAINNYA, YANG TIMBUL DARI, DARI ATAU SEHUBUNGAN DENGAN PERANGKAT LUNAK ATAU PENGGUNAAN ATAU HAL-HAL LAIN DALAM PERANGKAT LUNAK.