2015-10-16 34 views
10

çalıştırılıyor eğer IOS uygulama XCode dan (simülatörü ya da bağlı bir cihaz üzerinde) doğrudan çalışacak olup olmadığını programlı belirlemek istiyoruz algılar. Ben -D DEBUG çözüm here tarif denedim ama sonra Xcode bağlantısını kesmek ve uygulamayı yeniden çalıştırdığınızda, hala onu hata ayıklama modunda olduğunu düşünür. ben ne arıyorum Sadece C fonksiyonunu tutmak ve Swift dan diyebiliriz this functionSwift uygulama Xcode

#include <assert.h> 
#include <stdbool.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <sys/sysctl.h> 

static bool AmIBeingDebugged(void) 
    // Returns true if the current process is being debugged (either 
    // running under the debugger or has a debugger attached post facto). 
{ 
    int     junk; 
    int     mib[4]; 
    struct kinfo_proc info; 
    size_t    size; 

    // Initialize the flags so that, if sysctl fails for some bizarre 
    // reason, we get a predictable result. 

    info.kp_proc.p_flag = 0; 

    // Initialize mib, which tells sysctl the info we want, in this case 
    // we're looking for information about a specific process ID. 

    mib[0] = CTL_KERN; 
    mib[1] = KERN_PROC; 
    mib[2] = KERN_PROC_PID; 
    mib[3] = getpid(); 

    // Call sysctl. 
    size = sizeof(info); 
    junk = sysctl(mib, sizeof(mib)/sizeof(*mib), &info, &size, NULL, 0); 
    assert(junk == 0); 

    // We're being debugged if the P_TRACED flag is set. 
    return ((info.kp_proc.p_flag & P_TRACED) != 0); 
} 
+1

Arayabilirsiniz C fonksiyonları Swift'den, onu gerçekten çevirmene gerek yok. –

+0

Martin, bu benim koyduğum cevaptı, bir cevap olarak yerleştirdim ve bunu kabul ediyorum. – Knight0fDragon

+0

Kodu, Swift'e (eğlenmek için) dönüştürmek için hızlı, denenmemiş bir girişim: https://gist.github.com/getaaron/8d48489274a873835636. Şu an bununla oynamak için zamanım yok, ama belki başlaman gerekecek. –

cevap

33

bir Swift versiyonu olduğunu düşünüyorum. How to call Objective-C code from Swift'da verilen tarifler, saf C kodu için de geçerlidir. Dolayısıyla,

  • kinfo_proc() sıfıra ayarlanmış tüm alanları ile tam başlatılmış yapıyı oluşturur:

    func amIBeingDebugged() -> Bool { 
    
        var info = kinfo_proc() 
        var mib : [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()] 
        var size = strideofValue(info) 
        let junk = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0) 
        assert(junk == 0, "sysctl failed") 
        return (info.kp_proc.p_flag & P_TRACED) != 0 
    } 
    

    Açıklamalar:

    Ama Swift bu kodu çevirmek için aslında çok karmaşık değil info.kp_proc.p_flag = 0 ayarı gerekli değildir.

  • int tip Int32 Swift olmasıdır. C kodundan
  • sizeof(info), yapı dolgusunu eklemek için Swift'de strideOfValue(info) olmalıdır. sizeofValue(info) ile yukarıdaki kod Simülatörde 64-bit cihazlar için her zaman yanlış olarak döndürülür. Bu anlamaya en zor kısmıydı. Swift 3

Güncelleme (Xcode 8): onlar MemoryLayout yerini almış

strideofValue ve ilgili işlevler artık yok, :

func amIBeingDebugged() -> Bool { 

    var info = kinfo_proc() 
    var mib : [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()] 
    var size = MemoryLayout<kinfo_proc>.stride 
    let junk = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0) 
    assert(junk == 0, "sysctl failed") 
    return (info.kp_proc.p_flag & P_TRACED) != 0 
} 
+2

strideOfValue' ile güzel bul. Farkı bilmiyordum. –

+0

Hey Martin, hata ayıklayıcısını algılamak için Xcode 8 çözümünüzün Obj-C sürümünü sağlayabilir misiniz? Apple’dan sağlanan, artık düzgün çalışmıyor gibi görünüyor. Teşekkür ederim! :-) –

+0

@HansKnoechel: Sorudaki kod, saf C ve sorun olmadan Objective-C'den kullanılabilir. Nasıl "düzgün çalışıyor" değil? –

İlgili konular