java - 运行 sqlite 语句时 JRE 崩溃

标签 java sqlite jdbc

我从来没有见过这样的事情。我花了一个多小时将它精简为我能得到的最简单的。

import java.io.File;
import java.sql.*;

public class Test {
    private static final String DB_PATH = "test.db";

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("org.sqlite.JDBC");
        new File(DB_PATH).delete();

        Connection conn = null;
        Statement s = null;
        try {
            conn = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH);

            s = conn.createStatement();
            s.execute("CREATE TABLE person (id integer primary key, name text)");
            s.execute("CREATE VIEW person_view AS SELECT p.id, p.name FROM person p");
            s.execute(""
                + "CREATE TRIGGER person_view_delete INSTEAD OF DELETE ON person_view "
                + "BEGIN delete from person where id = old.id; END"
            );
            s.executeUpdate("INSERT INTO person (id, name) VALUES (42, 'hi')");

            System.out.println("After this line...");
            s.executeUpdate("DELETE FROM person_view WHERE id = 42");
            System.out.println("And before this line...");
        } finally {
            try {
                if (s != null) s.close();
            } finally {
                if (conn != null) conn.close();
            }
        }
    }
}

这每次都会崩溃。日志文件:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x76f09b69, pid=3148, tid=5752
#
# JRE version: 7.0_15-b03
# Java VM: Java HotSpot(TM) Client VM (23.7-b01 mixed mode, sharing windows-x86 )
# Problematic frame:
# C  [msvcrt.dll+0x9b69]  memcpy+0x259
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

---------------  T H R E A D  ---------------

Current thread (0x0076a800):  JavaThread "main" [_thread_in_native, id=5752, stack(0x00d70000,0x00dc0000)]

siginfo: ExceptionCode=0xc0000005, reading address 0x00000000

Registers:
EAX=0x00000002, EBX=0x00000054, ECX=0x00000000, EDX=0x00000002
ESP=0x00dbefb0, EBP=0x00dbefb8, ESI=0x00000000, EDI=0x00dbf2a0
EIP=0x76f09b69, EFLAGS=0x00010293

Top of Stack: (sp=0x00dbefb0)
0x00dbefb0:   00dbf280 00000002 00dbefe8 6c2c6d44
0x00dbefc0:   00dbf2a0 00000000 00000002 6c2e5daa
0x00dbefd0:   00000094 0523dcd0 00dbf108 00000054
0x00dbefe0:   00000000 0523cd00 00dbf258 6c2c6b44
0x00dbeff0:   00dbf280 00000000 00000002 6c2c6d44
0x00dbf000:   00dbf2f7 6c317342 00000001 00000000
0x00dbf010:   00000005 00000000 00000005 00000000
0x00dbf020:   00000007 6c317342 00dbf298 6c2c5bae 

Instructions: (pc=0x76f09b69)
0x76f09b49:   03 88 47 03 8a 46 02 88 47 02 8a 46 01 88 47 01
0x76f09b59:   8b 45 08 5e 5f c9 c3 f3 a5 ff 24 95 b8 99 f0 76
0x76f09b69:   8a 06 88 07 8a 46 01 88 47 01 8b 45 08 5e 5f c9
0x76f09b79:   c3 83 3d 44 00 fa 76 00 0f 84 b5 fd ff ff 57 56 


Register to memory mapping:

EAX=0x00000002 is an unknown value
EBX=0x00000054 is an unknown value
ECX=0x00000000 is an unknown value
EDX=0x00000002 is an unknown value
ESP=0x00dbefb0 is pointing into the stack for thread: 0x0076a800
EBP=0x00dbefb8 is pointing into the stack for thread: 0x0076a800
ESI=0x00000000 is an unknown value
EDI=0x00dbf2a0 is pointing into the stack for thread: 0x0076a800


