2011-02-07 15 views
7

Hata kodunu açma Xcode ile basit bir lanet projeyi derlemeye çalışıyorum.
Program, flag -lcurses ile terminalde g ++ ile derler ve iyi çalışır.
Xcode ve Curses.h, Terminal

C++ ile bir Komut Satırı Aracı oluşturarak başladı.
curses.h dosyasını ana sayfama aktardı.
Hedef "program" Bilgi -> Genel -> Bağlantılı Kitaplıklar'da, libCurses.dylib eklenmiştir.

Çok iyi derler ancak terminal penceresi açılmayacaktır.
Hata Ayıklama Konsolu'nda, çıktı,

Program yüklendi.
run
[İşlem 3424'e geçiş]
Terminal açılırken hata: bilinmiyor.
Çalışıyor…

Klasör oluşturmaya ve yalnızca terminalde programı açmaya gidebilirim fakat terminali açmak için xcode'un herhangi bir yolu var mı?

Yardımlarınız için teşekkürler!

cevap

4

Xcode IDE'ye eklenecek terminal yoktur. Eğer (sadece gdb olduğunu) IDE ayıklayıcısını sen sürecine ekleyebilir kullanmak istiyorsanız yerine

./build/Debug/myprogram 

(Terminal uygulaması üzerinden) bir kabuk programı çalıştırın. Mac OS X geliştirme

Açık Gruplar & yılında Executables grup Dosyalar listesi: Yumruk daha uygun bir yöntemle, Xcode içine Adım teklif edeceğiz İçin

gdb> attach mypid 

, süreç kimliği almak Uygulamayı seçin, bir Bilgi penceresi açın ve Hata Ayıklama sekmesinde açın, hata ayıklayıcısını başlattıktan sonra Başlat Yürütme işlevini kaldırın. Hata ayıklamaya hazır olduğunuzda, hata ayıklayıcısını başlatın ve ardından hedef uygulamasına dostu ortamında başlatın. Hata ayıklayıcının gdb konsolunda, ek programım ve yazın hata ayıklama oturumunuz devam ediyor.

7

Xcode'ta ncurses hata ayıklamasıyla aynı sorunu yaşadım. Sonunda ncurses hata ayıklama sağlayan Terminal.app ile hata ayıklamayı yönetmek için iyi bir yol buldum.

Bildiğimiz üzere, ncurses'ı başlatmak ve kullanmak için başvurumuzu terminalde çalıştırmamız gerekiyor. Fakat Xcode, çalıştırma düğmesine bastığımızda terminal açmıyor. Bu nedenle, ortamdaki değişken TERM kodunu koddan talep edersek, NULL alırız. Bu nedenle uygulama initscr() üzerinde çöküyor.

Ancak Xcode, Çalıştır şeması için Başlat seçeneğini ayarlamanızı sağlar (Ürün> Şema> Şemayı düzenle ..."Çalıştırmak için çalıştırılabilir" yerine "Otomatik olarak başlatılır" yerine: " Changing Launch option for Run scheme

Şimdi Xcode'ta Çalıştır'a basabilir ve uygulamanızı Terminal'de el ile başlattıktan sonra basabilirsiniz. Böylece, hata ayıklayıcı uygulamaya eklenir. o 2 sorunlar vardır: dürüst derseniz

  1. , ayıklayıcı ek eylemler olmadan kendini bağlı olmayacak ve tüm kesme noktaları atlar. Ancak, programımızın başlangıcında getchar() öğesini arayarak yönetebiliriz. Yani

    for (int argi = 1; argi < argc; argi++) 
    { 
        if (strcmp(argv[argi], "--debug-in-terminal") == 0) 
        { 
         printf("Debugging in terminal enabled\n"); 
         getchar(); // Without this call debugging will be skipped 
         break; 
        } 
    } 
    

    , biz (getchar açabilirsiniz) biz

  2. Terminal.app

    içeride Biz hata ayıklamak istediğinizde sadece çağrı: Bence terminalde hata ayıklama gösterir komut satırı argümanı tanıtarak bu sorunu çözdü Terminali açmalı ve Xcode'ta Çalıştır tuşuna bastığımızda uygulamayı manuel olarak başlatmalıyız. Bu gerçekten sinir bozucu. Bu yüzden, Run şeması ayarlarındaki Ön İşlemler aracılığıyla otomatikleştirmeye karar verdim. Fikir Terminali açmak ve bizim uygulamada çalıştırmaktır. Ancak bu ön-eylem, XBox'un, önce "Yürütülebilir programın başlatılmasını beklemek" için Çalıştır eylemini yürütmesinden sonra uygulamayı başlatmalıdır. Bu nedenle gecikme ile arka plan engelleme olmayan bir göreve ihtiyacımız var. Bu kabuk komutu takip ederek elde edilebilir (sonunda & arka planda çalıştırmak için gerekli):

    osascript -e 'tell application "Terminal"' -e 'delay 0.5' -e "set currentTab to do script (\"$TARGET_BUILD_DIR/$PRODUCT_NAME --debug-in-terminal\")" -e 'end tell' & 
    

    erişilebilir önemli çevre değişkenleri yapmak için listeden "inşa ayarlarını sağlayın" daki uygulamayı seçmek unutmayın $ TARGET_BUILD_DIR ve $ PRODUCT_NAME: Provide build settings from

    biz Çalıştır bastığınızda Yani, şimdi, Xcode takmak için yürütülebilir bekleyecek Terminal açılacak ve bizim uygulama ile yürütülecek komut satırı seçeneği --debug-in-terminali ve tüm kesme noktaları tetiklenecektir.

    Çok hoş, ancak her bir hata ayıklama oturumu için yeni bir tane oluşturacağından bu Terminal penceresini sonlandırmak daha da iyi olacaktır. en Çalıştır şeması için Sonrası eylemler yapalım:

    osascript -e 'activate application "Terminal"' -e 'delay 0.5' -e 'tell application "System Events"' -e 'tell process "Terminal"' -e 'keystroke "w" using {command down}' -e 'end tell' -e 'end tell' 
    

    enter image description here

    Bu komut sadece bazı başka amaçlar için terminali kullanmayı düşünüyorsanız belki bu Sonrası eylem gerekli değildir aktif terminal penceresi kapanıyor hata ayıklama sırasında, bazı önemli pencereleri yanlışlıkla kapatabilirsiniz.

Ve son olarak, ncurses veya hiç kullanabilirsiniz eğer denetler güvenli ncurses'in kod bir fikir,:

#include <stdlib.h> 
#include <string.h> 
#include <ncurses.h> 


bool IsTerminalAvailable = false; // Check this global variable before ncurses calls 


int main(int argc, const char *argv[]) 
{ 
    for (int argi = 1; argi < argc; argi++) 
    { 
     if (strcmp(argv[argi], "--debug-in-terminal") == 0) 
     { 
      printf("Debugging in terminal enabled\n"); 
      getchar(); // Without this call debugging will be skipped 
      break; 
     } 
    } 

    char *term = getenv("TERM"); 

    IsTerminalAvailable = (term != NULL); 

    if (IsTerminalAvailable) 
     IsTerminalAvailable = (initscr() != NULL); 

    // Do some code here.... 

    if (IsTerminalAvailable) 
    { 
     printw("Press any key to exit..."); 
     refresh(); 

     getch(); 

     endwin(); 
    } 

    return 0; 
} 
2

XCode 8'de Terminalde içinde yayınlamayı seçebilirsiniz Düzenleme Teşvik Sisteminden, ... Seçenekler sayfası. XCode 8 screenshot

Her ne kadar hızlı testlerimde olsa da, o kadar iyi çalışmıyor gibi görünüyor; bazen (her zaman değil) hata ayıklayıcısını 'kaybeder' gibi görünür veya hata ayıklayıcısı hiçbir zaman başlamaz ve hala çalışmakta olduğunu düşünür. Çıkmaya çalışırsanız, Xcode sıkışır. lldb-rpc-server isimli bir işlemi bulup öldürdüğünüzde zorla çıkmak zorunda kalmamanız gerektiğini öğrendim.Daha ayrıntılı olarak

Bir Terminal açın ve 12345 o ps işlem kimliğini o zaman

ps x | grep lldb 

kill 12345 

yazın debuggee başlatmak için başarısız olduğunda (durumunda bu kimseyi yardımcı olur) bana verir.

+0

Güzel bul. Aynı sorun vardı - aslında çalışmıyor, ancak üzerinde çalıştıklarını bilmek için temiz. Ayrıca, bir şey yapamadıktan sonra bahsettiğiniz gibi süreci de öldürmek zorunda kaldı. – aardvarkk

+0

Sadece bana değil sevindim. Süreyi% 20 oranında öldürmem gerekiyor. 'Çalışmak' olduğunda bile, hata ayıklayıcı sıklıkla beklemediğim sinyalleri (çoğunlukla SIGSTOP) tetikler. XCode 9 için bekliyoruz (!) –