Merge "Clean up SQLite debugging code."

This commit is contained in:
Jeff Brown
2012-01-19 14:05:39 -08:00
committed by Android (Google) Code Review
5 changed files with 18 additions and 240 deletions

View File

@@ -486,7 +486,6 @@ public final class ActivityThread {
private static final String HEAP_COLUMN = "%13s %8s %8s %8s %8s %8s %8s";
private static final String ONE_COUNT_COLUMN = "%21s %8d";
private static final String TWO_COUNT_COLUMNS = "%21s %8d %21s %8d";
private static final String TWO_COUNT_COLUMNS_DB = "%21s %8d %21s %8d";
private static final String DB_INFO_FORMAT = " %8s %8s %14s %14s %s";
// Formatting for checkin service - update version if row format changes
@@ -867,7 +866,6 @@ public final class ActivityThread {
int binderProxyObjectCount = Debug.getBinderProxyObjectCount();
int binderDeathObjectCount = Debug.getBinderDeathObjectCount();
long openSslSocketCount = Debug.countInstancesOfClass(OpenSSLSocketImpl.class);
long sqliteAllocated = SQLiteDebug.getHeapAllocatedSize() / 1024;
SQLiteDebug.PagerStats stats = SQLiteDebug.getDatabaseInfo();
// For checkin, we print one long comma-separated list of values
@@ -935,9 +933,9 @@ public final class ActivityThread {
pw.print(openSslSocketCount); pw.print(',');
// SQL
pw.print(sqliteAllocated); pw.print(',');
pw.print(stats.memoryUsed / 1024); pw.print(',');
pw.print(stats.pageCacheOverflo / 1024); pw.print(',');
pw.print(stats.memoryUsed / 1024); pw.print(',');
pw.print(stats.pageCacheOverflow / 1024); pw.print(',');
pw.print(stats.largestMemAlloc / 1024);
for (int i = 0; i < stats.dbStats.size(); i++) {
DbStats dbStats = stats.dbStats.get(i);
@@ -1003,10 +1001,9 @@ public final class ActivityThread {
// SQLite mem info
pw.println(" ");
pw.println(" SQL");
printRow(pw, TWO_COUNT_COLUMNS_DB, "heap:", sqliteAllocated, "MEMORY_USED:",
stats.memoryUsed / 1024);
printRow(pw, TWO_COUNT_COLUMNS_DB, "PAGECACHE_OVERFLOW:",
stats.pageCacheOverflo / 1024, "MALLOC_SIZE:", stats.largestMemAlloc / 1024);
printRow(pw, ONE_COUNT_COLUMN, "MEMORY_USED:", stats.memoryUsed / 1024);
printRow(pw, TWO_COUNT_COLUMNS, "PAGECACHE_OVERFLOW:",
stats.pageCacheOverflow / 1024, "MALLOC_SIZE:", stats.largestMemAlloc / 1024);
pw.println(" ");
int N = stats.dbStats.size();
if (N > 0) {

View File

@@ -84,6 +84,7 @@ import java.util.regex.Pattern;
*/
public final class SQLiteConnection {
private static final String TAG = "SQLiteConnection";
private static final boolean DEBUG = false;
private static final String[] EMPTY_STRING_ARRAY = new String[0];
private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
@@ -668,11 +669,12 @@ public final class SQLiteConnection {
// When remove() is called, the cache will invoke its entryRemoved() callback,
// which will in turn call finalizePreparedStatement() to finalize and
// recycle the statement.
if (SQLiteDebug.DEBUG_SQL_CACHE) {
Log.v(TAG, "Could not reset prepared statement due to an exception. "
if (DEBUG) {
Log.d(TAG, "Could not reset prepared statement due to an exception. "
+ "Removing it from the cache. SQL: "
+ trimSqlForDisplay(statement.mSql), ex);
}
mPreparedStatementCache.remove(statement.mSql);
}
} else {
@@ -995,7 +997,7 @@ public final class SQLiteConnection {
}
private static final class OperationLog {
private static final int MAX_RECENT_OPERATIONS = 10;
private static final int MAX_RECENT_OPERATIONS = 20;
private static final int COOKIE_GENERATION_SHIFT = 8;
private static final int COOKIE_INDEX_MASK = 0xff;

View File

@@ -269,7 +269,6 @@ public class SQLiteCursor extends AbstractWindowedCursor {
mStackTrace);
}
close();
SQLiteDebug.notifyActiveCursorFinalized();
}
} finally {
super.finalize();

View File

@@ -48,31 +48,6 @@ public final class SQLiteDebug {
public static final boolean DEBUG_SQL_TIME =
Log.isLoggable("SQLiteTime", Log.VERBOSE);
/**
* Controls the printing of compiled-sql-statement cache stats.
*/
public static final boolean DEBUG_SQL_CACHE =
Log.isLoggable("SQLiteCompiledSql", Log.VERBOSE);
/**
* Controls the stack trace reporting of active cursors being
* finalized.
*/
public static final boolean DEBUG_ACTIVE_CURSOR_FINALIZATION =
Log.isLoggable("SQLiteCursorClosing", Log.VERBOSE);
/**
* Controls the tracking of time spent holding the database lock.
*/
public static final boolean DEBUG_LOCK_TIME_TRACKING =
Log.isLoggable("SQLiteLockTime", Log.VERBOSE);
/**
* Controls the printing of stack traces when tracking the time spent holding the database lock.
*/
public static final boolean DEBUG_LOCK_TIME_TRACKING_STACK_TRACE =
Log.isLoggable("SQLiteLockStackTrace", Log.VERBOSE);
/**
* True to enable database performance testing instrumentation.
* @hide
@@ -101,27 +76,6 @@ public final class SQLiteDebug {
* @see #getPagerStats(PagerStats)
*/
public static class PagerStats {
/** The total number of bytes in all pagers in the current process
* @deprecated not used any longer
*/
@Deprecated
public long totalBytes;
/** The number of bytes in referenced pages in all pagers in the current process
* @deprecated not used any longer
* */
@Deprecated
public long referencedBytes;
/** The number of bytes in all database files opened in the current process
* @deprecated not used any longer
*/
@Deprecated
public long databaseBytes;
/** The number of pagers opened in the current process
* @deprecated not used any longer
*/
@Deprecated
public int numPagers;
/** the current amount of memory checked out by sqlite using sqlite3_malloc().
* documented at http://www.sqlite.org/c3ref/c_status_malloc_size.html
*/
@@ -134,7 +88,7 @@ public final class SQLiteDebug {
* that overflowed because no space was left in the page cache.
* documented at http://www.sqlite.org/c3ref/c_status_malloc_size.html
*/
public int pageCacheOverflo;
public int pageCacheOverflow;
/** records the largest memory allocation request handed to sqlite3.
* documented at http://www.sqlite.org/c3ref/c_status_malloc_size.html
@@ -207,43 +161,4 @@ public final class SQLiteDebug {
* Gathers statistics about all pagers in the current process.
*/
public static native void getPagerStats(PagerStats stats);
/**
* Returns the size of the SQLite heap.
* @return The size of the SQLite heap in bytes.
*/
public static native long getHeapSize();
/**
* Returns the amount of allocated memory in the SQLite heap.
* @return The allocated size in bytes.
*/
public static native long getHeapAllocatedSize();
/**
* Returns the amount of free memory in the SQLite heap.
* @return The freed size in bytes.
*/
public static native long getHeapFreeSize();
/**
* Determines the number of dirty belonging to the SQLite
* heap segments of this process. pages[0] returns the number of
* shared pages, pages[1] returns the number of private pages
*/
public static native void getHeapDirtyPages(int[] pages);
private static int sNumActiveCursorsFinalized = 0;
/**
* Returns the number of active cursors that have been finalized. This depends on the GC having
* run but is still useful for tests.
*/
public static int getNumActiveCursorsFinalized() {
return sNumActiveCursorsFinalized;
}
static synchronized void notifyActiveCursorFinalized() {
sNumActiveCursorsFinalized++;
}
}

View File

@@ -26,13 +26,10 @@
#include <sqlite3.h>
// From mem_mspace.c in libsqlite
extern "C" mspace sqlite3_get_mspace();
namespace android {
static jfieldID gMemoryUsedField;
static jfieldID gPageCacheOverfloField;
static jfieldID gPageCacheOverflowField;
static jfieldID gLargestMemAllocField;
@@ -41,146 +38,18 @@ static jfieldID gLargestMemAllocField;
static void getPagerStats(JNIEnv *env, jobject clazz, jobject statsObj)
{
int memoryUsed;
int pageCacheOverflo;
int pageCacheOverflow;
int largestMemAlloc;
int unused;
sqlite3_status(SQLITE_STATUS_MEMORY_USED, &memoryUsed, &unused, 0);
sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &unused, &largestMemAlloc, 0);
sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &pageCacheOverflo, &unused, 0);
sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &pageCacheOverflow, &unused, 0);
env->SetIntField(statsObj, gMemoryUsedField, memoryUsed);
env->SetIntField(statsObj, gPageCacheOverfloField, pageCacheOverflo);
env->SetIntField(statsObj, gPageCacheOverflowField, pageCacheOverflow);
env->SetIntField(statsObj, gLargestMemAllocField, largestMemAlloc);
}
static jlong getHeapSize(JNIEnv *env, jobject clazz)
{
#if !NO_MALLINFO
struct mallinfo info = mspace_mallinfo(sqlite3_get_mspace());
struct mallinfo info = dlmallinfo();
return (jlong) info.usmblks;
#elif USE_MSPACE
mspace space = sqlite3_get_mspace();
if (space != 0) {
return mspace_footprint(space);
} else {
return 0;
}
#else
return 0;
#endif
}
static jlong getHeapAllocatedSize(JNIEnv *env, jobject clazz)
{
#if !NO_MALLINFO
struct mallinfo info = mspace_mallinfo(sqlite3_get_mspace());
return (jlong) info.uordblks;
#else
return sqlite3_memory_used();
#endif
}
static jlong getHeapFreeSize(JNIEnv *env, jobject clazz)
{
#if !NO_MALLINFO
struct mallinfo info = mspace_mallinfo(sqlite3_get_mspace());
return (jlong) info.fordblks;
#else
return getHeapSize(env, clazz) - sqlite3_memory_used();
#endif
}
static int read_mapinfo(FILE *fp,
int *sharedPages, int *privatePages)
{
char line[1024];
int len;
int skip;
unsigned start = 0, size = 0, resident = 0;
unsigned shared_clean = 0, shared_dirty = 0;
unsigned private_clean = 0, private_dirty = 0;
unsigned referenced = 0;
int isAnon = 0;
int isHeap = 0;
again:
skip = 0;
if(fgets(line, 1024, fp) == 0) return 0;
len = strlen(line);
if (len < 1) return 0;
line[--len] = 0;
/* ignore guard pages */
if (line[18] == '-') skip = 1;
start = strtoul(line, 0, 16);
if (len > 50 && !strncmp(line + 49, "/tmp/sqlite-heap", strlen("/tmp/sqlite-heap"))) {
isHeap = 1;
}
if (fgets(line, 1024, fp) == 0) return 0;
if (sscanf(line, "Size: %d kB", &size) != 1) return 0;
if (fgets(line, 1024, fp) == 0) return 0;
if (sscanf(line, "Rss: %d kB", &resident) != 1) return 0;
if (fgets(line, 1024, fp) == 0) return 0;
if (sscanf(line, "Shared_Clean: %d kB", &shared_clean) != 1) return 0;
if (fgets(line, 1024, fp) == 0) return 0;
if (sscanf(line, "Shared_Dirty: %d kB", &shared_dirty) != 1) return 0;
if (fgets(line, 1024, fp) == 0) return 0;
if (sscanf(line, "Private_Clean: %d kB", &private_clean) != 1) return 0;
if (fgets(line, 1024, fp) == 0) return 0;
if (sscanf(line, "Private_Dirty: %d kB", &private_dirty) != 1) return 0;
if (fgets(line, 1024, fp) == 0) return 0;
if (sscanf(line, "Referenced: %d kB", &referenced) != 1) return 0;
if (skip) {
goto again;
}
if (isHeap) {
*sharedPages += shared_dirty;
*privatePages += private_dirty;
}
return 1;
}
static void load_maps(int pid, int *sharedPages, int *privatePages)
{
char tmp[128];
FILE *fp;
sprintf(tmp, "/proc/%d/smaps", pid);
fp = fopen(tmp, "r");
if (fp == 0) return;
while (read_mapinfo(fp, sharedPages, privatePages) != 0) {
// Do nothing
}
fclose(fp);
}
static void getHeapDirtyPages(JNIEnv *env, jobject clazz, jintArray pages)
{
int _pages[2];
_pages[0] = 0;
_pages[1] = 0;
load_maps(getpid(), &_pages[0], &_pages[1]);
// Convert from kbytes to 4K pages
_pages[0] /= 4;
_pages[1] /= 4;
env->SetIntArrayRegion(pages, 0, 2, _pages);
}
/*
* JNI registration.
*/
@@ -189,10 +58,6 @@ static JNINativeMethod gMethods[] =
{
{ "getPagerStats", "(Landroid/database/sqlite/SQLiteDebug$PagerStats;)V",
(void*) getPagerStats },
{ "getHeapSize", "()J", (void*) getHeapSize },
{ "getHeapAllocatedSize", "()J", (void*) getHeapAllocatedSize },
{ "getHeapFreeSize", "()J", (void*) getHeapFreeSize },
{ "getHeapDirtyPages", "([I)V", (void*) getHeapDirtyPages },
};
int register_android_database_SQLiteDebug(JNIEnv *env)
@@ -217,9 +82,9 @@ int register_android_database_SQLiteDebug(JNIEnv *env)
return -1;
}
gPageCacheOverfloField = env->GetFieldID(clazz, "pageCacheOverflo", "I");
if (gPageCacheOverfloField == NULL) {
ALOGE("Can't find pageCacheOverflo");
gPageCacheOverflowField = env->GetFieldID(clazz, "pageCacheOverflow", "I");
if (gPageCacheOverflowField == NULL) {
ALOGE("Can't find pageCacheOverflow");
return -1;
}