Stack: [0x00d70000,0x00dc0000],  sp=0x00dbefb0,  free space=315k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [msvcrt.dll+0x9b69]  memcpy+0x259
C  [libsqlitejdbc-6544525787688936286.lib+0x6d44]  Java_org_sqlite_NativeDB_column_1metadata+0x46ac
C  [libsqlitejdbc-6544525787688936286.lib+0x6b44]  Java_org_sqlite_NativeDB_column_1metadata+0x44ac
C  [libsqlitejdbc-6544525787688936286.lib+0x6e5d]  Java_org_sqlite_NativeDB_column_1metadata+0x47c5
C  [libsqlitejdbc-6544525787688936286.lib+0x6ea5]  Java_org_sqlite_NativeDB_column_1metadata+0x480d
C  [libsqlitejdbc-6544525787688936286.lib+0x37a21]  Java_org_sqlite_NativeDB_column_1metadata+0x35389
C  [libsqlitejdbc-6544525787688936286.lib+0x39b3e]  Java_org_sqlite_NativeDB_column_1metadata+0x374a6
C  [libsqlitejdbc-6544525787688936286.lib+0x228ab]  Java_org_sqlite_NativeDB_column_1metadata+0x20213
C  [libsqlitejdbc-6544525787688936286.lib+0x3a05f]  Java_org_sqlite_NativeDB_column_1metadata+0x379c7
C  [libsqlitejdbc-6544525787688936286.lib+0x3a138]  Java_org_sqlite_NativeDB_column_1metadata+0x37aa0
C  [libsqlitejdbc-6544525787688936286.lib+0x3a506]  Java_org_sqlite_NativeDB_column_1metadata+0x37e6e
C  [libsqlitejdbc-6544525787688936286.lib+0x2e694]  Java_org_sqlite_NativeDB_column_1metadata+0x2bffc
C  [libsqlitejdbc-6544525787688936286.lib+0x2e924]  Java_org_sqlite_NativeDB_column_1metadata+0x2c28c
C  [libsqlitejdbc-6544525787688936286.lib+0x4331b]  Java_org_sqlite_NativeDB_column_1metadata+0x40c83
C  [libsqlitejdbc-6544525787688936286.lib+0x446c3]  Java_org_sqlite_NativeDB_column_1metadata+0x4202b
C  [libsqlitejdbc-6544525787688936286.lib+0x45200]  Java_org_sqlite_NativeDB_column_1metadata+0x42b68
C  [libsqlitejdbc-6544525787688936286.lib+0x35e54]  Java_org_sqlite_NativeDB_column_1metadata+0x337bc
C  [libsqlitejdbc-6544525787688936286.lib+0x3613d]  Java_org_sqlite_NativeDB_column_1metadata+0x33aa5
C  [libsqlitejdbc-6544525787688936286.lib+0x36219]  Java_org_sqlite_NativeDB_column_1metadata+0x33b81
C  [libsqlitejdbc-6544525787688936286.lib+0x1b1e]  Java_org_sqlite_NativeDB_prepare+0x3c
j  org.sqlite.NativeDB.prepare(Ljava/lang/String;)J+0
j  org.sqlite.DB.prepare(Lorg/sqlite/Stmt;)V+21
j  org.sqlite.Stmt.executeUpdate(Ljava/lang/String;)I+16
j  Test.main([Ljava/lang/String;)V+83
v  ~StubRoutines::call_stub
V  [jvm.dll+0x12a34a]
V  [jvm.dll+0x1d968e]
V  [jvm.dll+0x12a3cd]
V  [jvm.dll+0xaede4]
V  [jvm.dll+0xb9157]
C  [javaw.exe+0x206c]
C  [javaw.exe+0xa5a1]
C  [javaw.exe+0xa62b]
C  [kernel32.dll+0x133aa]  BaseThreadInitThunk+0x12
C  [ntdll.dll+0x39ef2]  RtlInitializeExceptionChain+0x63
C  [ntdll.dll+0x39ec5]  RtlInitializeExceptionChain+0x36

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  org.sqlite.NativeDB.prepare(Ljava/lang/String;)J+0
j  org.sqlite.DB.prepare(Lorg/sqlite/Stmt;)V+21
j  org.sqlite.Stmt.executeUpdate(Ljava/lang/String;)I+16
j  Test.main([Ljava/lang/String;)V+83
v  ~StubRoutines::call_stub

---------------  P R O C E S S  ---------------

Java Threads: ( => current thread )
  0x00e8e800 JavaThread "Service Thread" daemon [_thread_blocked, id=5104, stack(0x04a30000,0x04a80000)]
  0x00e80c00 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=5128, stack(0x04450000,0x044a0000)]
  0x00e7f800 JavaThread "Attach Listener" daemon [_thread_blocked, id=6088, stack(0x04930000,0x04980000)]
  0x00e7c800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=4676, stack(0x047b0000,0x04800000)]
  0x00e69c00 JavaThread "Finalizer" daemon [_thread_blocked, id=5528, stack(0x04580000,0x045d0000)]
  0x00e65000 JavaThread "Reference Handler" daemon [_thread_blocked, id=1184, stack(0x044d0000,0x04520000)]
