【问题标题】:Debugging shared library .so with JNI using gdb使用 gdb 使用 JNI 调试共享库 .so
【发布时间】:2022-01-27 07:23:09
【问题描述】:

我有一个使用 JNI 调用 c/cpp 代码(它是 .so 文件)的 java 应用程序。 我正在使用这个 .so 文件中的 API。我要调试.so文件,怎么调试?

我尝试了以下方法:

  1. 我将 gdb 附加到 xyz.so 并添加断点。
  2. 运行java代码

但无法命中断点。 你能建议如何调试它。 在断点之后,我无法运行 r 或 c(继续)。

那么在这种情况下我们该如何调试呢?

提前致谢。

【问题讨论】:

    标签: c++ c linux gdb .so


    【解决方案1】:

    当你编译某些东西时,作为输出,你有汇编代码(由计算机运行)和符号(你的源代码和汇编代码)。

    为了调试 C/C++ 部分,您必须具有适当的符号,以便能够以与 java 中相同的用户体验放置断点。否则,您只会看到一个巨大的数字序列,而您所做的实际上是逆向工程代码。

    因此,您需要默认不发货的符号(您应该询问供应商是否可以提供)。

    【讨论】:

    • 从 Java 调用的 C++ 代码的问题是它通常在 java 中不可见。这些 .so 文件在运行时动态加载
    • Java 原生调试器看不到什么是“非 java”。能够处理其他语言(如 C++)的调试器将能够显示更好的图片,前提是符号可用。调试器可以在加载相应的代码单元后立即加载符号,如果他们能够找到它们的话。如果您设法获取符号并将它们存储在符号路径中,调试器将使用它们。
    • 感谢您的意见。我试过这个并且它工作了附加的java进程到gdb添加bteakpoints来应对它在cpp模块中按c(gdb continue cmd)gdb在断点处停止
    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2017-02-23
    • 2010-10-16
    • 2020-04-28
    • 2012-01-26
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多