如何获取JVM原生级别函数的符号名?

How to get the symbol name of JVM native level function?

我想用gdb设置一个断点,但我不知道该方法对应的符号。有办法吗?

我认为评论指出的 JNI 规范是执行此操作的原则方法。

但是,从 gdb 中以交互方式找到函数也不难。您只需要知道您的方法的名称(我们称之为 "hello")并且 JNI 名称始终以 "Java_" 开头。然后你可以向gdb询问所有匹配的函数:

(gdb) info function ^Java_.*hello

这将找到该名称的所有函数。

只要您的方法具有普通名称或驼峰命名法,此方法就有效。它不适用于嵌入的“_”或非 ASCII 字符。为此,您将不得不稍微阅读一下规范。

现在,如果 gdb 无法看到该函数,这将不起作用——例如,如果 JNI .so 尚未加载。您可以通过 运行 加载点或在相关库上使用 nm 等来完成此操作。