Bagaimana cara mengubah nilai variabel saat melakukan debug dengan LLDB di Xcode?

173

Dalam Xcode, GDB memungkinkan Anda untuk mengubah variabel lokal saat debugging (lihat bagaimana mengubah nilai NSString saat debugging di XCode? ). Apakah LLDB menawarkan fungsi serupa? Jika demikian, bagaimana kita dapat menggunakannya?

Eric
sumber
1
Pastikan untuk melihat Advanced debugging di iOS . Ini luar biasa
Sayang
Saya mencoba mengatur properti objek, yang berfungsi jika panjang string antara 0-15 karakter. Menyetel string yang terdiri dari 16 karakter atau lebih diterima, tetapi ketika saya mencetaknya kembali, itu menunjukkan kepada saya string omong kosong: po myObj.someString = "1234567890123456", yang berfungsi, tetapi ketika saya mencetak saya mendapatkan (String? $ R68 = " \ 0 \ 0 \ 0 \ 0 @ \ a \ u {1} \ c {5} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ "
Nick Wright

Jawaban:

267
expr myString = @"Foo"

(lldb) membantu expr
Mengevaluasi ekspresi C / ObjC / C ++ dalam konteks program saat ini, menggunakan variabel yang saat ini dalam cakupan. Perintah ini mengambil input 'mentah' (tidak perlu mengutip barang).

Sintaks: ekspresi -

Opsi Perintah Penggunaan: ekspresi [-f] [-G] [-d] [-u] - ekspresi [-o] [-d] [-u] - ekspresi

   -G <gdb-format>  ( --gdb-format <gdb-format> )
        Specify a format using a GDB format specifier string.

   -d <boolean>  ( --dynamic-value <boolean> )
        Upcast the value resulting from the expression to its dynamic type
        if available.

   -f <format>  ( --format <format> )
        Specify a format to be used for display.

   -o  ( --object-description )
        Print the object description of the value resulting from the
        expression.

   -u <boolean>  ( --unwind-on-error <boolean> )
        Clean up program state if the expression causes a crash, breakpoint
        hit or signal.

Contoh:

expr my_struct-> a = my_array [3]
expr -f bin - (index * 8) + 5
expr char c [] = "foo"; c [0]

CATATAN PENTING: Karena perintah ini mengambil input 'mentah', jika Anda menggunakan opsi perintah apa pun, Anda harus menggunakan '-' di antara akhir opsi perintah dan awal input mentah.

'expr' adalah singkatan untuk 'ekspresi'

Matthias Bauch
sumber
1
Memang terima kasih! Satu lagi pertanyaan kecil: Saya melakukan ini untuk mencoba mengubah teks dari UILabel: 'expr myLabel.text = @"hello!"tapi saya mendapatkan error: property 'text' not found on object of type 'UILabel *'... Ada pemikiran?
Eric
10
expr (void)[label setText:@"Foo"]harus melakukannya. Dot-Syntax biasanya tidak akan berfungsi di debugger. lldb mungkin menafsirkannya karena Anda ingin mengakses anggota c-struct, tapi saya tidak yakin apakah ini alasannya ia tidak akan berfungsi. Dot-Syntax tidak bekerja untuk pokeduanya. alih-alih po label.textAnda harus menggunakanpo [label text]
Matthias Bauch
4
Sebenarnya, lldb menangani dot sintaks jauh lebih baik daripada gdb. gdb hanya menganggap Anda memperlakukannya seperti C-struct, yang gagal. lldb akan mengakses properti dengan benar, tetapi hanya jika mereka benar-benar dideklarasikan dengan @property.
BJ Homer
28
Anda juga dapat menggunakan psebagai jalan pintas untuk expr. Contoh:(lldb) p url = @"http://google.com"
funroll
11
Anda juga dapat menggunakan esebagai jalan pintas untuk expr. BTW, padalah alias untuk cetak yang merupakan alias untuk expr --(hanya menilai input mentah, tanpa bendera) expr -o -- [object]atau poumumnya memberi Anda hasil yang lebih berguna untuk objek.
Jason Newell
21

Hal-hal berikut ini berfungsi untuk saya. Saya menggunakan Xcode 8.

Jika Anda ingin menetapkan beberapa variabel (misalnya "dict") menjadi nil dan kemudian menguji aliran kode, Anda dapat mencoba yang berikut ini.

  1. Masukkan breakpoint dengan benar setelah diinisialisasi ke nilai yang diinginkan.
  2. kemudian jalankan "ekspresi dict = nil" di baris perintah lldb untuk mengubahnya. (misalnya "nihil")
  3. Langkahi break point.
  4. Periksa variabel "dict" di baris berikutnya. Itu akan menjadi nol.

Ini akan terlihat seperti di konsol.

(lldb) expression dict = nil
(NSDictionary *) $5 = nil
arango_86
sumber
3

Jika Anda menggunakan Xcode 10 atau 11, masukkan breakpoint dengan benar setelah diinisialisasi ke variabel yang diperlukan, maka Anda dapat mengubah variabel dengan po myString = "Hello World"mudah.

atalayasa
sumber