iOS crash log catch, debug info.. Złap i wyślij e-mail do zespołu deweloperów

Ostatnio natknęliśmy się na sytuację, w której chcieliśmy zobaczyć informacje o debugowaniu z aplikacji, które użytkownik ma na swoim urządzeniu. Tak więc, to, czego szukam, to sposób, aby znaleźć dziennik na urządzeniu, wkleić go jako tekst inline na poczcie i umożliwić użytkownikowi wysłanie go..

Jakieś pomysły? Oto pytania ponownie.. 1) Znajdź dziennik debugowania na urządzeniu 2) Otwórz plik i załącz zawartość pliku jako tekst w linii do wiadomości e-mail. 3) Pozwól użytkownikowi wysłać go e-mailem następnym razem starty..

Dzięki,

Author: Mobilewits, 2011-11-23

9 answers

Dzięki za wszystkie wejścia chłopaki.. Połączyłem Twoje rozwiązania w takie, które rozwiążą mój problem.. Oto, co zrobiłem.. Na pewno nie skompilowałem kodu, jest to na wpół upieczony kod.. ale wkrótce go wyprasuję, ponieważ zaimplementuję go w moim kodzie..

NSLog do pliku Jak nslog do pliku LOG2FILE

#if TARGET_IPHONE_SIMULATOR == 0    
    NSArray *paths =  
    NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);        
    NSString *documentsDirectory = [paths objectAtIndex:0];    
    NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"];    
    freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
#endif

Złap awarię i zaloguj je również do pliku

Najpierw Utwórz funkcję, która obsłuży błąd i wyświetli go na konsola (jak i cokolwiek innego chcesz z nią zrobić):

void uncaughtExceptionHandler(NSException *exception) {    
    NSLog(@"CRASH: %@", exception);      
    NSLog(@"Stack Trace: %@", [exception callStackSymbols]);    
    // Internal error reporting
}

Następnie dodaj obsługę wyjątków do delegata aplikacji:

-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:  
(NSDictionary*)launchOptions
{   
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);    // Normal launch stuff
}

Ustaw zmienną w info.plist wywołał awarię, a następnie odczytał/zapisał w ten sposób

- (void)readPlist
 {
      NSString *localizedPath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"];        
      NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:localizedPath];

    NSString *crashed;
    crashed = [plistDict objectForKey:@"Crashed"];
}


- (void)writeToPlist
{
    NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];

    [plistDict setValue:@"YES" forKey:@"Crashed"];
    [plistDict writeToFile:filePath atomically: YES];
}

Po uruchomieniu aplikacji Przeczytaj informacje.plist i poproś użytkownika o przesłanie dzienników awarii..

{
    MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
    mailComposer.mailComposeDelegate = self;[mailComposer setSubject:@"Crash Log"];
    // Set up recipients
    NSArray *toRecipients = [NSArray arrayWithObject:@"[email protected]"]; 
    [mailComposer setToRecipients:toRecipients];
    // Attach the Crash Log..
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"];
    NSData *myData = [NSData dataWithContentsOfFile:logPath];
    [mailComposer addAttachmentData:myData mimeType:@"Text/XML" fileName:@"Console.log"];
    // Fill out the email body text
    NSString *emailBody = @"Crash Log";
    [mailComposer setMessageBody:emailBody isHTML:NO];
    [self presentModalViewController:mailComposer animated:YES];
}
 62
Author: Mobilewits,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-30 14:52:08
  1. Do rejestrowania własnych danych użyj Cocoalumberjack . Jest znacznie szybszy niż NSLog i można go dynamicznie włączać/wyłączać. Zapewnia również opcje zapisywania danych do pliku. NSLog spowolni Twoją aplikację i wypełni dziennik konsoli. Ponadto nie chcesz logować zbyt dużo w ogóle. Nie można bezpiecznie rejestrować, gdy dojdzie do awarii. Więc raczej jak już zorientujesz się, gdzie jest problem, dodaj tam więcej logowania i spróbuj go odtworzyć, np. za pomocą automatycznego testowania frameworków jak KIF .

  2. Do przechwytywania raportu o awarii nie powinno być nic innego jak rozwiązanie oparte na frameworku open source PLCrashReporter , które może bezpiecznie przechwytywać awarie, również wtedy, gdy aplikacja jest już w app store! Wyłapywanie WYJĄTKÓW sugerowanych przez innych nie jest zalecane, sprawdź Ten artykuł aby zobaczyć dlaczego!

    ITunes Connect oferuje również przeglądanie raportów o awariach, ale przeglądanie niektórych zajmuje do 2 tygodni, ale zdecydowanie nie wszystko jak np. wskazał aparat + Programiści . Więc lepiej użyj własnego rozwiązania.

    PLCrashReporter wyśle Ci standardowe raporty o awariach sformatowanych przez apple, gotowe do symbolizacji, abyś wiedział, gdzie w kodzie występuje awaria, w tym numery linii.

    Niektóre rozwiązania oparte na PLCrashReporter to:

    • QuincyKit : Klient Open Source + serwer php, podstawowe grupowanie awarii, symbolika może być zautomatyzowana z komputera mac (jestem twórcą this)
    • [32]} HockeyApp : płatna usługa, korzysta z Klienta QuincyKit, zaawansowane grupowanie awarii, symbolika w pełni wykonana na serwerze (jestem na deweloperów tego)
    • Bugsense : darmowy serwis, bez symboliki
    • AppBlade: bezpłatna usługa, jeśli jest używana z 25 urządzeniami lub mniej, bez symboliki
    • Crashlytics : prywatna beta, nieznane funkcje, ich rozwiązanie wydaje się być oparte na PLCrashReporter
  3. Proponowane rozwiązania umożliwiają wysyłanie danych automatycznie przy następnym uruchomieniu lub pytając użytkownika, czy zgadza się na wysyłanie.

 47
