2016-05-08 155 views
7

我正在開發一個應用程序與HERE sdk,並eveything工作良好,直到現在。我得到這樣一個錯誤:
Fatal signal 11 (SIGSEGV), code 1, fault addr 0x750057 in tid 10206 (FinalizerDaemon)
或者這一個:
Fatal signal 11 (SIGSEGV), code 1, fault addr 0x94789680 in tid 24605 (FinalizerDaemon)應用程序崩潰(有時)與致命的信號11(SIGSEGV),代碼1

,他們讓我的應用程序崩潰。

這並不總是相同的錯誤,但他們總是獨自一人在我的Logcat中,沒有其他信息。

在我所有的應用程序,我在這裏使用對象和服務,甚至通過打印堆棧跟蹤我沒有得到有關錯誤的更多信息。
我剛剛注意到這些錯誤幾乎是隨機出現的,但只有當我使用這些對象/服務時。

我用一個真實的設備來測試我的應用程序,索尼的Xperia Z3緊湊,所以我不認爲它來自這裏。

我真的失去了,所以如果有人甚至對如何獲取有關錯誤的更多相關信息的任何想法,請幫助

編輯:

05-09 23:04:10.148 6770-6782/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x4 in tid 6782 (FinalizerDaemon) 
05-09 23:04:10.266 30179-30179/? I/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
05-09 23:04:10.266 30179-30179/? I/DEBUG: UUID: 5569a1b9-c913-4101-99fa-5099e2cadd48 
05-09 23:04:10.266 30179-30179/? I/DEBUG: Build fingerprint: 'Sony/D5803/D5803:5.1.1/23.4.A.1.264/2418263178:user/release-keys' 
05-09 23:04:10.266 30179-30179/? I/DEBUG: Revision: '0' 
05-09 23:04:10.266 30179-30179/? I/DEBUG: ABI: 'arm' 
05-09 23:04:10.266 30179-30179/? I/DEBUG: pid: 6770, tid: 6782, name: FinalizerDaemon >>> com.david.metroz <<< 
05-09 23:04:10.266 30179-30179/? I/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4 
05-09 23:04:10.294 30179-30179/? I/DEBUG:  r0 98327400 r1 00000000 r2 00000002 r3 00000000 
05-09 23:04:10.294 30179-30179/? I/DEBUG:  r4 aec264c0 r5 b3df7acc r6 98327400 r7 73652348 
05-09 23:04:10.294 30179-30179/? I/DEBUG:  r8 6f9983a8 r9 b482a800 sl 12f1d820 fp b3df7abc 
05-09 23:04:10.294 30179-30179/? I/DEBUG:  ip b5303950 sp b3df7ab0 lr b510717f pc a0b7205c cpsr a00e0010 
05-09 23:04:10.294 30179-30179/? I/DEBUG:  #00 pc 000f405c /data/app/com.david.metroz-1/lib/arm/libMAPSJNI.so (Java_com_nokia_maps_GeoBoundingBoxImpl_destroyNative+76) 
05-09 23:04:10.294 30179-30179/? I/DEBUG:  #01 pc 001d7d4f /data/dalvik-cache/arm/[email protected]@[email protected]@classes.dex 
05-09 23:04:12.302 862-1274/? E/NativeCrashListener: Exception dealing with report 
                android.system.ErrnoException: read failed: EAGAIN (Try again) 
                 at libcore.io.Posix.readBytes(Native Method) 
                 at libcore.io.Posix.read(Posix.java:165) 
                 at libcore.io.BlockGuardOs.read(BlockGuardOs.java:230) 
                 at android.system.Os.read(Os.java:350) 
                 at com.android.server.am.NativeCrashListener.consumeNativeCrashData(NativeCrashListener.java:240) 
                 at com.android.server.am.NativeCrashListener.run(NativeCrashListener.java:138) 

編輯2:我現在很確定當我使用gson從數據庫檢索HERE對象時發生崩潰。

當一切都在同一個應用程序運行時完成下面的代碼工作,但是當我保存一個字符串在數據庫中,關閉應用程序,然後重新打開它,我得到的Fatal signal而轉換json string回對象。

// to insert I create a json string and then insert it in the database 
String mGbSortie = gson.toJson(geoboundinBox); 

//and then to retrieve the data : 
Type gbType = new TypeToken<GeoBoundingBox>(){}.getType(); 
geoBoudingBox = gson.fromJson(stringFromDb, listType) 

我真的不知道爲什麼它不工作..

+0

現在我有同樣的問題。我有一個應用程序和隨機更改片段。它顯示了與應用程序崩潰相同的錯誤,但它非常隨機的行爲意味着沒有這種模式。但它會崩潰 –

回答

0

可以粘貼從亞行logcat任何更多的信息?目前我們沒有足夠的信息來幫助你。終結器守護進程中的段錯誤可能意味着雙重刪除本機對象。沒有更多的信息,它可能在操作系統或SDK中的任何地方。

跳過的幀意味着您的應用正在處理主線程中的大量數據。跳過161幀意味着超過3秒的繁忙時間!請嘗試使用AsyncTasks或線程來優化您的應用程序。

看來你使用的是GSON類型反序列化器,它不會正確地構造我們的本地對象。手動反序列化lat,lng並調用新的GeoBoundingBox()不會崩潰。

+0

