Bagaimana cara men-debug ekstensi iOS 8 dengan NSLog?

90
- (void)viewDidLoad
{
    NSLog(@"%s", __func__);
    // ...
}

di viewDidLoaddari ekstensi iOS 8 . yang NSLogtidak ada output dalam Xcode. NSLogbekerja seperti biasa di aplikasi kontainer.

Bagaimana saya bisa mendapatkan keluaran dari pesan debug dari ekstensi?

ohho
sumber
Saya memiliki masalah ini juga. Mungkin NSLog baru saja rusak. Saya menggunakan Breakpoints untuk men-debug nilai saat ini. Tapi mereka juga buggy.
gallileo
Saya memiliki masalah serupa di mana debugger tidak pernah mengunci dan selalu mengatakan "menunggu untuk melampirkan" di Xcode. Sayangnya, saya tidak melihat ada gunanya googling dan memposting pertanyaan di Stack tanpa jawaban.
Alex Bollbach

Jawaban:

95
  1. Debugging berfungsi untuk ekstensi aplikasi.
  2. Ini bekerja pada simulator juga.
  3. Jika ekstensi aplikasi Anda mogok di simulator, mungkin tidak mudah untuk memulai ulang ekstensi aplikasi Anda. Memulai ulang simulator Anda adalah solusi cepat.
  4. Langkah-langkah untuk men-debug ekstensi aplikasi:

    1. Jalankan aplikasi kontainer. Pada langkah ini, Xcode mengupload aplikasi container dan ekstensi aplikasi ke perangkat atau simulator.

    2. Hentikan aplikasi kontainer. Langkah ini penting saat Anda men-debug di simulator. Jika Anda tidak melakukannya, Xcode akan memberi tahu Anda bahwa simulator sedang digunakan.

    3. Di Xcode, tekan menu Debug -> Attach to Process -> By Process Identifer (PID) atau Name ..., masukkan pengenal ext aplikasi, misalnya com.abc.ContainerApp.MyExtension, untuk memulai debugging. Jangan lupa untuk mengatur break point. (Pembaruan pada 25 Agustus 2014: Anda dapat memasukkan MyExtension (nama ekstensi Anda) secara langsung.)

    4. Di perangkat atau simulator, buka ekstensi aplikasi Anda.


Pembaruan pada 23 Agustus 2014:

Saya menemukan langkah debugging di atas tidak berfungsi dengan baik pada Xcode 6 beta 6 dengan iOS 8 SDK beta 5 pada simulator.

Larutan:

  1. Jalankan ekstensi Anda di simulator.
  2. Debug menu Xcode -> Lampirkan ke Proses -> Pilih "Ekstensi Saya (nama ekstensi Anda)" di bagian Sistem di menu.

Breakpoint berfungsi. Tapi saya tidak tahu mengapa log tidak muncul di jendela keluaran.

Vince Yuan
sumber
8
Sejauh ini cara termudah untuk men-debug (dan melihat NSLog) yang saya temukan adalah mengikuti langkah-langkah ini: /// 1 /// Pilih skema aplikasi container dan jalankan. /// 2 /// Setelah aktif dan berjalan - beralih kembali ke XCode dan (bahkan tanpa menekan tombol Stop) pilih skema ekstensi, lalu tekan tombol Jalankan. /// 3 /// Saat diminta untuk memilih aplikasi yang akan dijalankan, pilih Hari Ini. /// 4 /// Sekarang breakpoint dan NSLog akan bekerja tanpa masalah.
sela
1
Ini tidak berfungsi bahkan sampai hari ini, terutama setelah terjadi kecelakaan. Ini sangat mengganggu, saya tidak mengerti mengapa begitu sulit untuk diperbaiki.
Cristi Băluță
3
Saya mencoba menggunakan instruksi yang diperbarui di atas dan itu berhasil untuk saya. Namun, pada langkah 2, alih-alih menggunakan nama ekstensi saya, saya menggunakan "By Process Identifier (PID) atau Name ..." dan memasukkan pid dari proses tersebut. Ini secara ajaib memungkinkan saya untuk menggunakan break point saya.
tony.tc.leung
Debug> Lampirkan Ke Proses dengan PID atau nama: di bidang teks masukkan nama proses di navigator debug, seperti com.company.AppName.AppName-ExtensionName
TigerCoding
Jawaban ini tidak relevan dengan pertanyaan tersebut. OP menanyakan mengapa pesan NSLog tidak ditulis ke konsol dalam sebuah ekstensi (masalah yang sah ketika saya datang ke halaman ini dengan pertanyaan yang sama). Dia tidak menyebutkan masalah yang menghubungkan ke debugger.
Joey Carson
49

