2012-04-17 28 views
14

Robię rozwój gier iOS za pomocą struktury cocos2d, a ja ogromnie zazdroszczę tym programistom Eclipse Java, że ​​wymieniają ich kod podczas debugowania aplikacji (tj. Zmieniają wartości zmiennych w metodzie i aktualizują program na bieżąco jako gdybyś miał REPL bez konieczności ponownej kompilacji).Hot Code Zamiana w Xcode?

To wydaje się być czymś, co byłoby absolutnie niesamowicie pomocne, jeśli chodzi o rozwój iOS, gdzie moim środowiskiem programistycznym jest (oczywiście) Xcode i język, w którym programuję, to Cel C. Przeszukałem go, ale nie byłem w stanie znaleźć coś - więc pomyślałem, że zapytam społeczność.

Czy ktoś wie, czy istnieje sposób na Hot Swap kodu w Xcode podczas programowania w Celu C?

Z góry dziękuję

+1

Xcode użyte do tego, ale IIRC to było powolne i zawodne, a ludzie po prostu nie korzystać z niego, więc Jabłko zabity funkcję skupić się na tylko co debugger lepiej. – Chuck

+0

To wstyd, czy znasz jakieś funkcje debugowania, które zapewniają podobną/równoważną funkcjonalność? Próbuję zmniejszyć liczbę zmian zmiennej i odbudować ją, aby sprawdzić, czy jest to właściwa liczba (gra jest dużo prób i błędów). – Salman

+0

Jeśli jest w zmiennej, możesz po prostu edytować jej wartość w debugger. –

Odpowiedz

11

Niemożliwe z obecnymi narzędziami.

Należy pamiętać, że aplikacje na iOS są podpisane - zmiana pojedynczego bajtu spowoduje rezygnację z całości. Można sobie wyobrazić, że działa on przy pomocy środowiska uruchomieniowego do dynamicznego dodawania i usuwania metod. Ale to z pewnością wymagałoby dodania dodatkowych elementów do obsługi tego urządzenia, i to jest coś, co złośliwe oprogramowanie może z łatwością wykorzystać. Więc prawdopodobnie nie jest to funkcja, którą wkrótce zobaczysz.

Przy okazji, wersje Xcode 1.x-3.x miały funkcję "Napraw i kontynuuj". Można edytować w trakcie debugowania, użyj polecenia Napraw i Kontynuuj i kontynuuj uruchamianie zaktualizowanego kodu. Sądzę, że w pewnym momencie został on usunięty, być może z powodu jakiejś kombinacji: wymaganie, aby twój projekt był skonfigurowany tak, aby używał "zerowego łącza" i być może innych rzeczy; jest mniej niż całkowicie wiarygodny; prawdopodobnie nie obsługuje iOS; przejście na llvm; inne zmiany w Xcode 4. Może kiedyś wróci - jeśli chcesz, zgłoś błąd - ale znowu, myślę, że wspieranie go na iOS byłoby wyzwaniem.

+0

Ta odpowiedź wydaje się być nieaktualna. @ bartosz-hernas [odpowiedź] (http://stackoverflow.com/a/16463529/273628) zwrócił mi uwagę na to, co wydaje się być rozwiązaniem kompatybilnym z XCode 7.1: [InjectionPlugin] (https://github.com/johnno1962/injectionforxcode). – ajh158

6

Jeśli mówisz tylko o zmianie wartości zmiennych, możesz to osiągnąć ukradkiem poprzez lldb (lub, przypuszczalnie) gdb. Przypuśćmy, że miałeś:

- (void)uselessMethod 
{ 
    NSString *localString = @"I'm some local text"; 

    NSLog(@"%@", localString); 
} 

I umieścić punkt przerwania na NSLog, w tym momencie można zadać lldb ocenić zmiany przeznaczenia localString jako sposobu jej wykonywania. Na przykład.

po localString = @"Hat" 

Jeśli pozwolisz kontynuować wykonywanie programu, powinieneś zauważyć, że przeniesienie zostało zablokowane. Podobnie możesz wywołać dowolną metodę lub wykonać dowolne inne zadanie.

Właśnie przetestowałem to przeciwko Xcode 4.3.2.

+0

Więc to, co mówisz, jest możliwe w terminalu xCode (jeśli użyję lldb jako kompilatora - obecnie używałem GDB, ale tylko dlatego, że to było domyślne), ale wymagałoby to 1) punktu przerwania, który należy ustawić, i 2) polecenia wprowadzone do terminalu, które, jeśli rozwiązałyby problem, musiałyby zostać ręcznie przeniesione do rzeczywistego kodu. Czy rozumiem to poprawnie? – Salman

+0

Rozumiałem, że pytasz tylko o zmianę wartości zmiennych i zakładam, że gdb działa tak samo jak lldb pod tym względem. W przeciwnym razie myślę, że masz rację; nie możesz edytować i kontynuować (zgodnie z terminologią Microsoft, aby upewnić się, że zrozumiałem to pytanie), o ile wiem. – Tommy

13

Istnieje świetna wtyczka, która pozwala na zmianę kodu na żywo, działająca aplikacja. Nazywa się InjectionPlugin.

FAQ Jak mówi:

Jak to działa? Środowisko wykonawcze Objective-C umożliwia ładowanie nowej wersji klasy do aplikacji przy użyciu pakietu, nawet jeśli istnieje już implementacja powiązana z aplikacją. Swizzling jest używany, gdy pakiet jest ładowany, aby przełączyć istniejącą klasę na metody nowej implementacji. Można to zrobić wielokrotnie i działa w aplikacjach OSX i iOS oraz na urządzeniach iOS.

zrobiłem jakiś mały film, który pokazuje jak zainstalować i używać tej wtyczki http://nomtek.com/developers/how-to-install-and-use-injection-plugin-for-xcode/

nadzieję, że to pomaga!

+0

Niestety nie działa na urządzeniu z Xcode 5. – openfrog

1

Można gorąco zamienić wartość zmiennej w Xcode przez:

expression <variable> = <value>;.

Przez punkt przerwania w miejscu, w którym chcesz zmienić wartość i wykonanie polecenia w konsoli Xcode.

Przykład:

// Messages From Console 
(lldb) expression graphFlag = @"X"; // Update variable value 
(__NSCFConstantString *) $0 = 0x36f95718 @"X" // Xcode prints the updated value 
(lldb) expression graphFlag; // Printing value through expression command 
(__NSCFConstantString *) $1 = 0x36f95718 @"X" // Hot Swapped variable value