Xcode'da bir nesne dizesi özelliğine göre koşullu bir kesme noktası nasıl ayarlanır?


93

Belirli bir dize eşleşmesine ulaştığında hata ayıklayıcıyı kırabilmek istiyorum. Örnek olarak, şuna benzer bir şeye sahip olabilirim:

Foo myObj = [self gimmeObj];

myObjadlı bir mülk olabilir name. Hata ayıklayıcının atamada durmasını istiyorum

[myObj.name isEqualToString:@"Bar"];

Bunu yapmak için Xcode'da koşullu kesme noktamı nasıl ayarlayabilirim?

Yanıtlar:


184

Kesme noktasını normal şekilde ayarlayarak, Xcode'da koşullu bir kesme noktası ayarlayabilir, ardından kontrol tuşuna basarak tıklayabilir ve Kesme Noktasını Düzenle'yi seçebilirsiniz (Çalıştır -> Göster -> Kesme Noktaları'nı seçin).

Kesme noktası girişinde bir Koşul sütunu vardır.

Şimdi, bu durum için akılda tutulması gereken birkaç konu var. İlk olarak, gdb nokta sözdizimini anlamaz, bu nedenle myObj.name yerine [myObj name] kullanmanız gerekir (ad bir ivar değilse).

Daha sonra, gdb'deki çoğu ifadede olduğu gibi, ona dönüş sonucunun türünü yani "BOOL" adını söylemelisiniz. Öyleyse aşağıdaki gibi bir koşul belirleyin:

(BOOL)[[myObj name] isEqualToString:@"Bar"]

Genellikle, aşağıdakiler gibi geçici olarak kod ekleyerek bunu yalnızca kodda yapmak daha kolaydır:

if ( [myObj.name isEqualToString:@"Bar"] ) {
    NSLog( @"here" );
}

ve sonra NSLog'da kırılma noktasını ayarlama. O zaman, gdb'nin neyi ayrıştırıp ayrıştıramayacağı konusunda endişelenmenize gerek kalmadan durumunuz keyfi olarak karmaşık olabilir.


12
Bunun dışında, kodunuzu değiştirirseniz, günlüğe kaydetme veya davranışınızı değiştirmeyi
unutabilirsiniz

3
Bu doğru. Bunu genellikle dizeye "NYI" (Henüz Uygulanmadı) ekleyerek hafifletiyorum ve ardından NYI için yayın öncesi kontrol aramam onu ​​yakalayacaktır.
Peter N Lewis

18
Bu çalışmayı sağlamak için (bool) büyük harf olarak (BOOL) yapmak zorunda kaldım, muhtemelen bir LLDB şeyi.
Wex

1
bool GDB'de benim için işe yaramadı, BOOL veya int kullanmak zorunda kaldım - fark burada stackoverflow.com/a/544250/725871'de açıklanmaktadır .
Chaosphere2112

2
Sonunda ortaya çıkan her 200 oyunda bir hatanız varsa bunu koda koyamazsınız ve şimdi bir koşullu kesme noktası yapmanız gerekir. Kodu değiştirmek için programı durdurmak bir seçenek değildir.
Almo

21

XCode lldb koşullu kesme noktalarını nasıl kullanacağınız aşağıda açıklanmıştır.

İlk olarak, kesme noktasına çift tıklayın (veya sağ tıklayın edit breakpoint), bir iletişim kutusu açılır penceresi görebilirsiniz.

görüntü açıklamasını buraya girin

İşte bu seçeneğin anlamı:

  1. Koşul : Kesme noktası yalnızca bu koşulda tetiklenir.
  2. Yoksay : Kesme noktasını ateşlemeden önce koşulun kaç kez karşılaması gerektiği
  3. Eylem : Kesme noktası kesildikten sonra çalışan eylem.
  4. Seçenekler : Eylemleri değerlendirdikten sonra otomatik olarak devam et

İşte bir özet. Yukarıdaki resimdeki örnek için, değişken buildingId13'e eşit olduğunda burada kırılacağı anlamına gelir . 1'e yok sayma süresini eklersem, buildingId13'e eşit olduğunda ilk seferde yoksayar ve koşul karşılandığında ikinci seferde kırılır.

Eylemler için, eylem ekle'ye bastığınızda, bir seçim listesi olacaktır. Genellikle yaptığım şey, Debugger Command pokontrol etmem gereken değişkenleri yazdırmak için kullanmaktır ve eylemleri kullanmanın benden daha iyi yolları olduğuna inanıyorum.

Çalışma zamanında koşulları değiştirirseniz uygulamayı yeniden derlemeniz ve çalıştırmanız gerekiyor gibi görünüyor.


Muhtemelen soru bir dize değerine dayalı olarak kesme noktasında durmakla ilgiliydi [aşağı oy veren ben değildim]
ZS

1
Teşekkürler, oldukça yardımcı oldu. Bu cevap daha fazla oyu hak ediyor.
andreskwan

7

Bunun işe yarayıp yaramayacağından emin değilim, ancak bu kod satırında bir kesme noktası ayarlamayı deneyebilir, hata ayıklayıcı konsolunu (Cmd + Shift + R) açıp şunu yazabilirsiniz:

condition N (int)[[myObj name] isEqualToString:@"Bar"]

N, kesme noktasının sayısıyla (bir tam sayı) değiştirilir.


2

Ayarlayıcıyı kullanarak myObj.name'yi değiştirirseniz, Xcode'da -[MyObjClass setName:]Hata Ayıklayıcı Konsolundan veya Çalıştır-> Kesme Noktalarını Yönet- > Sembolik Kesme Noktası Ekle menüsünden sembolik bir kesme noktası ekleyebilirsiniz . Değilse (neden olmasın? Örnek değişkenini, atanmış başlatıcı veya serbest bırakma dışında doğrudan değiştirmemelisiniz) gdb'de bir izleme noktası ayarlayabilirsiniz (hata ayıklayıcı çalıştıktan sonra Xcode'daki Hata Ayıklayıcı Konsolunu kullanın). Bu sayfa nasıl yapılacağını açıklıyor. Xcode'un Hata Ayıklayıcı Konsolu'nu kullanmadan izleme noktaları ayarlamak için bir kullanıcı arabirimi sunduğuna inanmıyorum.


0

Zaman zaman Çerçevelerle (hata ayıklama yapıları) çalışırken ve gezinmesi zor olan veya geliştirme aşamasında çerçeve içinde herkese açık olmayan belirli bir dosya / konuma bir kesme noktası koymanız gerekir. Seçeneklerden biri, koşullu kesme noktalarını tetiklemek ve adım adım / dışarı adım atmayı kolaylaştırmak için bir yardımcı sınıf yazmaktır.

- (void)invokeFrameworkMethod {
    ...
    [DebugConditionalBreakPointHelper breakPointCondition:YES comment:@"from invokeFrameworkMethod."];
    ...
}

Geliştirme aşamasındaki çerçevede başlık beyanı.

#import <Foundation/Foundation.h>

@interface DebugConditionalBreakPointHelper : NSObject
+ (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment;
@end

Ve uygulama dosyası:

#import "DebugConditionalBreakPointHelper.h"

@implementation DebugConditionalBreakPointHelper
+ (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment {
    if (enabled)
    {
        NSLog(@"Triggerred Conditional Break Point. Comment: %@");
    }
}
@end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.