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

Java 如何从ant任务调试jni代码?,java,linux,debugging,ant,java-native-interface,Java,Linux,Debugging,Ant,Java Native Interface,使用Java8。我有一个junit测试,它在Windows上正常工作,在linux上失败。相同的代码,只是针对不同的平台编译。调用从java到jni再到第三个库,这两个库都是内部编写的。我想在Linux上调试jni和lib级别的调用,以便查看变量、返回值等方面可能存在的差异 在Windows上,这是一个快照:从IntelliJ运行测试,在遇到jni调用之前设置断点,启动Visual Studio并连接到适当的java进程,并在中设置断点。让它运行并观察,根据我的需要观察 我如何在Linux上做同

使用Java8。我有一个junit测试,它在Windows上正常工作,在linux上失败。相同的代码,只是针对不同的平台编译。调用从java到jni再到第三个库,这两个库都是内部编写的。我想在Linux上调试jni和lib级别的调用,以便查看变量、返回值等方面可能存在的差异

在Windows上,这是一个快照:从IntelliJ运行测试,在遇到jni调用之前设置断点,启动Visual Studio并连接到适当的java进程,并在中设置断点。让它运行并观察,根据我的需要观察


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

使用Eclipse和CDT插件可以实现同样的效果。程序基本相同: 1.启动Java项目并在开始处使用断点停止它 2.运行Cpp库代码,附加刚刚启动的Java进程

按照本教程进行设置。本教程适用于Windows,但您可以在Unix中仔细阅读。


我用的是Mac电脑。在Java进程上附加Lib之后,我遇到了一个小问题,我必须等待它启动,然后在Eclipse调试视图中单击Cpp进程并恢复Cpp进程,然后再返回Java进程并恢复它。在此之后,调试正常运行,并在任何Cpp断点上停止。

我知道这是一个迟来的答案,但我昨天刚刚做了这件事。所以我想我会分享

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

接下来,将LD_LIBRARY_路径设置为共享库退出的目录

现在,您可以通过从终端连续快速运行3个命令,将gdb连接到ant测试:

第一:运行ant测试:

$ ant <test> &
最后:附加到流程:

$ gdb -p <pid>
注意事项:

使用&在后台运行ant测试,以便可以快速运行ps命令

如果你的测试成绩很快完成不到30秒,我会考虑放线程。在java代码的开头,在第一次JNI调用之前。这样,您就有足够的时间在测试退出之前将gdb附加到进程


gdb可能很有用,你能进一步解释一下吗?我试着从gdb运行ant,但它说的是ant:文件格式无法识别。接着,我尝试在一个我想停止的方法上设置一个断点,它告诉我没有加载符号表。使用文件命令。因此,我输入了文件/path/to/libxxx.So,然后键入“run-f junit.xml”。它在尝试运行libxx.so文件时出错。嗯?你不能从gdb运行ant,听起来你想从antalso调用gdb。因此,你必须在gdb中使用某些命令进行编译,以使一切正常工作,这是gcc的旧命令行调试器。为什么我不能从gdb运行ant?它不仅仅是一个可执行文件吗?我可以分解junit代码,让我从java本身构建/运行它。有没有关于进行这种调试的教程,或者我是第一个在junit测试中调试jni加载的库的人?
$ gdb -p <pid>