Saya mengalami masalah ini juga. Ini berfungsi untuk saya jika Anda masuk ke Simulator di bawah menu Debug -> Buka Log Sistem ...

Dari sini Anda dapat melihat semua log Simulator iPhone (termasuk log ekstensi Anda).

masukkan deskripsi gambar di sini

BalestraPatrick
sumber
itu akan membuka "~ / Library / Logs / CoreSimulator / <DEVICE_IDENTIFIER> /system.log" sehingga Anda dapat dengan mudah menemukan di sana semua log perangkat simulator Anda yang lain juga cukup ganti <DEVICE_IDENTIFIER> dengan ID perangkat simulator
Hofi
32

NSLogbekerja dengan sempurna .

Anda hanya tidak melihat apa yang sedang dicatat di area debug Xcode karena debugger Xcode tidak dilampirkan ke ekstensi Anda. Ekstensi hampir sepenuhnya independen dari aplikasi penampungnya. Mereka memiliki pengenal bundel terpisah, misalnya, dan mereka juga merupakan proses terpisah di OS.

Saya telah sukses beragam dalam mendapatkan Xcode untuk dilampirkan ke ekstensi. Seharusnya tampaknya itu akan melampirkan secara otomatis, dan itu muncul di navigator debug sebagai "Menunggu untuk melampirkan", tetapi tidak pernah terpasang.

Terkadang, saya dapat menjalankan target ekstensi saya di Xcode:

masukkan deskripsi gambar di sini

Dan kemudian memiliki opsi untuk memilih aplikasi apa untuk menjalankan ekstensi saya. Dalam hal ini, saya akan memilih rekomendasinya untuk "hari ini", yaitu pusat notifikasi.

masukkan deskripsi gambar di sini

Dan terkadang itu akan melampirkan debugger ke ekstensi saya. Perhatikan bahwa metode ini hanya berfungsi pada perangkat fisik, tampaknya.

Jika tidak terpasang, Anda dapat menggunakan metode lampiran manual di jawaban @ VinceYaun,

Saya juga mendapatkan berbagai keberhasilan dengan menggunakan metode keterikatan lainnya. Sebagian besar tidak berhasil, dan tampaknya itu hanya bug yang akan diperbaiki di kemudian hari.

Untuk melihat pesan log Anda, buka Window-> Devicesdi bilah atas dan pilih perangkat Anda. Anda dapat memunculkan log perangkat dari bagian bawah jendela itu. Jika Anda menguji simulator, Anda dapat menggunakan jawaban @ BalestraPatrick .

Beberapa bug telah diperbaiki di Beta 2, dan perkiraan saya adalah bahwa pada akhirnya debugger akan terpasang secara otomatis saat meluncurkan ekstensi.

Pembaruan: Di catatan rilis iOS 8 Beta 4 :

Ekstensi

Diperbaiki dalam beta 4

  • Ekstensi terkadang gagal diluncurkan saat melakukan debug dari Xcode.
  • Ketika Ekstensi dengan UI dimatikan, itu diluncurkan kembali dan tidak ditutup.
  • Terkadang ekstensi Berbagi atau Tindakan Anda dapat macet.
  • Menerapkan ulang ekstensi dapat menonaktifkannya di Pusat Pemberitahuan.
Sinterklas
sumber
apakah Anda mencoba pendekatan yang sama untuk Storage Extensions?
SRP-Achiever
Itu tidak berhasil untuk saya di Xcode 6 beta 2, tetapi jawaban Vince Yuan berhasil. Sayangnya, dalam debugging ekstensi Xcode 6 beta 3 tidak berfungsi sama sekali untuk saya. Saya tidak menemukan solusi untuk masalah itu, mungkin kami harus menunggu rilis berikutnya.
Darrarski
@Darrarski Jawaban saya tersisa dari Beta 1. FYI, Beta 3 keluar jadi Anda harus melakukannya sekarang.
Sinterklas
@SantaClub cukup jelas. Komentar saya adalah untuk menginformasikan bahwa tidak ada solusi yang diberikan yang berfungsi di Xcode 6 beta 3 untuk saya. Sepertinya proses debug ekstensi lebih rusak dalam rilis ini. Semoga beta berikutnya akan memperbaiki masalah ini.
Darrarski
3
Tak satu pun dari bug itu tampak diperbaiki bagi saya dalam beta 4 (sekarang beta 5).
matt
18

