2015-06-03 3 views
1

Я хотел бы установить точку останова с помощью gdb, но я не знаю соответствующего символа для метода. Есть ли способ сделать это?Как получить имя символа функции уровня JVM?

+0

Вы имеете в виду метод 'native'? В противном случае нет такой вещи, как символ. – Holger

+0

Да собственного метода – Bionix1441

+2

http://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/design.html#resolving_native_method_names – Holger

ответ

2

Я думаю, что спецификация JNI, на которую указывает комментарий, является принципиальным способом сделать это.

Однако, это также не так сложно найти функцию интерактивно из gdb. Все, что вам нужно знать, это имя вашего метода (назовем его «привет») и что имя JNI всегда начинается с «Java_». Затем вы можете задать gdb для всех соответствующих функций:

(gdb) info function ^Java_.*hello 

Это найдет все функции этого имени.

Это работает до тех пор, пока ваш метод имеет простое имя или имя camelCase. Он не будет работать для встроенных символов «_» или не-ASCII. Для этого вам придется немного прочитать спецификацию.

Теперь это не сработает, если gdb уже не может видеть функцию - например, если JNI .so еще не загружен. Вы можете выполнить это, либо работая до точки загрузки, либо используя nm или тому подобное в соответствующей библиотеке.

Смежные вопросы