使用java 8.我有一个在Windows上正常运行的junit测试,在linux上失败。相同的代码,只为不同的平台编译。调用从java到jni到第三个lib(都是内部编写的)。我想在Linux上的jni和lib级别调试调用,这样我就可以看到变量,返回值等可能存在的差异。
在Windows上,这是一个快照:从IntelliJ运行测试,在它到达jni调用之前设置断点,启动Visual Studio并附加到正确的java进程并在其中设置断点。让它运行观察,观察我的需要。
我如何在Linux上做同样的事情?具体来说,调试jni和lib?我可以从ant运行测试,但我可以尝试其他方式在Linux上运行它。
答案 0 :(得分: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断点上停止。
答案 1 :(得分:0)
我知道这是一个迟到的答案,但我昨天刚刚这样做了。所以我以为我会分享......
您需要做的第一件事是使用所有调试信息构建.so库。我使用了这些标志:-g -D DEBUG -O0
。这将允许您在gdb中查看源代码。
接下来,将LD_LIBRARY_PATH
设置为共享库退出的目录。
现在,您可以通过从终端快速连续运行3个命令将gdb附加到您的ant测试:
首先:运行你的蚂蚁测试:
$ ant <test> &
然后:得到你的测试的pid:
$ ps -ef | grep java
最后:附加到流程:
$ gdb -p <pid>
需要注意的事项:
在后台运行您的ant测试(使用&
),以便您可以快速运行ps
命令。
如果您的测试测试快速完成(少于30秒),那么我会考虑在您第一次JNI调用之前将Thread.sleep(30000);
放在Java代码的开头。这样,您就有足够的时间在测试退出之前将gdb附加到进程。