了解 Fabrics 的崩溃日志

Posted

技术标签:

【中文标题】了解 Fabrics 的崩溃日志【英文标题】:Understand a crashlog from Fabrics 【发布时间】:2017-08-16 10:20:23 【问题描述】:

我已将 crashlytics 集成到我的 ios 应用中。我得到了这样的崩溃日志

# Issue #: 1
# Issue ID: 59940bb4be077a4dcc2837ff
# Session ID: 
e68dd53b640d4ac39f21b511a9f78b78_90910b25826211e7a25d56847afe9799_0_v2
# Date: 2017-08-16T06:30:00Z
# OS Version: 10.3.3 (14G60)
# Device: iPhone 6s
# RAM Free: 3.8%
# Disk Free: 15.2%

#0. Crashed: com.apple.main-thread
0  MY APP                         0x100086b50 specialized static Functions.retunDateStringFromDateString(dateString : String, inuputFormat : String, outPutFormat : String) -> String (Functions.swift:123)
1  MY APP                         0x1000ef820 specialized TeamAttendanceViewController.tableView(UITableView, cellForRowAt : IndexPath) -> UITableViewCell (Functions.swift)
2  MY APP                         0x1000eaa78 @objc TeamAttendanceViewController.tableView(UITableView, cellForRowAt : IndexPath) -> UITableViewCell (TeamAttendanceViewController.swift)
3  UIKit                          0x193641d90 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 688
4  UIKit                          0x193641fa8 -[UITableView _createPreparedCellForGlobalRow:willDisplay:] + 80
5  UIKit                          0x19362f6ac -[UITableView _updateVisibleCellsNow:isRecursive:] + 2152
6  UIKit                          0x193646f98 -[UITableView _performWithCachedTraitCollection:] + 120
7  UIKit                          0x1933df49c -[UITableView layoutSubviews] + 176
8  UIKit                          0x1932f9cc0 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1200
9  QuartzCore                     0x1904ea274 -[CALayer layoutSublayers] + 148
10 QuartzCore                     0x1904dede8 
CA::Layer::layout_if_needed(CA::Transaction*) + 292
11 QuartzCore                     0x1904deca8 
CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 32
12 QuartzCore                     0x19045a34c 
CA::Context::commit_transaction(CA::Transaction*) + 252
13 QuartzCore                     0x1904813ac 
CA::Transaction::commit() + 504
14 QuartzCore                     0x190481e78 
CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned 
long, void*) + 120
15 CoreFoundation                 0x18d1789a8 
__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
16 CoreFoundation                 0x18d176630 __CFRunLoopDoObservers 
+ 372
17 CoreFoundation                 0x18d176a7c __CFRunLoopRun + 956
18 CoreFoundation                 0x18d0a6da4 CFRunLoopRunSpecific + 
424
19 GraphicsServices               0x18eb11074 GSEventRunModal + 100
20 UIKit                          0x193361c9c UIApplicationMain + 208
21 MY APP                         0x10002f710 main 
(AppDelegate.swift:16)
22 libdyld.dylib                  0x18c0b559c start + 4

这是我第一次阅读崩溃日志文件。我认为。我的Functionclass 的returnDateString 方法的123 行有问题。但是我怎么能理解这一行的确切问题是什么?这是我在 Function 类中的方法。

class func retunDateStringFromDateString(dateString : String,inuputFormat: String, outPutFormat : String) -> String
    if(dateString != "")
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = inuputFormat//this your string date format

        let date = dateFormatter.date(from: dateString)


        dateFormatter.dateFormat = outPutFormat///this is what you want to convert format

        let timeStamp = dateFormatter.string(from: date!)


        return timeStamp
    else
        return ""
    


这是我的 123 行。 let timeStamp = dateFormatter.string(from: date!)

这是什么原因? 请帮我。 谢谢

更新

var inTimeArray = inTime?.components(separatedBy: ".")
print(inTimeArray)

cell.inOneTime.text = Functions.nullToNilForString(value: Functions.retunDateStringFromDateString(dateString: (inTimeArray?[0])! ,inuputFormat: "yyyy-MM-dd'T'HH:mm:ss", outPutFormat:  "HH:mm") as AnyObject?)?.description

【问题讨论】:

DateFormatter doesn't return date for "HH:mm:ss"的可能重复 您很可能在date 中有nil。你的inputFormat 是什么,dateString 是什么?除非您是 100%,否则不要使用强制展开,该值永远不会为零。至于了解崩溃日志,崩溃日志仅显示堆栈跟踪,它们无法告诉您问题的确切原因,因为在发布模式下,您的应用程序未在调试器中运行,因此无法捕获和识别运行时异常的断点.但是,正如您在此处所做的那样,您可以在大多数情况下将错误定位到导致它的行。 @DávidPásztor 我用电话线更新了我的问题 @user1960169 (inTimeArray?[0] 的值是多少?当您的应用崩溃时? @DávidPásztor 这就是我遇到麻烦的地方。因为当我在我的设备上运行它时,即使对于同一个登录用户,它也不会崩溃。这发生在我客户的设备中。所以我不确定如何获得这个值。 【参考方案1】:

根据 cmets 中的讨论,您的用户设备上的区域设置似乎与您的测试设备上的不同,并且在使用明确的日期格式时,不同的区域设置可能会导致问题。

正如我在 cmets 中已经说过的,不要强制解包日期值,而是使用可选解包并在 dateFormatter.date(from: String) 失败时向用户显示错误消息。

您应该将您的 dateFormat 更改为与区域设置无关的格式,或者设置 dateFormatter.locale = Locale(identifier: "en_US_POSIX") 或您已经测试过显式日期格式的任何其他区域设置。

至于理解崩溃日志,崩溃日志仅显示堆栈跟踪,它们无法告诉您问题的确切原因,因为在发布模式下,您的应用程序未在调试器中运行,因此无法捕获和识别断点运行时异常。但是,正如您在此处所做的那样,在大多数情况下,您可以将错误定位到导致它的行。

【讨论】:

非常感谢。如果我设置 dateFormatter.locale = Locale(identifier: "en_US_POSIX") 它将适用于任何设备中的任何其他语言环境设置吗? 这取决于您的dateString 来自哪里。如果它是一个独立于设备的值,那么是的,将语言环境设置为美国将在每个设备上独立于语言环境设置。 有什么方法可以在我的设备中模拟同样的问题吗? 尝试更改语言环境,看看您是否遇到任何特定语言环境的崩溃。 我将语言和区域更改为少数,但仍然没有崩溃【参考方案2】:

这里最可能的问题是您强制解开可选的日期参数。如果它无法将 dateString 解析为日期,则 date 将为 nil 并且强制展开将导致崩溃。

试试这样的方法:

guard let date = dateFormatter.date(from: dateString) else 
    // handle the error
    return ""

//...
return dateFormatter.string(from: date)

请参阅有关选项的文档以更好地理解 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html

【讨论】:

以上是关于了解 Fabrics 的崩溃日志的主要内容,如果未能解决你的问题,请参考以下文章

iOS应用崩溃日志分析

React Native 应用程序崩溃而没有任何错误日志

iOS测试常见崩溃

在 iOS 应用中升级 SDK 后 Firebase Crashlytics 不显示日志

如何调试 iPhone 应用程序崩溃日志。仅在 App Store 购买的版本中崩溃,而不是在开发中

如何获得Android的崩溃日志