【问题标题】:How to debug jni code from ant task?如何从 ant 任务中调试 jni 代码?
【发布时间】:2016-04-13 16:17:57
【问题描述】:

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

在 Windows 上,这很简单:从 IntelliJ 运行测试,在遇到 jni 调用之前设置断点,启动 Visual Studio 并附加到正确的 java 进程并在其中设置断点。让它运行并观察,根据需要观察。

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

【问题讨论】:

  • gdb 可能很好用
  • 您能进一步说明一下吗?我尝试从 gdb 运行 ant,但它说(关于 ant):“文件格式无法识别”。继续,我试图在我想要停止的方法上设置断点,它告诉我“没有加载符号表。使用文件命令”。所以我输入“file /path/to/libxxx.so”,然后输入“run -f junit.xml”。它在尝试运行 libxx.so 文件时出现了段错误。
  • 嗯?你不能从 gdb 运行 ant,听起来你想从 ant 调用 gdb
  • 也可以使用,你必须在 gdb 中使用某些命令进行编译才能使一切正常运行,它是 gcc 的旧命令行调试器。
  • 为什么我不能从 gdb 运行 ant - 它不仅仅是要运行的可执行文件吗?我可以打破junit代码,让我从java本身构建/运行它。任何关于进行此类调试的教程,还是我是第一个在 junit 测试中调试 jni 加载的库的人?

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


【解决方案1】:

您可以使用带有 CDT 插件的 Eclipse 实现相同的目的。程序基本相同: 1.启动Java项目,一开始就用断点停止 2.运行Cpp库代码,附上刚刚启动的Java进程

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

我正在使用 Mac 来执行此操作。我只是在将 Lib 附加到 Java 进程后出现了一个小问题,我必须等待它启动,然后单击 Cpp 进程(在 Eclipse Debug 视图中)并恢复 cpp 进程,然后再返回Java 进程并恢复它。之后调试正常运行并在任何 Cpp 断点处停止。

【讨论】:

    【解决方案2】:

    我知道这是一个迟到的答案,但我昨天才这样做。所以我想我会分享...

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

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

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

    首先:运行你的 ant 测试:

    $ ant <test> &
    

    然后:获取测试的 pid:

    $ ps -ef | grep java
    

    最后:附加到进程:

    $ gdb -p <pid>
    

    注意事项:

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-01
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多