2012-01-06 15 views
1

私のJNI dllをテストしていますが、Cベースの関数への特定の呼び出しを実行するとシステムクラッシュが発生します。いくつかの呼び出しが動作し(getSession 1-5を参照)、何らかの原因でクラッシュします(getSession 6-8を参照)。以下は私のテスト結果のリストです。私はCの関数からすべてのロジックを削除し、ちょうどintを返します。これをさらにトラブルシューティングする方法に関するアイデアは何ですか?Java JNIで特定のシグネチャを持つC関数がクラッシュする

私のJNIとCライブラリのDLLは、Linuxの32ビットで、 make file contentsを使用してクロスコンパイルされています。これらの問題は、Windows XPだけではLinuxでは発生しません。私はSWIGを使ってJNIを生成しています。

クラッシュを生成するパターンは、ポインタ以外のパラメータより多くのポインタパラメータを持つC関数を持つように思われます。非ポインター・ポインター・パラメーターの比率が等しいか、非ポインター・パラメーター>ポインター・パラメーターであるか、または他のパラメーターなしでただ1つのポインター・パラメーターである場合、クラッシュは起こりません。

のJava JNI署名:

public final static native int getSession1(String jarg1); //works 
public final static native int getSession2(int jarg1); //works 
public final static native int getSession3(String jarg1, int jarg2); // works 
public final static native int getSession4(int jarg1, int jarg2); //works 
public final static native int getSession5(int jarg1, String jarg2, String jarg3, int jarg4); //works 

public final static native int getSession6(String jarg1, String jarg2); //causes system failure, see below for stack details 
public final static native int getSession7(String jarg1, String jarg2, int jarg3, String jarg4); //causes system failure 
public final static native int getSession8(String jarg1, String jarg2, String jarg3); //causes system failure 

C関数ヘッダ署名:

int getSession1(char *arg1); //works 
int getSession2(int arg1); //works 
int getSession3(char *ag1, int arg2); //works 
int getSession4(int arg1, int arg2); //works 
int getSession5(int arg1, char *agr2, char *arg3, int arg4); //works 

int getSession6(char *arg1, char *arg2); //crashes 
int getSession7(char *arg1, char *arg2, int arg3, char *arg4); //crashes 
int getSession8(char *arg1, char *arg2, char *arg3); 

JREシステム障害ログ(一部の内容は、明確にするために除去される):

# 
# A fatal error has been detected by the Java Runtime Environment 
# 
# EXCEPTION_SINGLE_STEP (0x80000004) at pc=0x7c90eaf0, pid=2704, tid=2396 
# 
# JRE version: 6.0_30-b12 
# Java VM: Java HotSpot(TM) Client VM (20.5-b03 mixed mode, sharing windows-x86) 
# Problematic frame: 
# C [ntdll.dll+0xeaf0] 

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

Current thread (0x003a6400): JavaThread "main" [_thread_in_native, id=2396, stack(0x00990000,0x009e0000)] 

siginfo: ExceptionCode=0x80000004 

Registers: 
EAX=0x003a654c, EBX=0x3278fc38, ECX=0x009df9a8, EDX=0x00000000 
ESP=0x009df984, EBP=0x009dfcbc, ESI=0x3278fc38, EDI=0x003a6400 
EIP=0x7c90eaf0, EFLAGS=0x00204602 

Top of Stack: (sp=0x009df984) 
0x009df984: 009df98c 009df9a8 c0000005 00000000 
0x009df994: 00000000 009dfcc7 00000002 00000001 
0x009df9a4: 0000003e 0001003f 00000000 00000000 
0x009df9b4: 00000000 00000000 00000000 00000000 
0x009df9c4: ffff027f ffff0000 ffffffff 00a0fb5a 
0x009df9d4: 073c001b 009dfc90 ffff0023 0008fb30 
0x009df9e4: 7c911538 2ca81596 00120003 2d280000 
0x009df9f4: 00030000 7c910732 00000004 26400003 

Instructions: (pc=0x7c90eaf0) 
0x7c90ead0: 83 c4 04 5a 64 a1 18 00 00 00 8b 40 30 8b 40 2c 
0x7c90eae0: ff 14 90 33 c9 33 d2 cd 2b cc 8b ff 8b 4c 24 04 
0x7c90eaf0: 8b 1c 24 51 53 e8 c7 8c 02 00 0a c0 74 0c 5b 59 
0x7c90eb00: 6a 00 51 e8 11 eb ff ff eb 0b 5b 59 6a 00 51 53 


Register to memory mapping: 