=>0x0076a800 JavaThread "main" [_thread_in_native, id=5752, stack(0x00d70000,0x00dc0000)]

Other Threads:
  0x00e63400 VMThread [stack: 0x045d0000,0x04620000] [id=1656]
  0x00ea9800 WatcherThread [stack: 0x048a0000,0x048f0000] [id=5976]

VM state:not at safepoint (normal execution)

VM Mutex/Monitor currently owned by a thread: None

Heap
 def new generation   total 4928K, used 1106K [0x23f00000, 0x24450000, 0x29450000)
  eden space 4416K,  25% used [0x23f00000, 0x24014aa8, 0x24350000)
  from space 512K,   0% used [0x24350000, 0x24350000, 0x243d0000)
  to   space 512K,   0% used [0x243d0000, 0x243d0000, 0x24450000)
 tenured generation   total 10944K, used 0K [0x29450000, 0x29f00000, 0x33f00000)
   the space 10944K,   0% used [0x29450000, 0x29450000, 0x29450200, 0x29f00000)
 compacting perm gen  total 12288K, used 580K [0x33f00000, 0x34b00000, 0x37f00000)
   the space 12288K,   4% used [0x33f00000, 0x33f91090, 0x33f91200, 0x34b00000)
    ro space 10240K,  45% used [0x37f00000, 0x38387290, 0x38387400, 0x38900000)
    rw space 12288K,  54% used [0x38900000, 0x38f8ace8, 0x38f8ae00, 0x39500000)

Card table byte_map: [0x00ec0000,0x00f70000] byte_map_base: 0x00da0800

Polling page: 0x004d0000

Code Cache  [0x02450000, 0x024f8000, 0x04450000)
 total_blobs=186 nmethods=38 adapters=84 free_code_cache=32107Kb largest_free_block=32877568

Compilation events (10 events):
Event: 0.288 Thread 0x00e80c00   33             sun.security.provider.SHA::implCompress (491 bytes)
Event: 0.290 Thread 0x00e80c00 nmethod 33 0x024f19c8 code [0x024f1b20, 0x024f20ac]
Event: 0.290 Thread 0x00e80c00   34             sun.nio.cs.SingleByte$Encoder::encode (114 bytes)
Event: 0.291 Thread 0x00e80c00 nmethod 34 0x024f2888 code [0x024f29a0, 0x024f2c70]
Event: 0.369 Thread 0x00e80c00   35             java.lang.String::<init> (67 bytes)
Event: 0.369 Thread 0x00e80c00 nmethod 35 0x024f42c8 code [0x024f4400, 0x024f4640]
Event: 0.370 Thread 0x00e80c00   36             java.util.Arrays::copyOfRange (63 bytes)
Event: 0.371 Thread 0x00e80c00 nmethod 36 0x024f4808 code [0x024f4960, 0x024f4cf8]
Event: 0.372 Thread 0x00e80c00   38             java.lang.Integer::reverseBytes (26 bytes)
Event: 0.372 Thread 0x00e80c00 nmethod 38 0x024f5248 code [0x024f5340, 0x024f53d0]

