堆栈跟踪行号如何与源代码行号不匹配?

时间:2012-11-26 15:23:04

标签: android sql sqlite debugging

我的应用程序在我的设备上与NPE崩溃。在使用ACRA收到的堆栈跟踪中,行号指的是两个源代码类SQLiteStatementSQLiteDatabase。对于SQLiteDatabase,没有任何行号与任何源代码版本中的行号匹配。我的设备没有自定义ROM。这是运行Android 4.03的Galaxy S2。

这是堆栈跟踪:

java.lang.NullPointerException
at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:290)
at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:96)
at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:2025)
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1965)
at android.database.sqlite.SQLiteDatabase.beginTransaction(SQLiteDatabase.java:690)
at android.database.sqlite.SQLiteDatabase.beginTransactionNonExclusive(SQLiteDatabase.java:605)
at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:247)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:112)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1844)
at com.mydomain.myapp.albums.AlbumsData.insertOrIgnore(AlbumsData.java:89)

如果您查看its different versionsSQLiteDataBase的来源,您可以自行检查数字是否匹配。

例如,在Android 4.03的SQLiteDataBase source中,executesql(...)位于第1892行,而我的堆栈跟踪显示它位于第2025行。

这怎么可能?

(请注意我询问NPE的来源)

2 个答案:

答案 0 :(得分:2)

所有内部错误都是由代码中的这一行引起的:

com.mydomain.myapp.albums.AlbumsData.insertOrIgnore(AlbumsData.java:89)

你需要去了解它并弄清楚它是怎么回事。我同意@ 323go你可能会传递某种类型的空值。一旦你得到照顾内部的东西应该消失。

至于为什么行号不同。您正在查看裸骨库存系统源代码。当它进入设备并进入消费者手中时,它可能会被改变一点点,我不知道具体为什么或它们会在SQLiteDatabase类中改变但看起来它们已经改变了东西。

答案 1 :(得分:1)

我不确定官方的android源码与手机上的Android版本相匹配。我认为三星可能因为它自己的目的改变了android:三星家伙拿了android 4.0.3来源,修改了它们,在不同的类中添加了一些东西(SQLiteDatabase似乎是其中之一),然后构建它并得到了自己的android的版本。他们没有修改显示android版本的常量,所以你可以看到它仍然是'4.0'。