如何从ant任务调试jni代码?

时间:2015-04-06 15:12:36

标签: java linux debugging ant java-native-interface

使用java 8.我有一个在Windows上正常运行的junit测试,在linux上失败。相同的代码,只为不同的平台编译。调用从java到jni到第三个lib(都是内部编写的)。我想在Linux上的jni和lib级别调试调用,这样我就可以看到变量,返回值等可能存在的差异。

在Windows上,这是一个快照:从IntelliJ运行测试,在它到达jni调用之前设置断点,启动Visual Studio并附加到正确的java进程并在其中设置断点。让它运行观察,观察我的需要。

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

2 个答案:

答案 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>

需要注意的事项:

  1. 在后台运行您的ant测试(使用&),以便您可以快速运行ps命令。

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