Anda dapat mengatur break point bersyarat di Xcode dengan mengatur breakpoint secara normal, kemudian control-klik di atasnya dan pilih Edit Breakpoint (pilih Run -> Show -> Breakpoints).
Di entri breakpoint, ada kolom Kondisi.
Nah, ada beberapa hal yang perlu diperhatikan untuk kondisi tersebut. Pertama, gdb tidak memahami sintaks titik, jadi alih-alih myObj.name, Anda harus menggunakan [nama myObj] (kecuali nama adalah ivar).
Selanjutnya, seperti kebanyakan ekspresi di gdb, Anda harus memberitahukan jenis hasil yang dikembalikan, yaitu "BOOL". Jadi tetapkan kondisi seperti:
(BOOL)[[myObj name] isEqualToString:@"Bar"]
Seringkali sebenarnya lebih mudah untuk melakukan ini dalam kode dengan menambahkan kode sementara seperti:
if ( [myObj.name isEqualToString:@"Bar"] ) {
NSLog( @"here" );
}
dan kemudian mengatur break point pada NSLog. Kemudian kondisi Anda dapat menjadi sangat kompleks tanpa harus khawatir tentang apa yang dapat dan tidak dapat diurai oleh gdb.
Berikut adalah cara Anda menggunakan breakpoint bersyarat XCode lldb.
Pertama, klik dua kali break point (atau klik kanan
edit breakpoint
), Anda dapat melihat popup dialog.Inilah arti dari opsi tersebut:
Berikut ringkasannya. Untuk contoh gambar di atas, itu berarti bahwa ketika variabel
buildingId
sama dengan 13, pecahkan di sini. Jika saya menambahkan waktu pengabaian ke 1, maka waktu pengabaian pertama akan diabaikan jikabuildingId
sama dengan 13 dan istirahat di saat kedua kondisi terpenuhi.Untuk tindakan, saat Anda menekan tambahkan tindakan, akan ada daftar pilihan. Biasanya yang saya lakukan adalah menggunakan
Debugger Command
po
untuk mencetak variabel yang perlu saya periksa dan saya yakin ada cara yang lebih baik menggunakan tindakan daripada yang saya lakukan.Tampaknya Anda harus mengompilasi ulang dan menjalankan aplikasi jika Anda mengubah kondisi saat runtime
sumber
Saya tidak yakin apakah ini akan berhasil, tetapi Anda dapat mencoba mengatur breakpoint pada baris kode itu, buka konsol debugger (Cmd + Shift + R), dan ketik
condition N (int)[[myObj name] isEqualToString:@"Bar"]
Dimana N diganti dengan jumlah breakpoint (integer).
sumber
Jika Anda memutasi myObj.name menggunakan setter, Anda dapat menambahkan breakpoint simbolis
-[MyObjClass setName:]
baik dari Debugger Console atau dari Run-> Manage Breakpoints-> Add Symbolic Breakpoint menu di Xcode. Jika tidak (mengapa tidak? Anda mungkin tidak boleh memodifikasi variabel instance secara langsung kecuali di penginisialisasi atau dealloc yang ditentukan), Anda dapat menyetel watchpoint di gdb (gunakan Konsol Debugger di Xcode setelah debugger berjalan). Halaman ini menjelaskan caranya. Saya tidak percaya Xcode mengekspos UI untuk mengatur watchpoints tanpa menggunakan Debugger Console.sumber
Saat bekerja dengan Frameworks (debug builds) dan perlu meletakkan breakpoint di file / lokasi tertentu yang sulit dinavigasi atau tidak diekspos secara publik dalam framework yang sedang dikembangkan. Salah satu opsinya adalah menulis kelas pembantu untuk memicu breakpoint bersyarat & membuat langkah-masuk / keluar lebih mudah.
- (void)invokeFrameworkMethod { ... [DebugConditionalBreakPointHelper breakPointCondition:YES comment:@"from invokeFrameworkMethod."]; ... }
Deklarasi header dalam kerangka kerja yang sedang dikembangkan.
#import <Foundation/Foundation.h> @interface DebugConditionalBreakPointHelper : NSObject + (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment; @end
Dan file implementasi:
#import "DebugConditionalBreakPointHelper.h" @implementation DebugConditionalBreakPointHelper + (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment { if (enabled) { NSLog(@"Triggerred Conditional Break Point. Comment: %@"); } } @end
sumber