GC Heap History (0 events):
No events

Deoptimization events (0 events):
No events

Internal exceptions (10 events):
Event: 0.177 Thread 0x0076a800 Threw 0x23f6f700 at C:\jdk7u2_32P\jdk7u15\hotspot\src\share\vm\prims\jvm.cpp:1166
Event: 0.181 Thread 0x0076a800 Threw 0x23f714d8 at C:\jdk7u2_32P\jdk7u15\hotspot\src\share\vm\prims\jvm.cpp:1166
Event: 0.214 Thread 0x0076a800 Threw 0x23f7a8c8 at C:\jdk7u2_32P\jdk7u15\hotspot\src\share\vm\prims\jvm.cpp:1166
Event: 0.216 Thread 0x0076a800 Threw 0x23f7f950 at C:\jdk7u2_32P\jdk7u15\hotspot\src\share\vm\prims\jvm.cpp:1166
Event: 0.217 Thread 0x0076a800 Threw 0x23f85a80 at C:\jdk7u2_32P\jdk7u15\hotspot\src\share\vm\prims\jvm.cpp:1166
Event: 0.221 Thread 0x0076a800 Threw 0x23f897e8 at C:\jdk7u2_32P\jdk7u15\hotspot\src\share\vm\prims\jvm.cpp:1166
Event: 0.409 Thread 0x0076a800 Threw 0x23ff5c10 at C:\jdk7u2_32P\jdk7u15\hotspot\src\share\vm\prims\jvm.cpp:1166
Event: 0.413 Thread 0x0076a800 Threw 0x23ff8c18 at C:\jdk7u2_32P\jdk7u15\hotspot\src\share\vm\prims\jvm.cpp:1166
Event: 0.414 Thread 0x0076a800 Threw 0x23ffe960 at C:\jdk7u2_32P\jdk7u15\hotspot\src\share\vm\prims\jvm.cpp:1166
Event: 0.420 Thread 0x0076a800 Threw 0x24007ac8 at C:\jdk7u2_32P\jdk7u15\hotspot\src\share\vm\prims\jvm.cpp:1166

Events (10 events):
Event: 0.412 loading class 0x04b5af90
Event: 0.413 loading class 0x04b5af90 done
Event: 0.414 loading class 0x04bd0740
Event: 0.414 loading class 0x04bd0740 done
Event: 0.418 loading class 0x04bd0a38
Event: 0.419 loading class 0x04bd0a38 done
Event: 0.420 loading class 0x04bd06c8
Event: 0.420 loading class 0x04bd06c8 done
Event: 0.421 loading class 0x04bc42b8
Event: 0.422 loading class 0x04bc42b8 done


