{ "id": "145671", "key": "AC-396", "fields": { "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false }, "project": { "id": "12217", "key": "AC", "name": "Appcelerator - INBOX", "projectCategory": { "id": "10000", "description": "", "name": "Customer Service" } }, "resolution": { "id": "5", "description": "All attempts at reproducing this issue failed, or not enough information was available to reproduce the issue. Reading the code produces no clues as to why this behavior would occur. If more information appears later, please reopen the issue.", "name": "Cannot Reproduce" }, "resolutiondate": "2015-11-22T11:52:14.000+0000", "created": "2015-03-12T10:01:11.000+0000", "labels": [ "android-4.4", "crash", "database", "exception", "image", "view" ], "versions": [], "issuelinks": [], "assignee": { "name": "mrahman", "key": "mrahman", "displayName": "Mostafizur Rahman", "active": true, "timeZone": "Asia/Dhaka" }, "updated": "2015-11-22T12:03:48.000+0000", "status": { "description": "A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.", "name": "Resolved", "id": "5", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "components": [ { "id": "14548", "name": "Titanium SDK & CLI", "description": "Please enter tickets related to the MobileSDK here." } ], "description": "h4. Summary\r\n\r\nViews that load images into buttons crash unpredictably in this environment, with the following error:\r\n\r\n{noformat}\r\nE/BufferQueue( 292): [org.camcops.camcops/org.appcelerator.titanium.TiActivity] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count\r\n{noformat}\r\n\r\nSubsequent attempts to open a database then crash with an exception (giving the impression of a database error):\r\n\r\n{noformat}\r\nE/SQLiteDatabase(25764): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nW/System.err(25764): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nE/TiExceptionHandler(25764): (main) [170,48824] ----- Titanium Javascript Runtime Error -----\r\nE/TiExceptionHandler(25764): (main) [1,48825] - In undefined:32,32\r\nE/TiExceptionHandler(25764): (main) [0,48825] - Message: Uncaught Error: Java Exception occurred\r\nE/TiExceptionHandler(25764): (main) [0,48825] - Source: var db = Titanium.Database.open(DBNAME),\r\n{noformat}\r\n\r\nh4. Effect\r\n\r\nApp becomes useless because it appears to hang unpredictably.\r\n\r\nh4. Test code to reproduce\r\n\r\n{code:title=android_dequeuebuffer_crash.js}\r\n/*jslint node: true, plusplus: true */\r\n\"use strict\";\r\n/*global Titanium */\r\n\r\nvar DBNAME = \"junk.db\",\r\n PKVAL = 1,\r\n ICONSIZE = 48,\r\n IM_PR = \"/images/camcops/\", // image filename prefix\r\n ICON_RADIO_UNSELECTED = IM_PR + 'radio_unselected.png',\r\n ICON_RADIO_UNSELECTED_T = IM_PR + 'radio_unselected_T.png',\r\n ICON_RADIO_SELECTED = IM_PR + 'radio_selected.png',\r\n ICON_RADIO_SELECTED_T = IM_PR + 'radio_selected_T.png',\r\n view = Titanium.UI.createView({\r\n layout: 'vertical',\r\n backgroundColor: '#FFFFFF'\r\n }),\r\n button = Titanium.UI.createButton({\r\n width: ICONSIZE,\r\n height: ICONSIZE,\r\n touchEnabled: true,\r\n backgroundImage: ICON_RADIO_UNSELECTED,\r\n backgroundSelectedImage: ICON_RADIO_UNSELECTED_T,\r\n }),\r\n state = false,\r\n win = Titanium.UI.createWindow();\r\n\r\nfunction rnd(min, max) {\r\n return Math.random() * (max - min) + min;\r\n}\r\n\r\nfunction standalone_execute_noreturn(query, args) {\r\n var db = Titanium.Database.open(DBNAME),\r\n cursor;\r\n if (args === undefined) {\r\n cursor = db.execute(query);\r\n } else {\r\n cursor = db.execute(query, args);\r\n }\r\n if (cursor !== null) {\r\n cursor.close();\r\n }\r\n db.close();\r\n}\r\n\r\nfunction access_db() {\r\n Titanium.API.info(\"access_db: start\");\r\n standalone_execute_noreturn(\r\n \"UPDATE t SET value = ? WHERE pk = ?\",\r\n [rnd(0, 1000), PKVAL]\r\n );\r\n Titanium.API.info(\"access_db: end\");\r\n}\r\n\r\nfunction makedb() {\r\n standalone_execute_noreturn(\r\n \"CREATE TABLE IF NOT EXISTS t (pk INTEGER, value INTEGER)\"\r\n );\r\n}\r\n\r\nfunction toggle_appearance() {\r\n Titanium.API.info(\"toggle_appearance: start\");\r\n state = !state;\r\n if (state) {\r\n button.setBackgroundImage(ICON_RADIO_SELECTED);\r\n button.setBackgroundSelectedImage(ICON_RADIO_SELECTED_T);\r\n } else {\r\n button.setBackgroundImage(ICON_RADIO_UNSELECTED);\r\n button.setBackgroundSelectedImage(ICON_RADIO_UNSELECTED_T);\r\n }\r\n Titanium.API.info(\"toggle_appearance: end\");\r\n}\r\n\r\nfunction click() {\r\n access_db();\r\n toggle_appearance();\r\n}\r\n\r\nmakedb();\r\nbutton.addEventListener(\"click\", click);\r\nview.add(button);\r\nwin.add(view);\r\nwin.open();\r\n{code}\r\n\r\nh4. Procedure to generate crash\r\n\r\nTap the button frequently (usually crashes within first 100-200 taps or so).\r\n\r\nh4. Result if access_db() and toggle_appearance() are both called from click()\r\n\r\nCrash (screen goes blank, though remains invisibly responsive) and exception from database access:\r\n\r\nOutput from {{adb logcat | grep Ti}}:\r\n\r\n{noformat}\r\n...\r\nI/TiAPI (25764): access_db: start\r\nI/TiAPI (25764): access_db: end\r\nI/TiAPI (25764): toggle_appearance: start\r\nI/TiAPI (25764): toggle_appearance: end\r\nI/TiAPI (25764): access_db: start\r\nI/TiAPI (25764): access_db: end\r\nI/TiAPI (25764): toggle_appearance: start\r\nI/TiAPI (25764): toggle_appearance: end\r\nI/TiAPI (25764): access_db: start\r\nI/TiAPI (25764): access_db: end\r\nI/TiAPI (25764): toggle_appearance: start\r\nI/TiAPI (25764): toggle_appearance: end\r\nI/TiAPI (25764): access_db: start\r\nI/TiAPI (25764): access_db: end\r\nI/TiAPI (25764): toggle_appearance: start\r\nI/TiAPI (25764): toggle_appearance: end\r\nI/TiAPI (25764): access_db: start\r\nI/TiAPI (25764): access_db: end\r\nI/TiAPI (25764): toggle_appearance: start\r\nI/TiAPI (25764): toggle_appearance: end\r\nI/TiAPI (25764): access_db: start\r\nI/TiAPI (25764): access_db: end\r\nI/TiAPI (25764): toggle_appearance: start\r\nI/TiAPI (25764): toggle_appearance: end\r\nI/TiAPI (25764): access_db: start\r\nI/TiAPI (25764): access_db: end\r\nI/TiAPI (25764): toggle_appearance: start\r\nI/TiAPI (25764): toggle_appearance: end\r\nE/BufferQueue( 292): [org.camcops.camcops/org.appcelerator.titanium.TiActivity] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count\r\nI/TiAPI (25764): access_db: start\r\nI/TiAPI (25764): access_db: end\r\nI/TiAPI (25764): toggle_appearance: start\r\nI/TiAPI (25764): toggle_appearance: end\r\nE/BufferQueue( 292): [org.camcops.camcops/org.appcelerator.titanium.TiActivity] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count\r\nE/BufferQueue( 292): [org.camcops.camcops/org.appcelerator.titanium.TiActivity] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count\r\nI/TiAPI (25764): access_db: start\r\nE/SQLiteDatabase(25764): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nW/System.err(25764): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nE/TiExceptionHandler(25764): (main) [48442,48442] ----- Titanium Javascript Runtime Error -----\r\nE/TiExceptionHandler(25764): (main) [0,48442] - In undefined:32,32\r\nE/TiExceptionHandler(25764): (main) [1,48443] - Message: Uncaught Error: Java Exception occurred\r\nE/TiExceptionHandler(25764): (main) [0,48443] - Source: var db = Titanium.Database.open(DBNAME),\r\nI/TiAPI (25764): access_db: start\r\nE/SQLiteDatabase(25764): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nW/System.err(25764): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nE/TiExceptionHandler(25764): (main) [210,48653] ----- Titanium Javascript Runtime Error -----\r\nE/TiExceptionHandler(25764): (main) [0,48653] - In undefined:32,32\r\nE/TiExceptionHandler(25764): (main) [0,48653] - Message: Uncaught Error: Java Exception occurred\r\nE/TiExceptionHandler(25764): (main) [1,48654] - Source: var db = Titanium.Database.open(DBNAME),\r\nI/TiAPI (25764): access_db: start\r\nE/SQLiteDatabase(25764): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nW/System.err(25764): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nE/TiExceptionHandler(25764): (main) [170,48824] ----- Titanium Javascript Runtime Error -----\r\nE/TiExceptionHandler(25764): (main) [1,48825] - In undefined:32,32\r\nE/TiExceptionHandler(25764): (main) [0,48825] - Message: Uncaught Error: Java Exception occurred\r\nE/TiExceptionHandler(25764): (main) [0,48825] - Source: var db = Titanium.Database.open(DBNAME),\r\nI/TiAPI (25764): access_db: start\r\nE/SQLiteDatabase(25764): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nW/System.err(25764): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nE/TiExceptionHandler(25764): (main) [3777,52602] ----- Titanium Javascript Runtime Error -----\r\nE/TiExceptionHandler(25764): (main) [0,52602] - In undefined:32,32\r\nE/TiExceptionHandler(25764): (main) [1,52603] - Message: Uncaught Error: Java Exception occurred\r\nE/TiExceptionHandler(25764): (main) [0,52603] - Source: var db = Titanium.Database.open(DBNAME),\r\n{noformat}\r\n\r\nFull output from {{adb logcat}}:\r\n\r\n{noformat}\r\n...\r\nI/TiAPI (27596): access_db: start\r\nI/TiAPI (27596): access_db: end\r\nI/TiAPI (27596): toggle_appearance: start\r\nI/TiAPI (27596): toggle_appearance: end\r\nI/TiAPI (27596): access_db: start\r\nI/TiAPI (27596): access_db: end\r\nI/TiAPI (27596): toggle_appearance: start\r\nI/TiAPI (27596): toggle_appearance: end\r\nI/TiAPI (27596): access_db: start\r\nI/TiAPI (27596): access_db: end\r\nI/TiAPI (27596): toggle_appearance: start\r\nI/TiAPI (27596): toggle_appearance: end\r\nI/TiAPI (27596): access_db: start\r\nI/TiAPI (27596): access_db: end\r\nI/TiAPI (27596): toggle_appearance: start\r\nI/TiAPI (27596): toggle_appearance: end\r\nI/TiAPI (27596): access_db: start\r\nI/TiAPI (27596): access_db: end\r\nI/TiAPI (27596): toggle_appearance: start\r\nI/TiAPI (27596): toggle_appearance: end\r\nE/QcrilMsgTunnelSocket( 2769): IOException - java.io.IOException: No such file or directory Reason: No such file or directory\r\nI/TiAPI (27596): access_db: start\r\nI/TiAPI (27596): access_db: end\r\nI/TiAPI (27596): toggle_appearance: start\r\nI/TiAPI (27596): toggle_appearance: end\r\nI/TiAPI (27596): access_db: start\r\nE/SQLiteLog(27596): (14) cannot open file at line 30185 of [00bb9c9ce4]\r\nE/SQLiteLog(27596): (14) os_unix.c:30185: (24) open(/data/data/org.camcops.camcops/databases/junk.db-journal) - \r\nE/SQLiteLog(27596): (14) cannot open file at line 30185 of [00bb9c9ce4]\r\nE/SQLiteLog(27596): (14) os_unix.c:30185: (24) open(/data/data/org.camcops.camcops/databases/junk.db-journal) - \r\nE/SQLiteLog(27596): (14) unable to open database file\r\nE/SQLiteDatabase(27596): Failed to open database '/data/data/org.camcops.camcops/databases/junk.db'.\r\nE/SQLiteDatabase(27596): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14): , while compiling: PRAGMA journal_mode\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:634)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:320)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:294)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:215)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)\r\nE/SQLiteDatabase(27596): \tat android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:977)\r\nE/SQLiteDatabase(27596): \tat android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:966)\r\nE/SQLiteDatabase(27596): \tat android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:250)\r\nE/SQLiteDatabase(27596): \tat ti.modules.titanium.database.DatabaseModule.open(DatabaseModule.java:71)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.nativeFireEvent(Native Method)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.fireEvent(V8Object.java:62)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.KrollProxy.doFireEvent(KrollProxy.java:884)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1107)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nE/SQLiteDatabase(27596): \tat android.os.Handler.dispatchMessage(Handler.java:98)\r\nE/SQLiteDatabase(27596): \tat android.os.Looper.loop(Looper.java:212)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)\r\nW/System.err(27596): java.lang.NullPointerException\r\nW/System.err(27596): \tat ti.modules.titanium.database.DatabaseModule.open(DatabaseModule.java:78)\r\nW/System.err(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.nativeFireEvent(Native Method)\r\nW/System.err(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.fireEvent(V8Object.java:62)\r\nW/System.err(27596): \tat org.appcelerator.kroll.KrollProxy.doFireEvent(KrollProxy.java:884)\r\nW/System.err(27596): \tat org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1107)\r\nW/System.err(27596): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nW/System.err(27596): \tat android.os.Handler.dispatchMessage(Handler.java:98)\r\nW/System.err(27596): \tat android.os.Looper.loop(Looper.java:212)\r\nW/System.err(27596): \tat org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)\r\nE/TiExceptionHandler(27596): (main) [36494,36494] ----- Titanium Javascript Runtime Error -----\r\nE/TiExceptionHandler(27596): (main) [0,36494] - In undefined:32,32\r\nE/TiExceptionHandler(27596): (main) [0,36494] - Message: Uncaught Error: Java Exception occurred\r\nE/TiExceptionHandler(27596): (main) [0,36494] - Source: var db = Titanium.Database.open(DBNAME),\r\nE/V8Exception(27596): Exception occurred at undefined:32: Uncaught Error: Java Exception occurred\r\nI/TiAPI (27596): access_db: start\r\nE/SQLiteLog(27596): (14) cannot open file at line 30185 of [00bb9c9ce4]\r\nE/SQLiteLog(27596): (14) os_unix.c:30185: (24) open(/data/data/org.camcops.camcops/databases/junk.db-journal) - \r\nE/SQLiteLog(27596): (14) cannot open file at line 30185 of [00bb9c9ce4]\r\nE/SQLiteLog(27596): (14) os_unix.c:30185: (24) open(/data/data/org.camcops.camcops/databases/junk.db-journal) - \r\nE/SQLiteLog(27596): (14) unable to open database file\r\nE/SQLiteDatabase(27596): Failed to open database '/data/data/org.camcops.camcops/databases/junk.db'.\r\nE/SQLiteDatabase(27596): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14): , while compiling: PRAGMA journal_mode\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:634)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:320)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:294)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:215)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)\r\nE/SQLiteDatabase(27596): \tat android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:977)\r\nE/SQLiteDatabase(27596): \tat android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:966)\r\nE/SQLiteDatabase(27596): \tat android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:250)\r\nE/SQLiteDatabase(27596): \tat ti.modules.titanium.database.DatabaseModule.open(DatabaseModule.java:71)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.nativeFireEvent(Native Method)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.fireEvent(V8Object.java:62)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.KrollProxy.doFireEvent(KrollProxy.java:884)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1107)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nE/SQLiteDatabase(27596): \tat android.os.Handler.dispatchMessage(Handler.java:98)\r\nE/SQLiteDatabase(27596): \tat android.os.Looper.loop(Looper.java:212)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)\r\nW/System.err(27596): java.lang.NullPointerException\r\nW/System.err(27596): \tat ti.modules.titanium.database.DatabaseModule.open(DatabaseModule.java:78)\r\nW/System.err(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.nativeFireEvent(Native Method)\r\nW/System.err(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.fireEvent(V8Object.java:62)\r\nW/System.err(27596): \tat org.appcelerator.kroll.KrollProxy.doFireEvent(KrollProxy.java:884)\r\nW/System.err(27596): \tat org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1107)\r\nW/System.err(27596): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nW/System.err(27596): \tat android.os.Handler.dispatchMessage(Handler.java:98)\r\nW/System.err(27596): \tat android.os.Looper.loop(Looper.java:212)\r\nW/System.err(27596): \tat org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)\r\nE/TiExceptionHandler(27596): (main) [126,36620] ----- Titanium Javascript Runtime Error -----\r\nE/TiExceptionHandler(27596): (main) [0,36620] - In undefined:32,32\r\nE/TiExceptionHandler(27596): (main) [1,36621] - Message: Uncaught Error: Java Exception occurred\r\nE/TiExceptionHandler(27596): (main) [0,36621] - Source: var db = Titanium.Database.open(DBNAME),\r\nE/V8Exception(27596): Exception occurred at undefined:32: Uncaught Error: Java Exception occurred\r\nI/TiAPI (27596): access_db: start\r\nE/SQLiteLog(27596): (14) cannot open file at line 30185 of [00bb9c9ce4]\r\nE/SQLiteLog(27596): (14) os_unix.c:30185: (24) open(/data/data/org.camcops.camcops/databases/junk.db-journal) - \r\nE/SQLiteLog(27596): (14) cannot open file at line 30185 of [00bb9c9ce4]\r\nE/SQLiteLog(27596): (14) os_unix.c:30185: (24) open(/data/data/org.camcops.camcops/databases/junk.db-journal) - \r\nE/SQLiteLog(27596): (14) unable to open database file\r\nE/SQLiteDatabase(27596): Failed to open database '/data/data/org.camcops.camcops/databases/junk.db'.\r\nE/SQLiteDatabase(27596): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14): , while compiling: PRAGMA journal_mode\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:634)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:320)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:294)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:215)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)\r\nE/SQLiteDatabase(27596): \tat android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:977)\r\nE/SQLiteDatabase(27596): \tat android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:966)\r\nE/SQLiteDatabase(27596): \tat android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:250)\r\nE/SQLiteDatabase(27596): \tat ti.modules.titanium.database.DatabaseModule.open(DatabaseModule.java:71)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.nativeFireEvent(Native Method)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.fireEvent(V8Object.java:62)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.KrollProxy.doFireEvent(KrollProxy.java:884)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1107)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nE/SQLiteDatabase(27596): \tat android.os.Handler.dispatchMessage(Handler.java:98)\r\nE/SQLiteDatabase(27596): \tat android.os.Looper.loop(Looper.java:212)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)\r\nW/System.err(27596): java.lang.NullPointerException\r\nW/System.err(27596): \tat ti.modules.titanium.database.DatabaseModule.open(DatabaseModule.java:78)\r\nW/System.err(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.nativeFireEvent(Native Method)\r\nW/System.err(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.fireEvent(V8Object.java:62)\r\nW/System.err(27596): \tat org.appcelerator.kroll.KrollProxy.doFireEvent(KrollProxy.java:884)\r\nW/System.err(27596): \tat org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1107)\r\nW/System.err(27596): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nW/System.err(27596): \tat android.os.Handler.dispatchMessage(Handler.java:98)\r\nW/System.err(27596): \tat android.os.Looper.loop(Looper.java:212)\r\nW/System.err(27596): \tat org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)\r\nE/TiExceptionHandler(27596): (main) [163,36784] ----- Titanium Javascript Runtime Error -----\r\nE/TiExceptionHandler(27596): (main) [0,36784] - In undefined:32,32\r\nE/TiExceptionHandler(27596): (main) [0,36784] - Message: Uncaught Error: Java Exception occurred\r\nE/TiExceptionHandler(27596): (main) [0,36784] - Source: var db = Titanium.Database.open(DBNAME),\r\nE/V8Exception(27596): Exception occurred at undefined:32: Uncaught Error: Java Exception occurred\r\nI/TiAPI (27596): access_db: start\r\nE/SQLiteLog(27596): (14) cannot open file at line 30185 of [00bb9c9ce4]\r\nE/SQLiteLog(27596): (14) os_unix.c:30185: (24) open(/data/data/org.camcops.camcops/databases/junk.db-journal) - \r\nE/SQLiteLog(27596): (14) cannot open file at line 30185 of [00bb9c9ce4]\r\nE/SQLiteLog(27596): (14) os_unix.c:30185: (24) open(/data/data/org.camcops.camcops/databases/junk.db-journal) - \r\nE/SQLiteLog(27596): (14) unable to open database file\r\nE/SQLiteDatabase(27596): Failed to open database '/data/data/org.camcops.camcops/databases/junk.db'.\r\nE/SQLiteDatabase(27596): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14): , while compiling: PRAGMA journal_mode\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:634)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:320)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:294)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:215)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)\r\nE/SQLiteDatabase(27596): \tat android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)\r\nE/SQLiteDatabase(27596): \tat android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:977)\r\nE/SQLiteDatabase(27596): \tat android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:966)\r\nE/SQLiteDatabase(27596): \tat android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:250)\r\nE/SQLiteDatabase(27596): \tat ti.modules.titanium.database.DatabaseModule.open(DatabaseModule.java:71)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.nativeFireEvent(Native Method)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.fireEvent(V8Object.java:62)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.KrollProxy.doFireEvent(KrollProxy.java:884)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1107)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nE/SQLiteDatabase(27596): \tat android.os.Handler.dispatchMessage(Handler.java:98)\r\nE/SQLiteDatabase(27596): \tat android.os.Looper.loop(Looper.java:212)\r\nE/SQLiteDatabase(27596): \tat org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)\r\nW/System.err(27596): java.lang.NullPointerException\r\nW/System.err(27596): \tat ti.modules.titanium.database.DatabaseModule.open(DatabaseModule.java:78)\r\nW/System.err(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.nativeFireEvent(Native Method)\r\nW/System.err(27596): \tat org.appcelerator.kroll.runtime.v8.V8Object.fireEvent(V8Object.java:62)\r\nW/System.err(27596): \tat org.appcelerator.kroll.KrollProxy.doFireEvent(KrollProxy.java:884)\r\nW/System.err(27596): \tat org.appcelerator.kroll.KrollProxy.handleMessage(KrollProxy.java:1107)\r\nW/System.err(27596): \tat org.appcelerator.titanium.proxy.TiViewProxy.handleMessage(TiViewProxy.java:347)\r\nW/System.err(27596): \tat android.os.Handler.dispatchMessage(Handler.java:98)\r\nW/System.err(27596): \tat android.os.Looper.loop(Looper.java:212)\r\nW/System.err(27596): \tat org.appcelerator.kroll.KrollRuntime$KrollRuntimeThread.run(KrollRuntime.java:112)\r\nE/TiExceptionHandler(27596): (main) [132,36916] ----- Titanium Javascript Runtime Error -----\r\nE/TiExceptionHandler(27596): (main) [1,36917] - In undefined:32,32\r\nE/TiExceptionHandler(27596): (main) [0,36917] - Message: Uncaught Error: Java Exception occurred\r\nE/TiExceptionHandler(27596): (main) [0,36917] - Source: var db = Titanium.Database.open(DBNAME),\r\nE/V8Exception(27596): Exception occurred at undefined:32: Uncaught Error: Java Exception occurred\r\n{noformat}\r\n\r\nh4. Result if toggle_appearance() only is called from click()\r\n\r\nCrash (screen goes blank though remains invisibly unresponsive); no Titanium exception this time (though there are underlying Android exceptions).\r\n\r\nOutput from {{adb logcat | grep Ti}}:\r\n\r\n{noformat}\r\n...\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\nE/BufferQueue( 292): [org.camcops.camcops/org.appcelerator.titanium.TiActivity] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\nE/BufferQueue( 292): [org.camcops.camcops/org.appcelerator.titanium.TiActivity] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count\r\nE/BufferQueue( 292): [org.camcops.camcops/org.appcelerator.titanium.TiActivity] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count\r\nI/TiAPI (26067): toggle_appearance: start\r\nI/TiAPI (26067): toggle_appearance: end\r\n{noformat}\r\n\r\nFull output from {{adb logcat}} (NB the message {{E/QcrilMsgTunnelSocket( 2769): IOException - java.io.IOException: No such file or directory Reason: No such file or directory}} appears spontaneously and is probably unrelated to this app):\r\n\r\n{noformat}\r\n...\r\nI/TiAPI (28154): toggle_appearance: start\r\nI/TiAPI (28154): toggle_appearance: end\r\nI/TiAPI (28154): toggle_appearance: start\r\nI/TiAPI (28154): toggle_appearance: end\r\nI/TiAPI (28154): toggle_appearance: start\r\nI/TiAPI (28154): toggle_appearance: end\r\nI/TiAPI (28154): toggle_appearance: start\r\nI/TiAPI (28154): toggle_appearance: end\r\nI/TiAPI (28154): toggle_appearance: start\r\nI/TiAPI (28154): toggle_appearance: end\r\nI/TiAPI (28154): toggle_appearance: start\r\nI/TiAPI (28154): toggle_appearance: end\r\nI/TiAPI (28154): toggle_appearance: start\r\nI/TiAPI (28154): toggle_appearance: end\r\nI/TiAPI (28154): toggle_appearance: start\r\nI/TiAPI (28154): toggle_appearance: end\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nW/Adreno-EGLSUB(28154): : dequeue native buffer fail: Unknown error 2147483646, buffer=0x0, handle=0x0\r\nE/BufferQueue( 292): [org.camcops.camcops/org.appcelerator.titanium.TiActivity] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count\r\nW/Adreno-EGLSUB(28154): : dequeue native buffer fail: Invalid argument, buffer=0x0, handle=0x0\r\nW/Adreno-EGL(28154): : EGL_BAD_SURFACE\r\nW/HardwareRenderer(28154): EGL error: EGL_BAD_SURFACE\r\nW/HardwareRenderer(28154): Mountain View, we've had a problem here. Switching back to software rendering.\r\nE/Surface (28154): dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: -22\r\nE/Surface (28154): dequeueBuffer failed (Invalid argument)\r\nE/ViewRootImpl(28154): Could not lock surface\r\nE/ViewRootImpl(28154): java.lang.IllegalArgumentException\r\nE/ViewRootImpl(28154): \tat android.view.Surface.nativeLockCanvas(Native Method)\r\nE/ViewRootImpl(28154): \tat android.view.Surface.lockCanvas(Surface.java:243)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:2435)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl.draw(ViewRootImpl.java:2409)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2253)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1883)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5607)\r\nE/ViewRootImpl(28154): \tat android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)\r\nE/ViewRootImpl(28154): \tat android.view.Choreographer.doCallbacks(Choreographer.java:574)\r\nE/ViewRootImpl(28154): \tat android.view.Choreographer.doFrame(Choreographer.java:544)\r\nE/ViewRootImpl(28154): \tat android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)\r\nE/ViewRootImpl(28154): \tat android.os.Handler.handleCallback(Handler.java:733)\r\nE/ViewRootImpl(28154): \tat android.os.Handler.dispatchMessage(Handler.java:95)\r\nE/ViewRootImpl(28154): \tat android.os.Looper.loop(Looper.java:212)\r\nE/ViewRootImpl(28154): \tat android.app.ActivityThread.main(ActivityThread.java:5137)\r\nE/ViewRootImpl(28154): \tat java.lang.reflect.Method.invokeNative(Native Method)\r\nE/ViewRootImpl(28154): \tat java.lang.reflect.Method.invoke(Method.java:515)\r\nE/ViewRootImpl(28154): \tat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)\r\nE/ViewRootImpl(28154): \tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:718)\r\nE/ViewRootImpl(28154): \tat dalvik.system.NativeStart.main(Native Method)\r\nI/TiAPI (28154): toggle_appearance: start\r\nI/TiAPI (28154): toggle_appearance: end\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nE/BufferQueue( 292): [org.camcops.camcops/org.appcelerator.titanium.TiActivity] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count\r\nE/Surface (28154): dequeueBuffer failed (Invalid argument)\r\nE/ViewRootImpl(28154): Could not lock surface\r\nE/ViewRootImpl(28154): java.lang.IllegalArgumentException\r\nE/ViewRootImpl(28154): \tat android.view.Surface.nativeLockCanvas(Native Method)\r\nE/ViewRootImpl(28154): \tat android.view.Surface.lockCanvas(Surface.java:243)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:2435)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl.draw(ViewRootImpl.java:2409)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2253)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1883)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5607)\r\nE/ViewRootImpl(28154): \tat android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)\r\nE/ViewRootImpl(28154): \tat android.view.Choreographer.doCallbacks(Choreographer.java:574)\r\nE/ViewRootImpl(28154): \tat android.view.Choreographer.doFrame(Choreographer.java:544)\r\nE/ViewRootImpl(28154): \tat android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)\r\nE/ViewRootImpl(28154): \tat android.os.Handler.handleCallback(Handler.java:733)\r\nE/ViewRootImpl(28154): \tat android.os.Handler.dispatchMessage(Handler.java:95)\r\nE/ViewRootImpl(28154): \tat android.os.Looper.loop(Looper.java:212)\r\nE/ViewRootImpl(28154): \tat android.app.ActivityThread.main(ActivityThread.java:5137)\r\nE/ViewRootImpl(28154): \tat java.lang.reflect.Method.invokeNative(Native Method)\r\nE/ViewRootImpl(28154): \tat java.lang.reflect.Method.invoke(Method.java:515)\r\nE/ViewRootImpl(28154): \tat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)\r\nE/ViewRootImpl(28154): \tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:718)\r\nE/ViewRootImpl(28154): \tat dalvik.system.NativeStart.main(Native Method)\r\nE/BufferQueue( 292): [org.camcops.camcops/org.appcelerator.titanium.TiActivity] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count\r\nE/Surface (28154): dequeueBuffer failed (Invalid argument)\r\nE/ViewRootImpl(28154): Could not lock surface\r\nE/ViewRootImpl(28154): java.lang.IllegalArgumentException\r\nE/ViewRootImpl(28154): \tat android.view.Surface.nativeLockCanvas(Native Method)\r\nE/ViewRootImpl(28154): \tat android.view.Surface.lockCanvas(Surface.java:243)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:2435)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl.draw(ViewRootImpl.java:2409)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2253)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1883)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)\r\nE/ViewRootImpl(28154): \tat android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5607)\r\nE/ViewRootImpl(28154): \tat android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)\r\nE/ViewRootImpl(28154): \tat android.view.Choreographer.doCallbacks(Choreographer.java:574)\r\nE/ViewRootImpl(28154): \tat android.view.Choreographer.doFrame(Choreographer.java:544)\r\nE/ViewRootImpl(28154): \tat android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)\r\nE/ViewRootImpl(28154): \tat android.os.Handler.handleCallback(Handler.java:733)\r\nE/ViewRootImpl(28154): \tat android.os.Handler.dispatchMessage(Handler.java:95)\r\nE/ViewRootImpl(28154): \tat android.os.Looper.loop(Looper.java:212)\r\nE/ViewRootImpl(28154): \tat android.app.ActivityThread.main(ActivityThread.java:5137)\r\nE/ViewRootImpl(28154): \tat java.lang.reflect.Method.invokeNative(Native Method)\r\nE/ViewRootImpl(28154): \tat java.lang.reflect.Method.invoke(Method.java:515)\r\nE/ViewRootImpl(28154): \tat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)\r\nE/ViewRootImpl(28154): \tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:718)\r\nE/ViewRootImpl(28154): \tat dalvik.system.NativeStart.main(Native Method)\r\nI/TiAPI (28154): toggle_appearance: start\r\nI/TiAPI (28154): toggle_appearance: end\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\nD/skia (28154): ------- imageref_ashmem create failed <(null)> 36864\r\n{noformat}\r\n\r\nh4. Result if access_db() only is called from click()\r\n\r\nHaven't managed to get a crash out of this (nor by calling {{access_db()}} 10,000 times consecutively).\r\n\r\nh4. Plausible fixes that didn't help\r\n\r\nSetting {{}} in {{tiapp.xml}} made no difference.\r\n\r\nh4. Theories\r\n\r\nPossible sequence (I have no idea if this is the case):\r\n# File handle leak\r\n# -> Crash in Android display code\r\n# -> Crash in other file access (e.g. database opening) operations?\r\n\r\nh4. Possible related Android bugs\r\n\r\n[https://code.google.com/p/android/issues/detail?id=63738]\r\n[https://code.google.com/p/android/issues/detail?id=71742]\r\n", "attachment": [ { "id": "54421", "filename": "radio_selected_T.png", "author": { "name": "rudolf@pobox.com", "key": "rudolf@pobox.com", "displayName": "Rudolf Cardinal", "active": true, "timeZone": "Europe/London" }, "created": "2015-03-12T10:01:11.000+0000", "size": 6094, "mimeType": "image/png" }, { "id": "54420", "filename": "radio_selected.png", "author": { "name": "rudolf@pobox.com", "key": "rudolf@pobox.com", "displayName": "Rudolf Cardinal", "active": true, "timeZone": "Europe/London" }, "created": "2015-03-12T10:01:11.000+0000", "size": 4346, "mimeType": "image/png" }, { "id": "54423", "filename": "radio_unselected_T.png", "author": { "name": "rudolf@pobox.com", "key": "rudolf@pobox.com", "displayName": "Rudolf Cardinal", "active": true, "timeZone": "Europe/London" }, "created": "2015-03-12T10:01:11.000+0000", "size": 5479, "mimeType": "image/png" }, { "id": "54422", "filename": "radio_unselected.png", "author": { "name": "rudolf@pobox.com", "key": "rudolf@pobox.com", "displayName": "Rudolf Cardinal", "active": true, "timeZone": "Europe/London" }, "created": "2015-03-12T10:01:11.000+0000", "size": 3264, "mimeType": "image/png" } ], "flagged": false, "summary": "Views loading images crash unpredictably, also causing database-opening exceptions", "creator": { "name": "rudolf@pobox.com", "key": "rudolf@pobox.com", "displayName": "Rudolf Cardinal", "active": true, "timeZone": "Europe/London" }, "subtasks": [], "reporter": { "name": "rudolf@pobox.com", "key": "rudolf@pobox.com", "displayName": "Rudolf Cardinal", "active": true, "timeZone": "Europe/London" }, "environment": "- Titanium CLI version 3.4.1, SDK version 3.5.0.GA\r\n- Compiled on Mac OS X 10.9.5\r\n- Run under Android 4.4.4 (Sony Xperia Z2 tablet, model SGP511, processor = Qualcomm MSM8974PRO-AB, kernel 3.4.0-perf-ged66f4f, build 23.0.1.A.4.30).", "comment": { "comments": [ { "id": "350243", "author": { "name": "rudolf@pobox.com", "key": "rudolf@pobox.com", "displayName": "Rudolf Cardinal", "active": true, "timeZone": "Europe/London" }, "body": "This is not resolved by replacing all setBackgroundImage() calls with an equivalent system of show()/hide() calls on views/buttons. App still crashes. Could this be triaged, please? It has broken the app completely.", "updateAuthor": { "name": "rudolf@pobox.com", "key": "rudolf@pobox.com", "displayName": "Rudolf Cardinal", "active": true, "timeZone": "Europe/London" }, "created": "2015-04-21T13:44:58.000+0000", "updated": "2015-04-21T13:44:58.000+0000" }, { "id": "350359", "author": { "name": "rudolf@pobox.com", "key": "rudolf@pobox.com", "displayName": "Rudolf Cardinal", "active": true, "timeZone": "Europe/London" }, "body": "h4. Further diagnostics\r\n* Crash is the {{imageref_ashmem create failed}} message, from [https://code.google.com/p/skia/source/browse/trunk/src/images/SkImageRef_ashmem.cpp?spec=svn11558&r=11558] .\r\n* *Consequence* of crash appears to be that the rest of the application/UI interface gets taken down (sometimes partially, ?an individual thread crashes) -- so that the database access, UI, etc., subsequently fail.\r\n* *Lowest-level reason* for crash appears to be running out of memory. In support of that supposition, this problem occurs more frequently when lots of buttons are used. Replacing buttons (having {{setBackgroundImage()}}/{{setBackgroundSelectedImage()}} calls) with images (using {{show()}}/{{hide()}}), passing filenames to the ImageView creation, made the crash occur earlier. Specifically, the crash then occurred at initial image loading, rather than after dozens of touches, presumably because e.g. 26 widgets * 4 images per widget * 36864 bytes per image on this Android tablet's display = 3.8 Mb = too much.\r\n* *Guess* about reason for crash in code above is therefore a memory leak.\r\n\r\nh4. Workaround\r\n\r\n# Use images rather than buttons, using {{setImage()}} to change their appearance when touched, AND\r\n# Create those images ({{img = createImageView(\\{image: XXX, ...\\})}} and change their appearance ({{img.setImage(XXX)}}) using cached Blobs, rather than filenames, to save memory. Caching code example below.\r\n\r\nThis also makes the display load much faster. However, it does not allow the pseudo-buttons to appear different whilst being touched, as ImageView does not have the {{setBackgroundSelectedImage}} method, so it's visually less good.\r\n\r\nAn ideal solution might be to use a button and pass a Blob rather than a filename to its creation and image-setting methods; however, it appears that for some reason, Titanium.UI.Button doesn't support Blob parameters to its background image functions (just filenames/URLs).\r\n\r\nAnother ideal solution would be an SDK bugfix to the leak, if a leak is what's happening!\r\n\r\nh4. Specimen image-caching code\r\n\r\nNote that the {{platform}} module referred to here simply defines constants relating to which platform Titanium is running on; replace those with standalone code for real use.\r\n\r\n{code:title=imagecache.js|borderStyle=solid}\r\n/*jslint node: true */\r\n\"use strict\";\r\n/*global Titanium */\r\n\r\nvar cache = {},\r\n platform = require('lib/platform');\r\n\r\nfunction reportCacheSize() {\r\n var key,\r\n size = 0;\r\n for (key in cache) {\r\n if (cache.hasOwnProperty(key) && cache[key].length !== undefined) {\r\n size += cache[key].length;\r\n }\r\n }\r\n Titanium.API.info(\"Image cache size: \" + size);\r\n}\r\n\r\nfunction getImage(filename) {\r\n var file;\r\n if (!cache.hasOwnProperty(filename) || cache[filename] === null) {\r\n Titanium.API.info(\"Caching image: \" + filename);\r\n if (platform.mobileweb) {\r\n // ImageView creating using Blob/File objects not supported under\r\n // MobileWeb.\r\n cache[filename] = filename;\r\n } else {\r\n file = Titanium.Filesystem.getFile(\r\n Titanium.Filesystem.resourcesDirectory,\r\n filename\r\n );\r\n if (!file.exists()) {\r\n Titanium.API.warn(\"File doesn't exist: \" + filename);\r\n return null;\r\n }\r\n cache[filename] = file.read();\r\n }\r\n reportCacheSize();\r\n }\r\n return cache[filename];\r\n}\r\nexports.getImage = getImage;\r\n\r\nfunction clearCache() {\r\n var key;\r\n for (key in cache) {\r\n if (cache.hasOwnProperty(key)) { // for JSLint\r\n cache[key] = null; // for garbage collection\r\n }\r\n }\r\n cache = {};\r\n reportCacheSize();\r\n}\r\nexports.clearCache = clearCache;\r\n{code}\r\n\r\n... and then in main code, one can replace {{img.setImage(FILENAME)}} with {{img.setImage(imagecache.getImage(FILENAME))}}.", "updateAuthor": { "name": "rudolf@pobox.com", "key": "rudolf@pobox.com", "displayName": "Rudolf Cardinal", "active": true, "timeZone": "Europe/London" }, "created": "2015-04-22T08:34:18.000+0000", "updated": "2015-04-22T08:34:18.000+0000" }, { "id": "370293", "author": { "name": "jnaher", "key": "jnaher", "displayName": "Jebun Naher", "active": false, "timeZone": "Asia/Dhaka" }, "body": "Hello,\r\n\r\nWe tested this issue but couldn't reproduce it as a bug in our working environment. App runs successfully with no crash log.\r\n\r\n[Screenshot|http://postimg.org/image/oqflpjpkl/]\r\n\r\n*Console Log:*\r\n{code}\r\n[INFO] : access_db: start\r\n[INFO] : access_db: end\r\n[INFO] : toggle_appearance: start\r\n[INFO] : toggle_appearance: end\r\n{code}\r\n\r\n*Testing Environment:*\r\nAppcelerator Studio, build: 4.3.3.201510212245\r\nAppcelerator Command-Line Interface, version 5.0.4\r\nMac Osx: 10.9.5\r\nTi sdk : 5.0.2\r\nNode.js Version : 0.12.7\r\nJdk: 1.7.0_65\r\nEmulator : Samsung Galaxy S4(4.4.4);\r\nDevice: Samsung Galaxy S3\r\n\r\n*Test Code*\r\n{code}\r\n/*jslint node: true, plusplus: true */\r\n\"use strict\";\r\n/*global Titanium */\r\n\r\nvar DBNAME = \"junk.db\",\r\n PKVAL = 1,\r\n ICONSIZE = 48,\r\n IM_PR = \"/images/camcops/\", // image filename prefix\r\n ICON_RADIO_UNSELECTED = IM_PR + 'radio_unselected.png',\r\n ICON_RADIO_UNSELECTED_T = IM_PR + 'radio_unselected_T.png',\r\n ICON_RADIO_SELECTED = IM_PR + 'radio_selected.png',\r\n ICON_RADIO_SELECTED_T = IM_PR + 'radio_selected_T.png',\r\n view = Titanium.UI.createView({\r\n\tlayout : 'vertical',\r\n\tbackgroundColor : '#FFFFFF'\r\n}),\r\n button = Titanium.UI.createButton({\r\n\twidth : ICONSIZE,\r\n\theight : ICONSIZE,\r\n\ttouchEnabled : true,\r\n\tbackgroundImage : ICON_RADIO_UNSELECTED,\r\n\tbackgroundSelectedImage : ICON_RADIO_UNSELECTED_T,\r\n}),\r\n state = false,\r\n win = Titanium.UI.createWindow();\r\n\r\nfunction rnd(min, max) {\r\n\treturn Math.random() * (max - min) + min;\r\n}\r\n\r\nfunction standalone_execute_noreturn(query, args) {\r\n\tvar db = Titanium.Database.open(DBNAME),\r\n\t cursor;\r\n\tif (args === undefined) {\r\n\t\tcursor = db.execute(query);\r\n\t} else {\r\n\t\tcursor = db.execute(query, args);\r\n\t}\r\n\tif (cursor !== null) {\r\n\t\tcursor.close();\r\n\t}\r\n\tdb.close();\r\n}\r\n\r\nfunction access_db() {\r\n\tTitanium.API.info(\"access_db: start\");\r\n\tstandalone_execute_noreturn(\"UPDATE t SET value = ? WHERE pk = ?\", [rnd(0, 1000), PKVAL]);\r\n\tTitanium.API.info(\"access_db: end\");\r\n}\r\n\r\nfunction makedb() {\r\n\tstandalone_execute_noreturn(\"CREATE TABLE IF NOT EXISTS t (pk INTEGER, value INTEGER)\");\r\n}\r\n\r\nfunction toggle_appearance() {\r\n\tTitanium.API.info(\"toggle_appearance: start\");\r\n\tstate = !state;\r\n\tif (state) {\r\n\t\tbutton.setBackgroundImage(ICON_RADIO_SELECTED);\r\n\t\tbutton.setBackgroundSelectedImage(ICON_RADIO_SELECTED_T);\r\n\t} else {\r\n\t\tbutton.setBackgroundImage(ICON_RADIO_UNSELECTED);\r\n\t\tbutton.setBackgroundSelectedImage(ICON_RADIO_UNSELECTED_T);\r\n\t}\r\n\tTitanium.API.info(\"toggle_appearance: end\");\r\n}\r\nfunction click() {\r\n\taccess_db();\r\n\ttoggle_appearance();\r\n}\r\nmakedb();\r\nbutton.addEventListener(\"click\", click);\r\nview.add(button);\r\nwin.add(view);\r\nwin.open(); \r\n{code}\r\n\r\n*Steps to test:*\r\n1. Paste the reporter code in app.js file.\r\n2. Create a \"/images/camcops\" folder inside the resource folder.\r\n3. And paste the attached image to that folder.\r\n4. Run with the testing environment.\r\n5. Then Tap the button frequently\r\n\r\nThanks.", "updateAuthor": { "name": "jnaher", "key": "jnaher", "displayName": "Jebun Naher", "active": false, "timeZone": "Asia/Dhaka" }, "created": "2015-11-15T05:22:29.000+0000", "updated": "2015-11-22T12:03:48.000+0000" } ], "maxResults": 4, "total": 4, "startAt": 0 } } }