Section 6/161 menit

6. Evaluasi Ekspresi: po, p, dan expr

6. Evaluasi Ekspresi: po, p, dan expr

Memahami perbedaan antara po, p, dan expr adalah kunci penggunaan LLDB yang efektif.

po — Print Object Description

po memanggil properti debugDescription (atau description jika tidak ada). Untuk tipe Swift custom, ini menampilkan representasi yang ditulis developer. Untuk tipe Apple, ini seringkali lebih informatif daripada p.

swift
# po untuk object
(lldb) po myUser
▿ User
  - id: "usr_123"
  - name: "Budi Santoso"
  - email: "budi@example.com"
  - role: admin

# po untuk array
(lldb) po myArray
▿ 3 elements
  ▿ 0 : Item
    - id: 1
  ▿ 1 : Item
    - id: 2
  ▿ 2 : Item
    - id: 3

# po untuk optional
(lldb) po optionalValue
Optional("hello world")

(lldb) po nilValue
nil

# po untuk memanggil computed property atau method
(lldb) po myUser.displayName
"Budi Santoso (admin)"

(lldb) po myArray.filter { $0.id > 1 }

p — Print dengan Type Formatter

p menggunakan LLDB's built-in type formatters — lebih cepat dari po karena tidak perlu memanggil Swift runtime, tapi kurang informatif untuk tipe kompleks.

swift
# p untuk nilai primitif (lebih cepat)
(lldb) p myInt
(Int) myInt = 42

(lldb) p myString
(String) myString = "hello"

(lldb) p myBool
(Bool) myBool = true

# p untuk struct (menampilkan semua stored properties)
(lldb) p myPoint
(CGPoint) myPoint = (x = 10.5, y = 20.3)

expr — Ekspresi Arbitrer

expr (singkatan e) adalah perintah paling powerful — bisa menjalankan ekspresi Swift arbitrer, memodifikasi variabel, bahkan mendefinisikan fungsi baru.

swift
# Memodifikasi variabel
(lldb) expr myCounter = 100
(lldb) expr myUser.name = "Test User"

# Memanggil fungsi
(lldb) expr myViewModel.loadData()
(lldb) expr UserDefaults.standard.removeObject(forKey: "auth_token")

# Mendefinisikan variabel baru (gunakan $ prefix)
(lldb) expr let $doubled = myValue * 2
(lldb) po $doubled

# Ekspresi multi-baris (ketik expr lalu Enter, akhiri dengan Enter kosong)
(lldb) expr
Enter expressions, then terminate with an empty line to evaluate:
1 let $filtered = myArray.filter { $0.isActive }
2 let $count = $filtered.count
3
(Int) $count = 5

# Import module untuk akses di expr
(lldb) expr import UIKit
(lldb) expr UIApplication.shared.keyWindow?.backgroundColor = .red

v — Variable View (Tercepat)

v adalah cara tercepat untuk melihat variabel lokal — tidak melibatkan Swift evaluator, murni membaca memory.

swift
# Tampilkan semua variabel di frame saat ini
(lldb) v

# Tampilkan variabel tertentu dan child-nya
(lldb) v myObject
(lldb) v myObject.items[0].price

# Sangat cepat, cocok untuk loop debugging

Perbedaan Kecepatan

Perintah Mekanisme Kecepatan Cocok untuk
v Baca memory langsung Tercepat Variabel lokal sederhana
p LLDB type formatter Cepat Primitif, struct sederhana
po Swift runtime evaluation Sedang Object kompleks, custom description
expr Full Swift compilation Lambat Modifikasi state, ekspresi kompleks