Saya mengalami masalah ini juga. Xcode tidak pernah melampirkan debugger saya ke ekstensi atau menampilkan pesan NSLog. Jika Anda memasang debugger Xcode secara manual ke proses ekstensi, setidaknya breakpoint berfungsi seperti pesona:

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
Masalis
sumber
5
Saya memiliki keberuntungan campur aduk dengan ini.
Santa Claus
2
upvote, tetapi tidak selalu berfungsi, semoga apple dapat secara otomatis melampirkan debugger ke ekstensi di rilis mendatang.
Jing
14
  1. Buat skema untuk ekstensi Anda
  2. Jalankan skema
  3. Dalam dialog pilih aplikasi kontainer
  4. Nikmati

Ini bekerja untuk saya :)

Maciek Czarnik
sumber
Inilah yang saya butuhkan
pob21
1
NSLoghanya akan berfungsi jika Anda menjalankan aplikasi kontainer. Ini tidak akan berfungsi jika Anda menjalankan ekstensi aplikasi, bukan penampung.
JaredH
Ini berhasil juga untuk saya. Terima kasih, Maciek Czarnik! Solusi di atas tidak berhasil untuk saya. Saya menggunakan Xcode 8.1.
plam4u
5

Xcode 8 dapat men-debug ekstensi:

  1. Pilih skema ekstensi dalam kombo di sebelah tombol stop dan jalankan.
  2. Pilih aplikasi induk di dialog yang muncul.

Hasil: breakpoint dan log berfungsi seperti biasa.

Jano
sumber
2
Tidak berfungsi dalam kasus saya, ekstensi Today. mendapatkan kesalahan CLANG: ld: library tidak ditemukan untuk -lRPush clang: error: perintah linker gagal dengan kode keluar 1 (gunakan -v untuk melihat pemanggilan)
BadmintonCat
Ini adalah kesalahan yang tidak terkait. Anda mencoba menautkan ke perpustakaan yang hilang. Tambahkan Liferay-Push ke target Anda.
Jano
4

Apa yang akhirnya memungkinkan saya untuk melihat log di area debugging, berdasarkan saran Michael dan dokumentasi Apple , adalah:

Bangun & Jalankan ekstensi aplikasi di simulator dan, ketika diminta untuk aplikasi host, pilih aplikasi tertentu yang akan Anda gunakan untuk memanggil ekstensi . Dalam kasus saya, saya meluncurkan ekstensi Tindakan saya dari Safari dengan menarik lembar saham di PDF.

Apa yang tidak berfungsi sebelumnya adalah mengikuti saran orang lain untuk menggunakan Today sebagai tuan rumah tetapi kemudian meninggalkan aplikasi itu dan pergi ke Safari untuk memanggil ekstensi saya. Saya bahkan tidak perlu lagi menjalankan aplikasi saya terlebih dahulu sebelum menjalankan ekstensi.

Dari Dokumentasi Apple:

Dalam fase Jalankan skema ekstensi Anda, Anda menentukan aplikasi host sebagai yang bisa dieksekusi. Setelah mengakses ekstensi melalui UI host yang ditentukan tersebut, debugger Xcode akan dilampirkan ke ekstensi.

Andrew
sumber
1

Trik yang berhasil untuk saya (meskipun cukup jelek) adalah menempatkan boneka UILabeldi suatu tempat di sudut bawah ekstensi saya. Saya biasanya menyebutnya logLabel. Kemudian dimungkinkan untuk memperbarui teks label ini dengan pernyataan log apa pun yang ingin Anda catat. Pendekatan seperti itu tidak terlalu baik jika Anda perlu membuat log pernyataan dari instance kelas yang berbeda. Dan, jelas, itu mengacaukan UI Anda.

Namun, jika Anda memiliki widget yang cukup sederhana dan Anda tidak keberatan dengan sedikit kekacauan pada UI, ini berhasil. Saya telah mencoba semua solusi lain yang diuraikan dalam diskusi ini dan, sayangnya, tidak ada yang berhasil untuk saya.

