'Nama Proyek' dikompilasi dengan optimisasi - loncatan mungkin berperilaku aneh; variabel mungkin tidak tersedia

211

Mencoba masuk ke kode AFNetworking menghasilkan peringatan berikut:

[Project Name] was compiled with optimization - stepping may behave oddly; variables may not be available.

Dan tentu saja saya tidak dapat men-debug kode. Untuk lebih spesifik saya mencoba men-debug UIImageView+AFNetworkingkategori yang tampaknya tidak mungkin. Mengubah kode tidak berpengaruh (dicoba NSLog, dll) dan ketika mencoba melangkah dalam kompiler pergi ke kode assembly dan ditampilkan UIImageView+TVASTAFNetworkingsebagai nama kategori yang tidak ada di mana pun di basis kode.

masukkan deskripsi gambar di sini

Menggunakan Xcode 7. iOS 9 & 8. Cocoapods (tanpa Kerangka)

PEMBARUAN Saya lupa menyebutkan bahwa Pengoptimal diatur untuk nonekonfigurasi rilis dan debug dan saya sebenarnya menggunakan Debugkonfigurasi.

masukkan deskripsi gambar di sini

PEMBARUAN 2

Strip Debug Symbols Tidak aktif juga.

Mojtaba
sumber
Saya ingat ada semacam opsi "Strip Debug Symbols". Itu mungkin akan menyebabkan masalah ini. Apakah ini mati?
NobodyNada
1
@NobodyNada Ya Strip Debug Symbolstidak aktif.
Mojtaba
Aneh Saya baru saja mencoba untuk mengaktifkan Strip Debug Symbol, dan peringatan itu menghilang 8- |
Gomino
@Mojtaba Hei, apakah Anda mencari tahu cara mengatasi masalah? Saya terjebak dengan masalah yang sama sejak diperbarui ke Xcode 7
Hadu
@Adu: Sayangnya Tidak
Mojtaba

Jawaban:

175

Jika proyek Anda menggunakan Swift, ada dua pengaturan "Level Optimasi" yang terpisah dalam konfigurasi proyek / target.

Pastikan Anda mengatur keduanya dengan benar:

  1. Pilih proyek Anda di panel Navigator Proyek
  2. Pilih pengaturan proyek Anda di bawah pohon "PROYEK"
  3. Klik tab "Bangun Pengaturan"
  4. Cari "Level Optimasi" dan Anda akan melihat dua pengaturan, satu untuk LLVM dan satu untuk cepat.
  5. Tetapkan pengaturan yang sesuai ( None [-O0]untuk LLVM dan None [-0none]untuk Swift) untuk konfigurasi build yang dimaksud.

dikompilasi dengan langkah optimasi mungkin berperilaku aneh mungkin tidak tersedia

Melakukan ini menyelesaikan peringatan itu untuk saya.

Albert Bori
sumber
1
Ada apa dengan proyek bahasa campuran ...?
Vive
Apa perbedaan antara LLVM & Swift? Apakah itu Swift adalah apa yang saya tulis dalam proyek dan LLVM adalah untuk apa pun yang saya lakukan dalam hal debugging di debugger yaitu hal-hal seperti po, p, expr...?
Sayang
124

Sepertinya proyek Anda dalam mode Rilis. Mode rilis mengkompilasi aplikasi dengan banyak optimisasi, tetapi para debugger membenci optimisasi, sehingga untuk debug aplikasi yang andal, Anda perlu mengubahnya ke mode Debug yang mengurangi optimisasi dan menambahkan banyak informasi debug. Untuk beralih ke mode Debug:

  • Klik skema Anda di sudut kiri atas Xcode.

Klik skema Anda di sudut kiri atas Xcode.

  • Pilih "Edit Skema ..."

Pilih "Edit Skema ..."

  • Klik pada dropdown "Build Configuration". dan ubah ke mode Debug.

Klik pada dropdown "Build Configuration".

NobodyNada
sumber
8
Saya menggunakan debug. dan yakin optimizer MATI.
Mojtaba
Ini menarik. Juga karena saya mengaturnya ke mode Rilis, beberapa breakpoints saya tidak tertabrak sementara yang lain tertabrak ¯_ (ツ) _ / ¯
Honey
60

