调试集成 Java 和 C/C++ 的代码
2010-01-25 00:00:00 来源:WEB开发网步骤 4.当上述代码运行时,可以看到 JDB 在断点上停止。
清单 9. JDB 在断点上停止Set deferred breakpoint JNITest:58
Breakpoint hit: thread="main", JNITest.java_tripleNumber(), line=58, bci=0
58 System.out.println(" #### java ");
main[1]
不透明的 JNI 引用
JNI 引用的不透明度很高 ― 也就是说,不发布它们的结构。如果知道了对象的结构,就可以在内存中看到对象了。
在以下的摘录中,完成 Java 方法调用后,停止了一些 C 语言代码。 result 包含一个 jstring 引用。
清单 10. JNI jstring 引用Breakpoint 3, goTest (pEnv=0x3f4e50) at main.c:60
60 }
(gdb) print result
$1 = 0x3fda44
请注意,内存变量( 0x00ad1ac8 )中的地址在下面的清单 11 中显示。如果要从那个位置开始打印内存,可以看到字符串的起点。GDB 的 Cygwin 分发版提供了图形前端(它有内存编辑窗口)— 这样更容易查看字符串。
清单 11. 查看字符串(gdb) x 0x3fda44
0x3fda44: 0x00ad1ac8
(gdb) x/30s 0x00ad1ac8
0xad1ac8: "0021"
0xad1acc: ""
0xad1acd: ""
0xad1ace: ""
0xad1acf: ""
0xad1ad0: "032-"
0xad1ad4: ""
0xad1ad5: ""
0xad1ad6: ""
0xad1ad7: ""
0xad1ad8: "\022"
0xad1ada: ""
0xad1adb: ""
0xad1adc: "0"
0xad1ade: ""
0xad1adf: ""
0xad1ae0: "\022"
0xad1ae2: ""
0xad1ae3: ""
0xad1ae4: "*"
0xad1ae6: ""
0xad1ae7: ""
0xad1ae8: "C"
0xad1aea: "a"
0xad1aec: "t"
0xad1aee: " "
0xad1af0: "s"
0xad1af2: "a"
0xad1af4: "t"
0xad1af6: " "
(gdb)
更多精彩
赞助商链接