Andriy Gordiychuk
sumber
1

Satu-satunya cara debugging bekerja untuk saya adalah dengan memilih Debug-> Lampirkan Ke Proses Dengan PID atau Nama Kemudian masukkan PID bukan nama ekstensi. Anda dapat menemukan PID dengan menjalankan ekstensi pada perangkat, buka Window-> Perangkat. Temukan perangkat Anda dan lihat konsol. Ketika Anda melihat nama ekstensi Anda, diikuti dengan 5 digit angka. Itu adalah PID

Saya juga meletakkan banyak NSLog di ekstensi untuk menemukan PID juga. Ini ada di xCode 7

Tony
sumber
1

Menghadapi masalah yang sama tentang ekstensi untuk NSLog, dan titik putus. Saya telah melawannya selama berhari-hari.

Device logdapat ditemukan sebagai gambar berikut. Ini pada XCode -> Window -> Devices and Simulators.

Setelah masuk Open Console, ada kolom pencarian di kanan atas dialog. Saya dapat menerapkan aturan filter di sana. Misalnya, nama proses berisi Notificationkata kunci, atau nama proses harus sama dengan nama target ekstensi, mis .: sama dengan MyNotificationServiceExtensionnama proses.

Log perangkat

AechoLiu
sumber
0

Jelas ada sesuatu yang rusak di Xcode6-B5.

Jika saya mencoba menjalankan ekstensi Foto di Simulator, saya tidak dapat melihat Photos.app sebagai opsi untuk proses pemasangan ekstensi.

opsi debug dalam simulator

Hal yang sama, berjalan di perangkat nyata, beri saya perilaku yang benar.

opsi debug dengan perangkat nyata

Dalam kasus pertama breakpoint apapun tidak dihormati. Dalam kasus terakhir, breakpoint berfungsi seperti pesona.

valvoline
sumber
0

Anda harus tahu bahwa aplikasi kontainer dan ekstensi adalah dua proses yang berbeda di iOS sedangkan LLVM hanya men-debug utas satu kali, jadi ketika Anda men-debug, konsol tidak pernah mencatat ekstensi dan tidak pernah berhenti di breakpoint.

Anda dapat menyelesaikan sebagian besar masalah dengan metode @Vince Yuan.

Namun, masalah saya adalah bahwa debugger Xcode hampir tidak menghubungkan ekstensi keyboard saya di iOS Simulator dan perangkat, seperti 1 kali dalam 7-8 berjalan, Ini benar-benar masalah probabilitas. Metode @Vince Yuan juga kadang-kadang berhasil.

Pengalaman kecil saya adalah ketika Anda menjalankan skema debug, jika Sesi debug di panel kiri menunjukkan bahwa 'Tanpa Sesi Debug', tidak perlu membuka ekstensi Anda dan mengujinya, debugger tidak terhubung, jalankan saja lagi untuk beruntung.

tetapi ketika Anda melihat com.xxx.xxx.xxx sedang menunggu untuk Lampirkan, ekstensi tersebut pasti bisa di-debug.

Ini adalah trik kecil yang tidak dapat men-debug ekstensi iOS, terutama ekstensi keyboard.

Henry
sumber
0

Pada Xcode 6 Beta 5, saya sudah dapat menggunakan perangkat sebenarnya yang menjalankan iOS8 untuk men-debug ekstensi saya. Coba jalankan di perangkat dan pilih Safari untuk meluncurkannya

Rich86man
sumber
0

Untuk mengatasi semua status yang disebabkan oleh IDE yang selalu berubah, saya menggunakan Konsol iOS oleh lemonjar.com - ini menampilkan jendela konsol untuk perangkat iOS yang terhubung yang merender pesan syslog apa pun ID prosesnya. Anda dapat melihat pesan log debug aplikasi dan ekstensi sekaligus di sini.

igraczech
sumber
0

Saya dapat men-debug ekstensi saya dengan cara yang saya jelaskan di bawah ini:

  1. Xcode : Debug-> Attach to process by PID or Name. Nama skema ekstensi Anda.
  2. Kemudian pilih Anda main app targetdan jalankan.

Saya harap ini juga berhasil untuk kalian.

abdullahselek
sumber