EAX=0x003a654c is an unknown value 
EBX=0x3278fc38 is an oop 
{method} 
- klass: {other class} 
ECX=0x009df9a8 is pointing into the stack for thread: 0x003a6400 
EDX=0x00000000 is an unknown value 
ESP=0x009df984 is pointing into the stack for thread: 0x003a6400 
EBP=0x009dfcbc is pointing into the stack for thread: 0x003a6400 
ESI=0x3278fc38 is an oop 
{method} 
- klass: {other class} 
EDI=0x003a6400 is a thread 


Stack: [0x00990000,0x009e0000], sp=0x009df984, free space=318k 
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) 
C [ntdll.dll+0xeaf0] KiUserExceptionDispatcher+0x4 

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) 
j com.test.jni.SampleJNI.getSession6(Ljava/lang/String;Ljava/lang/String;)I+0 
j com.test.jni.Sample.getSession6(Ljava/lang/String;Ljava/lang/String;)I+2 
j com.test.jni.Example.main([Ljava/lang/String;)V+605 
v ~StubRoutines::call_stub 

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

Java Threads: (=> current thread) 
    0x02c48c00 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=2748, stack(0x02ec0000,0x02f10000)] 
    0x02c43800 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=2372, stack(0x02e70000,0x02ec0000)] 
    0x02c41400 JavaThread "Attach Listener" daemon [_thread_blocked, id=2484, stack(0x02e20000,0x02e70000)] 
    0x02c3fc00 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=3800, stack(0x02dd0000,0x02e20000)] 
    0x02c3bc00 JavaThread "Finalizer" daemon [_thread_blocked, id=2512, stack(0x02d80000,0x02dd0000)] 
    0x02c37000 JavaThread "Reference Handler" daemon [_thread_blocked, id=3716, stack(0x02d30000,0x02d80000)] 
=>0x003a6400 JavaThread "main" [_thread_in_native, id=2396, stack(0x00990000,0x009e0000)] 

Other Threads: 
    0x02bfa400 VMThread [stack: 0x02ce0000,0x02d30000] [id=2052] 
    0x02c4bc00 WatcherThread [stack: 0x02f10000,0x02f60000] [id=3304] 

VM state:not at safepoint (normal execution) 

VM Mutex/Monitor currently owned by a thread: None 

Heap 
def new generation total 4864K, used 495K [0x22970000, 0x22eb0000, 0x27e10000) 
    eden space 4352K, 11% used [0x22970000, 0x229ebf60, 0x22db0000) 
    from space 512K, 0% used [0x22db0000, 0x22db0000, 0x22e30000) 
    to space 512K, 0% used [0x22e30000, 0x22e30000, 0x22eb0000) 
tenured generation total 10880K, used 0K [0x27e10000, 0x288b0000, 0x32770000) 
    the space 10880K, 0% used [0x27e10000, 0x27e10000, 0x27e10200, 0x288b0000) 
compacting perm gen total 12288K, used 156K [0x32770000, 0x33370000, 0x36770000) 
    the space 12288K, 1% used [0x32770000, 0x327970a0, 0x32797200, 0x33370000) 
    ro space 10240K, 51% used [0x36770000, 0x36c9da30, 0x36c9dc00, 0x37170000) 
    rw space 12288K, 55% used [0x37170000, 0x37809b50, 0x37809c00, 0x37d70000) 

Code Cache [0x00a00000, 0x00a70000, 0x02a00000) 
total_blobs=136 nmethods=5 adapters=68 free_code_cache=33101824 largest_free_block=0 

Dynamic libraries: 

VM Arguments: 


Environment Variables: 



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

OS: Windows XP Build 2600 Service Pack 2 

CPU:total 4 (2 cores per cpu, 2 threads per core) family 6 model 28 stepping 2, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, ht 

Memory: 4k page, physical 1038156k(614332k free), swap 1713032k(1398020k free) 

vm_info: Java HotSpot(TM) Client VM (20.5-b03) for windows-x86 JRE (1.6.0_30-b12), built on Nov 10 2011 01:51:00 by "java_re" with MS VC++ 7.1 (VS2003) 

time: Thu Jan 05 15:06:54 2012 
elapsed time: 0 seconds 
+0

Cの関数シグネチャにはJNIタイプを使用してください。 'jstring'は' char * 'と厳密に等価です。これはあなたの問題ではない、ちょうど私が言及したいと思った – fge

+0

1年以上の解決策はありませんか? W7とW8.1で不具合が確認されました 私はLinuxが最悪の可能性のあるプラットフォームだと思っています...すべてが初めて動作します:( – MartinMarco

答えて

1

上記のコードスニペットで、getSession7とgetSession6のシグネチャが入れ替わっていると推測されますか?スタックトレースからのシグネチャを見る 'getSession7'は2つの引数しか取らないようです。 getSession7(Ljava/lang/String;Ljava/lang/String;)

+0

訂正ありがとう! – c12

関連する問題