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,
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];
}
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
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 .
-
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
Proponowane rozwiązania umożliwiają wysyłanie danych automatycznie przy następnym uruchomieniu lub pytając użytkownika, czy zgadza się na wysyłanie.
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.
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)
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.
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.
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.
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.
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)
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