Dynamic libraries:
0x01020000 - 0x0104f000     C:\Program Files (x86)\Java\jdk1.7.0_15\bin\javaw.exe
0x77920000 - 0x77aa0000     C:\Windows\SysWOW64\ntdll.dll
0x75060000 - 0x75170000     C:\Windows\syswow64\kernel32.dll
0x76990000 - 0x769d7000     C:\Windows\syswow64\KERNELBASE.dll
0x751e0000 - 0x75280000     C:\Windows\syswow64\ADVAPI32.dll
0x76f00000 - 0x76fac000     C:\Windows\syswow64\msvcrt.dll
0x76ee0000 - 0x76ef9000     C:\Windows\SysWOW64\sechost.dll
0x76c10000 - 0x76d00000     C:\Windows\syswow64\RPCRT4.dll
0x75000000 - 0x75060000     C:\Windows\syswow64\SspiCli.dll
0x74ff0000 - 0x74ffc000     C:\Windows\syswow64\CRYPTBASE.dll
0x755a0000 - 0x756a0000     C:\Windows\syswow64\USER32.dll
0x767a0000 - 0x76830000     C:\Windows\syswow64\GDI32.dll
0x76550000 - 0x7655a000     C:\Windows\syswow64\LPK.dll
0x75500000 - 0x7559d000     C:\Windows\syswow64\USP10.dll
0x726c0000 - 0x7285e000     C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_41e6975e2bd6f2b2\COMCTL32.dll
0x76fb0000 - 0x77007000     C:\Windows\syswow64\SHLWAPI.dll
0x75170000 - 0x751d0000     C:\Windows\system32\IMM32.DLL
0x75430000 - 0x754fc000     C:\Windows\syswow64\MSCTF.dll
0x676d0000 - 0x6778e000     C:\Program Files (x86)\Java\jdk1.7.0_15\jre\bin\msvcr100.dll
0x66af0000 - 0x66e3c000     C:\Program Files (x86)\Java\jdk1.7.0_15\jre\bin\client\jvm.dll
0x6f3e0000 - 0x6f3e7000     C:\Windows\system32\WSOCK32.dll
0x76ba0000 - 0x76bd5000     C:\Windows\syswow64\WS2_32.dll
0x76d20000 - 0x76d26000     C:\Windows\syswow64\NSI.dll
0x729b0000 - 0x729e2000     C:\Windows\system32\WINMM.dll
0x751d0000 - 0x751d5000     C:\Windows\syswow64\PSAPI.DLL
0x67e20000 - 0x67e2c000     C:\Program Files (x86)\Java\jdk1.7.0_15\jre\bin\verify.dll
0x677e0000 - 0x67800000     C:\Program Files (x86)\Java\jdk1.7.0_15\jre\bin\java.dll
0x6a040000 - 0x6a053000     C:\Program Files (x86)\Java\jdk1.7.0_15\jre\bin\zip.dll
0x6ea20000 - 0x6ea36000     C:\Windows\system32\CRYPTSP.dll
0x6e990000 - 0x6e9cb000     C:\Windows\system32\rsaenh.dll
0x72a00000 - 0x72a17000     C:\Windows\system32\USERENV.dll
0x729f0000 - 0x729fb000     C:\Windows\system32\profapi.dll
0x6a060000 - 0x6a074000     C:\Program Files (x86)\Java\jdk1.7.0_15\jre\bin\net.dll
0x6e9e0000 - 0x6ea1c000     C:\Windows\system32\mswsock.dll
0x73ea0000 - 0x73ea6000     C:\Windows\System32\wship6.dll
0x71f80000 - 0x71f90000     C:\Windows\system32\NLAapi.dll
0x72600000 - 0x72610000     C:\Windows\system32\napinsp.dll
0x725e0000 - 0x725f2000     C:\Windows\system32\pnrpnsp.dll
0x6d7d0000 - 0x6d814000     C:\Windows\system32\DNSAPI.dll
0x725d0000 - 0x725d8000     C:\Windows\System32\winrnr.dll
0x72060000 - 0x72065000     C:\Windows\System32\wshtcpip.dll
0x728c0000 - 0x728dc000     C:\Windows\system32\IPHLPAPI.DLL
0x728b0000 - 0x728b7000     C:\Windows\system32\WINNSI.DLL
0x741a0000 - 0x741a6000     C:\Windows\system32\rasadhlp.dll
0x6be50000 - 0x6be88000     C:\Windows\System32\fwpuclnt.dll
0x6a030000 - 0x6a03e000     C:\Program Files (x86)\Java\jdk1.7.0_15\jre\bin\nio.dll
0x6c2c0000 - 0x6c322000     C:\Users\Paul\AppData\Local\Temp\libsqlitejdbc-6544525787688936286.lib
0x72250000 - 0x7233b000     C:\Windows\system32\dbghelp.dll

