簡體   English   中英

Crashlytics中記錄“對象引用未設置為對象的實例”異常時,如何找出哪個對象引用為空?

[英]How to find out which object reference is null, when an “Object reference not set to an instance of an object” exception is recorded in Crashlytics?

我有一個使用 Crashlytics 發布的游戲,可以在 Android 和 iOS 上運行。

我有"Object reference not set to an instance of an object"異常的記錄,這些異常告訴我在哪個方法中遇到了空引用,但不確切地是哪個引用,或發生在哪一行。

代碼在本地測試中運行成功,但在實際使用場景中,可能會出現空引用。

請注意,在 Unity 中,這可能意味着一個實際的 MonoBehaviour 對象被銷毀並且不再可用,因此在任何地方添加空檢查無濟於事。 我想確切地知道哪個對象已被銷毀,以便我可以找出導致異常的事件序列。

我想過每隔幾行就添加一個帶有更新值的Crashlytics.SetCustomKey() ,這樣我至少可以猜測發生在哪一行,這樣我就可以做出更好的猜測。

但是你有什么更好的策略建議嗎?

編輯:這個問題已被標記為重復,所以我在描述為什么它不是提到的問題的重復。

我已經知道為什么會發生 NullReferenceException,如果它發生在我本地,我可以修復它。 這個問題是與上述重復項不同的問題。 問題是關於一個復雜的情況,當一系列事件導致某些對象被銷毀時,它們預計不會被銷毀。

我的問題更多地與更好地利用 Crashlytics 相關,而不是與 NullReferenceException 相關。

為了更好地描述這種情況,這是一個棋盤游戲。 每一輪游戲都會在棋盤上創建一些棋子,當玩家觸摸棋盤時,棋盤上會創建一些高亮對象,因此玩家可以選擇可以移動棋子的位置。

作為一個可能的例子,當玩家重新開始游戲或在任何情況下離開游戲時,這些對象都會被銷毀。

但是另一項工作可能會在刷新后完成它的工作(可能是 AI 思維),然后期望船上有物體,而它們不再存在!

我真的不知道要分享什么代碼,我想我需要分享項目的很大一部分。 而且我認為這也無濟於事。 因為我不是在尋找問題的直接答案。 但我通常會問如何更好地獲取有關 Crashlytics 記錄的 NullReferenceExceptions 的更多信息。

我也已經搜索過,但沒有找到針對我的具體問題的解決方案。

所以考慮到所描述的情況,我知道異常發生的方法。 當我在 Crashlytics 中有記錄時,您認為我如何知道該異常發生在哪一行,或者哪個對象為空? (除了我自己提到的解決方案)

編輯 2 :我最初認為堆棧跟蹤可能會分散人們對實際問題的注意力,但查看評論,我認為它確實有幫助。

這是堆棧跟蹤:

Non-fatal Exception: java.lang.Exception: NullReferenceException : Object reference not set to an instance of an object. at OfflineGameScreen.MoveSuggestionTouched(OfflineGameScreen) at OfflineGameScreen+<MakeNextMoveByBot>d__74.MoveNext(OfflineGameScreen+<MakeNextMoveByBot>d__74) at System.Threading.ContextCallback.Invoke(System.Threading.ContextCallback) at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext) at System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner.Run(System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner) at System.Action.Invoke(System.Action) at System.Threading.SendOrPostCallback.Invoke(System.Threading.SendOrPostCallback) at UnityEngine.UnitySynchronizationContext+WorkRequest.Invoke(UnityEngine.UnitySynchronizationContext+WorkRequest) at UnityEngine.UnitySynchronizationContext.Exec(UnityEngine.UnitySynchronizationContext)

當然,如果您的代碼不知道詳細信息,但是您可以在銷毀時以及在引發錯誤之前記錄對象的 InstanceID。 這可能會導致您進入可能發生異常的邏輯鴻溝。

小心nullchecks ,主要是在Updates()因為它們不是“免費的”,因為 unity 有它自己的==運算符實現來處理典型的if (myGameObject == null) {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM