2015-04-06 30 views
1

使用java 8.我有一个junit测试,可以在Windows上正常工作,并在Linux上失败。相同的代码,只为不同的平台编译。调用从java到jni到第三个库(都是内部编写的)。我想在Linux上的jni和lib级别调试调用,以便我可以看到变量,返回值等可能存在的差异。如何从蚂蚁任务调试jni代码?

在Windows上,这是一个快速:从IntelliJ运行测试,set断点即将到达jni调用之前,启动Visual Studio并附加到适当的java进程并在其中设置断点。让它运行并观察,随时观察。

如何在Linux上做同样的事情?具体来说,调试jni和lib?我可以从蚂蚁运行测试,但是可以尝试其他方式在Linux上运行它。

+0

gdb可能很好用 – jgr208

+0

你可以进一步了解一下吗?我尝试从gdb运行ant,但它说(关于ant):“文件格式无法识别”。继续,我试图在我想停止的方法上设置一个断点,它告诉我我没有加载符号表,使用文件命令。所以我输入了“file /path/to/libxxx.so”,然后键入'run -f junit.xml',它试图运行libxx.so文件时进行了segfaulted。 – Jon

+0

呵呵?你不能从gdb运行ant,它听起来就像你想从蚂蚁调用gdb – jgr208

回答

0

您可以使用Eclipse与CDT插件实现相同的功能。该过程基本上是一样的: 1.启动Java项目,并在一开始 2.运行CPP的库代码中设置断点停止它,重视刚开始

按照本教程设置它的Java进程。本教程适用于Windows,但您可以密切关注Unix。 http://codeandme.blogspot.com.br/2011/09/jni-made-easy.html

我正在用Mac来做到这一点。在Java进程上附加Lib后,我刚刚遇到了一些问题,我必须稍等一会才能启动它,然后单击Cpp进程(在Eclipse Debug视图中)并恢复cpp进程,然后再返回到Java进程并恢复它。之后,调试正常运行并停止在任何Cpp断点上。

0

我知道这是一个迟到的答案,但我昨天刚刚完成了这个。所以我想我会分享...

你需要做的第一件事就是用你所有的调试信息构建你的.so库。我用这些标志:-g -D DEBUG -O0。这将允许你在gdb中看到你的源代码。

接下来,将LD_LIBRARY_PATH设置为共享库退出的目录。现在

,您可以通过快速连续的终端中运行三个命令连接GDB到Ant测试:

第一:运行Ant试验:

$ ant <test> & 

则:得到的PID你测试:

$ ps -ef | grep java 

最后:连接到进程:

$ gdb -p <pid> 

注意事项:

  1. 运行在后台蚂蚁测试(与&),这样就可以快速运行ps命令。

  2. 如果您的测试测试快速完成(少于30秒),那么我会考虑在您的第一个JNI调用之前将Thread.sleep(30000);置于Java代码的开头。这样可以在测试退出之前有足够的时间将gdb附加到进程。