Author: Kerni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-06 23:47:34

Do logowania i analizy w ramach Swift możesz użyć SwiftyBeaver, jest to w pełni funkcjonalna platforma rejestrująca, w tym open-source Swift 2 & Objective-C Framework, szyfrowana pamięć w chmurze i aplikacja Mac App.

Strona WWW: https://swiftybeaver.com

Framework (wsparcie): https://github.com/SwiftyBeaver/SwiftyBeaver

Zastrzeżenie: jestem założycielem.

 5
Author: Sebastian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-04 10:57:38

Jest to rozwiązanie, które wykrywa awarie w miarę ich występowania, daje więcej czytelnych dla człowieka informacji o kodzie niż dziennik awarii. Będzie brakować części Dziennika awarii, ale jak mówi Till, powinieneś mieć dostęp do nich i tak.

Z innego więc pytanie o Xcode 4.2 zawsze wraca do main po awarii. Odpowiedź tam używa tej metody i można ją rozszerzyć, aby śledzić awarie.

Zaimplementuj własną obsługę wyjątków w AppDelegate

// on load
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);

void uncaughtExceptionHandler(NSException *exception) {
    NSLog(@"CRASH: %@", exception);
    NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
    // Internal error reporting
}

UPDATE Tak. niektóre backtracking i to rozwiązanie zostało zaproponowane przez Zane Claesa na pytanie Xcode 4.2 debug nie symbolizuje wywołania stosu

W drugim komentarzu proponuje ogólne rozwiązanie. "Uważam, że przydatne jest zapisanie dziennika awarii do pliku i poproszenie użytkownika o przesłanie go przy następnym uruchomieniu(tylko w trybie release, aby nie przeszkadzać w debugowaniu). To pozwala mi uzyskać świetne raporty o błędach... a użytkownicy wiedzą, że ich problem jest rozwiązywany" rozumiem, że nie każdy by chciałbym zapytać o to użytkownika, ale są super użytkownicy, którzy chętnie pomogą.

Możesz oczywiście włączyć przycisk nigdy nie pokazuj mi tego monitu ponownie, aby ludzie nie byli sfrustrowani mechanizmem raportowania.

Alternatywnie, Możesz skontaktować się z serwerem z informacjami (Nie wiem, czy będzie działać, ponieważ się zawiesza, ale zapisz go i od czasu do czasu spróbuj opublikować na serwerze ze szczegółami)

 4
Author: Jesse Black,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:42

Używam Crittercism aby zautomatyzować to dla mnie. Działa również do testowania i produkcji.

 3
Author: Jeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-23 09:45:21

BugSense zapewnia usługi raportowania awarii dla iOS. Oprócz zapewnienia w pełni symbolicznego śledzenia stosu, BugSense zapewnia analizę awarii we wszystkich aplikacjach.

Myślę, że jest to lepsze niż e-mail, ponieważ gdy aplikacja staje się popularna, będziesz musiał zarządzać wszystkimi tymi e-mailami ręcznie, podczas gdy BugSense robi to automatycznie. Jednak BugSense jest również open-source, więc możesz modyfikować jego wewnętrzne wersje w dowolny sposób i dodawać dodatkowe funkcje.

Oprócz tego, możesz nam pracować dla Ciebie za darmo: jeśli masz pomysł na fajną nową funkcję, którą chcesz, abyśmy mieli, zrobimy to-pod warunkiem, że uważamy, że jest to fajne, zbyt.

Zastrzeżenie: piszę kod dla BugSense-iOS.ramy.

 1
Author: Nick Toumpelis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-15 18:26:08

Jeśli używasz TestFlight z ich SDK jest to zautomatyzowane. To naprawdę fajny system. Jednak tylko dla wersji testowych.

Https://testflightapp.com/sdk/

 0
Author: TomSwift,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-22 20:33:48

Zobacz odpowiedź Ryana w Jak wyświetlić oświadczenie NSLog z iphone ' a .app file Dla bezpłatnego narzędzia dostarczonego przez Apple.

Ale to wciąż nie jest wygodne rozwiązanie. Jeśli możesz sobie pozwolić na nową kompilację, powinieneś zmienić rejestrowanie w aplikacji. Jano ma kilka bardzo dobrych pomysłów na ten temat w Jak Nslogować do pliku . Szczególnie opcja 2 powinna obejść się bez zbytniego wysiłku.

Ogólnie polecam ukrycie rodzimych urządzeń rejestrujących za fasadą lub podobnym projektem tylko na początku projektu, niezależnie od tego, jaki język programowania jest używany.

 0
Author: Kay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:14

Użyłem poniższego kodu do przechwytywania logów debugowania - Swift 4.1

var paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentsDirectory = paths[0]
let fileName = "Logfile.txt"
let logFilePath = (documentsDirectory as NSString).appendingPathComponent(fileName)
freopen(logFilePath.cString(using: String.Encoding.ascii)!, "a+", stderr)
 0
Author: Prashant Gaikwad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-20 12:23:52