Peringatan ini hanya muncul ketika Anda menekan breakpoint dan sumbernya ada dalam proyek di mana optimasi diaktifkan, mencegah Anda menonton nilai variabel nyata (setiap objek ditampilkan nihil, meskipun tidak)

Dalam kasus saya, itu hanya terjadi ketika debugging langkah demi langkah melalui ketergantungan cocoapod.

Jadi, bahkan jika Anda memiliki target utama dan pengaturan proyek yang Anda atur dengan benar (Strip Debug Symbol = OFF, dan Level Optimasi Tidak Ada), Anda perlu memastikan itu sama untuk proyek Pod tempat Anda memukul breakpoint.

masukkan deskripsi gambar di sini

Gomino
sumber
Baca jawaban lain, mereka menyarankan hal yang sama. tetapi mereka semua dalam proyek saya (alias None [-O0])
Mojtaba
2
Saya tahu Anda mengatakan itu tidak aktif di projet Anda, sama seperti di projet saya, tetapi apakah Anda melihat konfigurasi proyek dependensi Pod Anda?
Gomino
Masalah yang sama di sini dengan Xcode 7. Mungkin masalah muncul ketika saya mulai menggunakan perpustakaan trachkerbird. Tetapi breakpoint ada di dalam kode saya sendiri.
Mike
1
Untuk proyek Pods, ubah pengaturan level optimisasi "PROYEK" ke Tidak ada yang berfungsi. (tidak ada perubahan untuk target pod apa pun).
ooops
2
Ini salah. Itu akan ditimpa ketika Anda pod installlagi. Ubah seperti ini .
Iulian Onofrei
13

Ternyata setelah mengimpor proyek lama (Xcode 7.x +) ke Xcode 8.3 baru (8E162), mungkin karena optimisasi kompiler, Swift Compiler - Level Optimasi ditetapkan secara default ke Fast, Single-File Optimization :

Sebelum

Mengubahnya menjadi tidak ada, menyelesaikan masalah:

setelah

valvoline
sumber
Saya melakukannya. Tidak bekerja untukku. Saya menghadapi masalah ini di ios build yang dibuat oleh Unity.
Chandni
11

Editor-> Validate Settingslalu konfirmasikan semua perubahan. Maka Anda harus mendapatkanLevel Optimalisasi Kompiler Swift sudah tersedia

Setel Debug ke None.

james sa
sumber
1
Saya melakukannya. Tidak bekerja untukku. Saya menghadapi masalah ini di ios build yang dibuat oleh Unity.
Chandni
9

Ini solusi bagi saya ...

Di sepanjang baris jawaban gimino, jika Anda menggunakan cocoapods, tambahkan baris seperti ini ke Podfile:

xcodeproj 'MyProject', 'Debug - local'=>:debug, 'Debug - staging'=>:debug, 'Debug - PRODUCTION'=>:debug

atau untuk versi cocoapods> = 1.0 (terima kasih Diejmon)

project 'MyProject', 'Debug - local'=>:debug, 'Debug - staging'=>:debug, 'Debug - PRODUCTION'=>:debug

Di mana MyProject memiliki 'Debug - local', 'Debug - staging', 'Debug - PRODUCTION' sebagai konfigurasi debug selain dari standar 'Debug'

Secara default, cocoapods biasanya akan menghasilkan konfigurasi pod sebagai Release, baris Podfile ini memungkinkan Anda untuk mengatakan bahwa itu debug.

wils
sumber
9

Saya mengalami masalah yang sama hari ini, dan menemukan jawabannya (setidaknya dalam kasus saya). Saya juga menggunakan CocoaPods, dan saya mengalami masalah ini ketika menjalankan target pengujian saya (Swift bercampur dengan ObjC).

Saya menggunakan Xcode 7.2, dengan iOS 9.2 SDK.

Pada gambar di bawah ini, Anda dapat melihat optimasi untuk target dan proyek sebelum perubahan saya:

tingkat optimasi sebelum berubah

Hal yang mengejutkan adalah bahwa meskipun Optimization diselesaikan adalah None [O0] , hanya setelah mengubah pengaturan proyek dari Os ke O0 melakukan halte compiler mengoptimalkan target.

Di bawah ini Anda dapat melihat pengaturan terakhir saya:

tingkat optimasi setelah perubahan

André Neves
sumber
7

Sudah lama tapi saya akhirnya memecahkan masalah ini. Ada bendera optimasi ketiga LTOatau Link Time Optimizationdan Anehnya tidak ada yang menyebutkannya di sini dan karena alasan tertentu saya juga tidak memperhatikannya. Itu ada di sana di atasOptimization Level pengaturan seperti yang Anda lihat dalam banyak tangkapan layar yang diposting di sini.

Jadi untuk meringkasnya ada 3 flag optimasi yang berbeda yang ingin Anda matikan untuk debugging:

  • LLVM Link Time Optimization ( -flto)
  • Tingkat Optimasi LLVM (-O )
  • Tingkat Optimalisasi Kompiler Swift

masukkan deskripsi gambar di sini

Informasi lebih lanjut tentang KPP: http://llvm.org/docs/LinkTimeOptimization.html

Mojtaba
sumber
2
Saya melakukannya. Tidak bekerja untukku. Saya menghadapi masalah ini di ios build yang dibuat oleh Unity.
Chandni
@ Chandni, Di sini saya menghadapi masalah yang sama apakah Anda menemukan solusinya?
Ranjani
2

Jika Anda perlu menonaktifkan optimisasi untuk pod Swift Anda sehingga Anda dapat melakukan debug ke dalamnya, tambahkan berikut ini ke Podfile. Ini akan menonaktifkan optimisasi untuk debug build saja.

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      if config.name == "Debug"
        config.build_settings["SWIFT_OPTIMIZATION_LEVEL"] = "-Onone"
      end
    end
  end
end
Imam Al
sumber
1

Apakah Anda yakin konfigurasi debug Anda tidak mengoptimalkan kode (tidak seharusnya)? Sepertinya Anda tidak sengaja mengaktifkan optimasi untuk konfigurasi debug dan Anda harus mematikannya dari pengaturan target.

Dapat Poyrazoğlu
sumber
3
optimasi tidak aktif untuk semuanya. bahkan rilis build hanya untuk memastikan
Mojtaba
@Mojtba Tapi mode rilis mengaktifkan optimisasi!
NobodyNada
0

Kesalahan ini terjadi pada saya dua kali, dan dalam setiap kasus ada kesalahan dalam parameter URL yang digunakan untuk meminta layanan. Dalam satu kasus URL memiliki beberapa ruang di bagian port di kasus lain beberapa Nilai Opsional tidak dibuka.

Jadi perbaikannya adalah untuk memastikan url untuk permintaan terbentuk dengan baik. Informasi lebih lanjut tentang kasus saya, dan pelaporan serupa sama di sini .

le0diaz
sumber
0

Yang saya lakukan adalah Bersihkan ( Product > Clean) proyek saya dan jalankan lagi

raed
sumber
0

Ini mungkin penyederhanaan yang berlebihan, tetapi apakah Anda membuat rilis atau dengan optimasi (yang menghilangkan simbol dari Swift atau LLVM) terlalu tinggi? Jika demikian edit skema Anda dan alihkan ke Debug, atau edit Pengaturan Bangun Anda untuk optimasi cepat atau LLVM ke Tidak Ada (0).

Harun
sumber
0

Hanya dalam kasus seseorang menghadapi masalah ini saat men-debug pod yang menggunakan pustaka C secara internal, ada hal lain yang harus Anda ubah dalam pengaturan proyek untuk membuatnya bekerja selain semua yang lain yang tercantum dalam utas.

Buka pengaturan proyek Pods -> Target penggunaan-C Anda -> Bangun Pengaturan -> Apple Clang - Bendera Kompiler Kustom -> Bendera C lainnya dan hapus -O3bendera yang ada di sana.

Dmitry Serov
sumber