我編輯了我的問題,但我認爲我發現了這個問題:我正在使用gson庫將地理座標和地理數據框列表轉換爲json字符串,而且我認爲有時該字符串沒有很好地創建,所以試圖讓對象返回錯誤的字符串混亂起來,有點像[this](http://stackoverflow.com/a/31866823/5921902) –

+0

這是一種可能性,但只需快速檢查代碼我沒有看到你將如何使用該堆棧的無效指針。你能發佈崩潰邊界框的座標嗎? –

+1

好吧,它與我嘗試的每個座標都崩潰了,但是如果你願意,你可以看看它們:'gb:right = Lat:48.86490904039134,Long:2.39895392405874,Alt:0.0 left = Lat:48.864913,Long:2.3988175,Alt :0.0 center = Lat:48.86491102019567,Long:2.3988857120293696,Alt:1.073741824E9'。 –

4

1)首先判斷它是否在Android中的一個bug,第三方庫或設備,這樣你就可以知道進行哪種方式。

This answer給出瞭如何做到這一點的解決方案:

如果你已經寫了(或正在使用),然後再將通過NDK使用原生的C/C++代碼插件,這可能表明中的錯誤那個本地代碼。

否則,這是您正在測試的設備或仿真器的固件中的錯誤。

如果你能在一個仿真器與原來的ROM再現這一點,Nexus設備上,或者在各種來自不同製造商的設備,它可能是在安卓本身就是一個錯誤。在這種情況下,請創建可重現錯誤,並與整個堆棧跟蹤張貼一起http://b.android.com,Android操作系統問題跟蹤的樣本項目。

如果你只遇到這一個設備或一個第三方ROM上,它可能是一個更具體的錯誤 - 你最好的選擇就是與設備製造商或ROM出版者與你的症狀。

有哪些討論您詳細收到錯誤這兩個問題:

Android Fatal signal 11 (SIGSEGV) at 0x636f7d89 (code=1). How can it be tracked down?

Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1) - PhoneGap

2)在解析您的geobounds值(因爲它似乎是一個方面問題可能出在哪裏),請確保您正確處理Gson和Json之間的解析,並使用正確的地理空間值。它看起來如何存儲這些值與你如何回溯它們不一致。

From Mykong

的toJSON() - 轉換Java對象JSON

Gson gson = new Gson(); 
Staff obj = new Staff(); 

// 1. Java object to JSON, and save into a file 
gson.toJson(obj, new FileWriter("D:\\file.json")); 

// 2. Java object to JSON, and assign to a String 
String jsonInString = gson.toJson(obj); 

fromJson() - 轉換JSON到Java對象

Gson gson = new Gson(); 

// 1. JSON to Java object, read it from a file. 
Staff staff = gson.fromJson(new FileReader("D:\\file.json"), Staff.class); 

// 2. JSON to Java object, read it from a Json String. 
String jsonInString = "{'name' : 'mkyong'}"; 
Staff staff = gson.fromJson(jsonInString, Staff.class); 

// JSON to JsonElement, convert to String later. 
JsonElement json = gson.fromJson(new FileReader("D:\\file.json"), JsonElement.class); 
String result = gson.toJson(json); 

this answer

public class YourObject { 
    private String appname; 
    private String Version; 
    private String UUID; 
    private String WWXY; 
    private String ABCD; 
    private String YUDE; 
    //getters/setters 


YourObject parsed = new Gson().fromJson(jsons, YourObject.class); 

String jsons = "{'appname':'application', 'Version':'0.1.0', 'UUID':'300V', 'WWXY':'310W', 'ABCD':'270B', 'YUDE':'280T'}"; 
YourObject parsed = new Gson().fromJson(jsons, YourObject.class); 

JsonObject object = new JsonParser().parse(jsons).getAsJsonObject(); 
object.get("appname"); // application 
object.get("Version"); // 0.1.0 

這些所謂的問題提供更多的細節:
How to parse json parsing Using GSON in android
parse JSON with gson and GsonBuilder()

3)確保您傳遞正確的價值觀爲您geobound共同ORDS。 這個問題Value does not fall within the expected range GeoboundingBox WinRT(雖然它是C#提供瞭如何打破你想存儲和檢索信息的部件一個很好的例子。

The answer很簡單。

var nw = new BasicGeoposition(); 
nw.Latitude = Max(pos.Coordinate.Latitude, pos2.lat); 
nw.Longitude = Min(pos.Coordinate.Longitude, pos2.lng); 
var se = new BasicGeoposition(); 
se.Latitude = Min(pos.Coordinate.Latitude, pos2.lat); 
se.Longitude = Max(pos.Coordinate.Longitude, pos2.lng); 

而且學習如何用gson解析你的json:

Use Gson to work with JSON in your Android apps

還有this gihub repo爲你瀏覽更多的想法。

0

我已經通過下面的代碼解決同樣的問題。

應用標籤添加android:vmSafeMode="true"清單文件。

您的應用程序標籤應該是這樣的:

<application 
    android:name=".MyApplication" 
    android:hardwareAccelerated="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:largeHeap="true" 
    android:theme="@style/AppTheme" 
    android:vmSafeMode="true"> 

    // Other stuff 

</application> 

希望這會幫助你。

+0

我不知道如何,但是這可以避免致命的信號,但是@DavidLeong說我正在序列化一個C++指針,所以當我關閉並重新打開應用程序時,指針爲空。我現在可以更好地看到它,因爲不是獲取錯誤,而是獲取空座標爲:0,000000,000000,0,000000,000000' –

+0

@DavidSeroussi的對象,我希望您的問題得到解決。 –

+0

我不會推薦這樣做。它可能隱藏了問題並最終破壞了C++堆。 –

相關問題