Xcode Debugger: melihat nilai variabel

107

Kode saya di UITableViewController:

delegate.myData = [myData objectAtIndex:indexPath.row];

Bagaimana cara melihat nilai dari delegate.myDataatau indexPath.rowdi Debugger? delegate.myDataharus array dan indexPath.rowsebuah int. Saya hanya dapat melihat alamat memori dari objek delegatedan indexPathtetapi di mana myDatadan row?

teks alt

Manni
sumber

Jawaban:

142

Periksa ini Bagaimana cara melihat konten variabel NSDictionary di debugger Xcode?

Saya juga menggunakan

po variableName
print variableName

di Konsol.

Dalam kasus Anda, dimungkinkan untuk dieksekusi

print [myData objectAtIndex:indexPath.row]  

atau

po [myData objectAtIndex:indexPath.row]
Andriy
sumber
Terima kasih! Saya mencoba banyak: "print [myData objectAtIndex: indexPath.row]", "po [myData objectAtIndex: indexPath.row]", "print indexPath.row", "po indexPath.row", ... Tapi setiap kali saya mendapat pesan "Tidak ada anggota bernama baris." Ini berfungsi: "print indexPath" dan "po indexPath". Jadi saya mencoba menggunakan "[]" daripada ".": "Po [indexPath row]" -> "Tidak dapat mencetak deskripsi objek NIL." "po [indexPath getRow]" -> "Target tidak menanggapi pemilih pesan ini." :-(
Manni
4
coba cetak (int) [indexPath row]
Andriy
po [myData objectAtIndex: (int) [indexPath row]]
Andriy
@VanDuTran Saya cukup yakin yang setara dengan po objcepat adalah po print(obj).
Chris
Ini juga sempurna untuk menemukan nilai properti yang dihitung. Terima kasih!
Paula Hasstenteufel
25

Saya setuju dengan poster lain bahwa Xcode sebagai lingkungan berkembang harus menyertakan cara mudah untuk men-debug variabel. Nah, kabar baik, ADA satu!

Setelah mencari dan tidak menemukan jawaban / tutorial sederhana tentang cara men-debug variabel di Xcode, saya pergi menjelajah dengan Xcode itu sendiri dan menemukan ini (setidaknya untuk saya) penemuan yang sangat berguna.

Cara men-debug variabel Anda dengan mudah di Xcode 4.6.3

Di layar utama Xcode pastikan untuk melihat Area Debug bawah dengan mengklik tombol pojok kanan atas yang ditunjukkan di tangkapan layar.

Tombol Debug Area

Area Debug di Xcode 4.6.3

Sekarang atur Breakpoint - garis dalam kode Anda di mana Anda ingin program Anda berhenti, dengan mengklik batas Area Kode Anda.

Breakpoint

Sekarang di Area Debug cari tombol ini dan klik yang ada di tengah. Anda akan melihat bahwa daerah Anda sekarang terbagi menjadi dua.

Pisahkan Area Debug

Akan terlihat seperti ini

Sekarang jalankan aplikasi Anda.

Ketika Breakpoint pertama tercapai selama eksekusi program Anda, Anda akan melihat di sisi kiri semua variabel Anda tersedia di breakpoint itu.

Bidang Pencarian

Anda dapat memperluas panah kiri pada variabel untuk lebih detail. Dan bahkan gunakan kolom pencarian untuk mengisolasi variabel yang Anda inginkan dan melihatnya berubah secara real time saat Anda "Masuk ke" cakupan Breakpoint.

Melangkah ke

Di sisi kanan Area Debug Anda, Anda dapat mengirim untuk mencetak variabel sesuai keinginan menggunakan klik tombol kanan mouse di atas variabel yang diinginkan.

Menu Kontekstual

Seperti yang Anda lihat, menu kontekstual itu penuh dengan opsi debugging yang sangat menarik. Seperti Watch yang telah disarankan dengan perintah yang diketik atau bahkan Edit Nilai… yang mengubah nilai runtime variabel Anda!

Lex L.
sumber
21

Anda juga bisa:

  1. Tetapkan breakpoint untuk menjeda eksekusi.
  2. Objek harus berada di dalam lingkup eksekusi
  3. Pindahkan penunjuk mouse ke atas objek atau variabel
  4. Tooltip kuning akan muncul
  5. Gerakkan mouse ke atas tooltip
  6. Klik di atas dua panah kecil yang mengarah ke atas dan ke bawah
  7. Menu konteks akan muncul
  8. Pilih "Print Description", ini akan mengeksekusi [deskripsi objek]
  9. Deskripsi akan muncul di keluaran konsol

IMHO sedikit tersembunyi dan rumit ...

LightMan
sumber
Di xcode "Deskripsi Cetak" saya tidak berfungsi, jadi bagaimana cara mengaktifkannya?
Kirtikumar A.
@kirtiavaiya aplikasi harus dalam keadaan jeda, dan variabel Anda harus berada di dalam cakupan saat ini untuk dicetak. Anda juga tidak dapat mencetak "self.variable" secara langsung, tetapi Anda dapat menggunakan solusi Andriy untuk mencetak _ <nama variabel>. Misalnya: untuk self.btnHello tulis di konsol "po _btnHello" (ini hanya berfungsi jika Anda belum mengubah nama metode pengambil)
LightMan
@LightMan ya, seperti yang Anda katakan, tetapi kemudian juga tidak berfungsi
Kirtikumar A.
10

Kebingungan Anda berasal dari fakta bahwa properti yang dideklarasikan bukan (harus dinamai sama dengan) (instance) variabel.

Ekspresi

indexPath.row

setara dengan

[indexPath row]

dan penugasan

delegate.myData = [myData objectAtIndex:indexPath.row];

setara dengan

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

dengan asumsi penamaan standar untuk properti yang disintesis.

Lebih lanjut, delegatemungkin dideklarasikan sebagai bertipe id<SomeProtocol>, yaitu, kompilator belum dapat memberikan informasi tipe sebenarnya untuk delegatesaat itu, dan debugger mengandalkan informasi yang disediakan pada waktu kompilasi. Karena idmerupakan tipe generik, tidak ada informasi waktu kompilasi tentang variabel instan di delegate.

Itulah alasan mengapa Anda tidak melihat myDataatau rowsebagai variabel.

Jika Anda ingin memeriksa hasil pengiriman -rowatau -myData, Anda dapat menggunakan perintah patau po:

p (NSInteger)[indexPath row]
po [delegate myData]

atau gunakan jendela ekspresi (misalnya, jika Anda mengetahui delegatetipe sebenarnya MyClass *, Anda dapat menambahkan ekspresi (MyClass *)delegate, atau klik kanan delegate, pilih View Value as…dan ketik tipe aktual delegate(mis MyClass *.).

Karena itu, saya setuju bahwa debugger bisa lebih membantu:

  • Mungkin ada opsi untuk memberi tahu jendela debugger untuk menggunakan informasi jenis waktu proses alih-alih informasi waktu kompilasi. Ini akan memperlambat debugger, memang, tetapi akan memberikan informasi yang berguna;

  • Properti yang dideklarasikan dapat ditampilkan dalam grup yang disebut properti dan memungkinkan pemeriksaan (opsional) langsung di jendela debugger. Ini juga akan memperlambat debugger karena kebutuhan untuk mengirim pesan / menjalankan metode untuk mendapatkan informasi, tetapi akan memberikan informasi yang berguna juga.

Chris G.
sumber
Terima kasih atas penjelasan Anda! Ini telah banyak membantu saya! :-)
Manni
7

Anda dapat mencetak nilai ke jendela konsol saat run-time. Berikut langkah-langkahnya:

  1. Tempatkan break-point yang Anda ingin dapatkan nilainya
  2. Sekarang lakukan debug langkah demi langkah.
  3. Tempatkan kursor pada variabel / delegasi yang nilainya akan diperiksa pada saat berjalan.
  4. Sekarang ini akan menampilkan deskripsi variabel / delegasi
  5. Mengklik "i" akan menampilkan deskripsi rinci
  6. Ini juga akan mencetak detail ke jendela konsol.

Tangkapan layar untuk detail pencetakan di jendela konsol

Jayprakash Dubey
sumber
1
Apakah ini bekerja dengan cepat, saya baru mengenal cepat tidak dapat melihat nilai-nilai objek seperti yang kita gunakan untuk melihat di objek c.
umairhhhs
1
@umairhhhs Posting ini hanya untuk Objective-C.
Jayprakash Dubey
1
Saya bertanya-tanya mengapa ini tidak ada di editor cepat karena fitur itu sangat membantu dan menghemat waktu.
umairhhhs
1

Ini menjadi sedikit rumit. Objek ini adalah kelas atau struct kustom, dan mencari di dalamnya tidak semudah di Xcode seperti di lingkungan pengembangan lainnya.

Jika saya jadi Anda, saya akan men-NSLog nilai-nilai yang ingin Anda lihat, dengan beberapa deskripsi.

yaitu:

NSLog(@"Description of object & time: %i", indexPath.row);
Aurum Aquila
sumber
11
Ya, NSLog adalah kemungkinan tetapi bukan alternatif yang nyaman untuk debugging. Saya sangat terkejut bahwa tidak ada cara untuk menampilkan nilai yang diinginkan. Itu termasuk fungsi dasar lingkungan pengembangan.
Manni
2
Hal yang paling menyebalkan tentang XCode. Menyedihkan.
ryan0
1

Coba Run-> Show-> Expressions

Masukkan nama larik atau apa pun yang Anda cari.

tulang T
sumber
Terima kasih! Saya memasukkan "indexPath.row" dan "delegate.myData" di jendela ekspresi tetapi setiap kali muncul "di luar cakupan" di kolom "Ringkasan" :-(
Manni
np, saya memiliki masalah yang sama sampai saya menemukannya;)
tbone
1
atur breakpoint tepat setelah Anda mengatur array Anda atau apa pun dan Anda harus menemukan nilai dalam Expressions. Semoga berhasil
tulang tulang