VM Arguments:
jvm_args: -Dfile.encoding=Cp1252 
java_command: Test
Launcher Type: SUN_STANDARD

Environment Variables:
JAVA_HOME=C:\Program Files (x86)\Java\jdk1.7.0_15
PATH=C:/Program Files (x86)/Java/jre7/bin/client;C:/Program Files (x86)/Java/jre7/bin;C:/Program Files (x86)/Java/jre7/lib/i386;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Git\cmd;C:\Program Files (x86)\PharosSystems\Core;C:\Program Files (x86)\Java\jdk1.7.0_15\bin;C:\eclipse;
USERNAME=Paul
OS=Windows_NT
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 15 Stepping 13, GenuineIntel



---------------  S Y S T E M  ---------------

OS: Windows 7 , 64 bit Build 7601 Service Pack 1

CPU:total 2 (2 cores per cpu, 1 threads per core) family 6 model 15 stepping 13, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, tsc

Memory: 4k page, physical 3143744k(933004k free), swap 6285632k(3672076k free)

vm_info: Java HotSpot(TM) Client VM (23.7-b01) for windows-x86 JRE (1.7.0_15-b03), built on Feb 15 2013 14:01:25 by "java_re" with unknown MS VC++:1600

time: Thu Apr 04 05:46:55 2013
elapsed time: 0 seconds

我正在使用 sqlitejdbc-v056,我正在使用 Eclipse 进行开发。

我已将其导出为 jar 并运行;我已经在命令行(在 Eclipse 之外)上将其全部编译为 .class。在这两种情况下,我都无法重现这一点。

奇怪的是,如果我将 View 定义为 CREATE VIEW person_view AS SELECT id, name FROM person,我不会收到任何错误。

我个人祝贺任何能理解为什么会发生这种情况的人。 (我也很想知道是否有其他人可以复制它。)

最佳答案

对于是否要将其作为答案或评论,我有两种想法。这不是 OP 的答案,但可能对 future 的读者非常有用。建议 future 的读者检查他们是否拥有最新版本,因为这解决了 OP 的问题。

如果不是答案,我为什么要发布?... 我刚刚遇到了一个非常相似的错误,仅根据错误无法将其与此错误区分开来。我尝试了很多不同版本的 xerial sqlite-library 并遇到了同样的问题。

在谷歌上搜索了很长时间后,除了一片空白之外什么也没有,我最终发现这个错误是由我的代码触发的。我有效地调用了:

conn = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH);
s = conn.createStatement();
s.execute(null); // oops

发生这种情况是因为我的所有查询都在运行时打包并单独加载,不正确的引用导致空指针出现在应该有查询的地方。

一般来说,您不希望您的代码所做的任何事情都会导致 JVM 崩溃。然而,对于基于 JNI 的库而言,情况并非总是如此。似乎 xerial sqlite-jdbc 库没有进行完整的空检查,有些事情(例如空 SQL 查询)会导致它在空指针上使 JVM 崩溃。

空指针在错误文件中由地址“0x00000000”显示:

siginfo: ExceptionCode=0xc0000005, reading address 0x00000000

然而,由于这也出现在 OP 的问题中,因此似乎以前版本中的错误无论如何都会导致这种情况。

关于java - 运行 sqlite 语句时 JRE 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15810482/

相关文章:

Java Spring JdbcTemplate

java - 循环无向图中的所有可能路径

android - 如何将 SQLite 数据库传输到 Android 手机 (android) 上的 Web 服务器

android - SQLite 与 Realm 在黑客数据安全方面的比较

java - 如何使用 URL 参数关闭 HSQL DB 中的日志记录?

java - JSF、网站首次设置和外部配置文件

java - XMPP服务器不响应Smack登录请求

java - Java NIO 是否支持广播或多播?

Java、ICS 日历格式在 Outlook 或 Thunderbird 中导入时不显示时间

android - 使用 ListView 在下一个 Activity 中显示数据库详细信息