jni 函数调用一些 gdb 不知道的 libc 函数

一些名字

我有一个简单的 JNI 函数,用于将文件中的数据读取到byte[]C 代码中UnixUtil.unsafeReadToByteArray,该代码实现为:

JNIEXPORT jlong JNICALL Java_net_xxxxxxx_UnixUtil_unsafeReadToByteArray
  (JNIEnv *e, jclass jc, jint fd, jbyteArray array, jlong offset, jlong count){
  signed char *array_native_ptr = (*e) -> GetByteArrayElements(e, array, NULL);
  ssize_t bytes_read = read(fd, array_native_ptr + offset, (size_t) count);
  (*e) -> ReleaseByteArrayElements(e, array, array_native_ptr, 0);
  return bytes_read;
}

分析运行该函数的 Java 应用程序显示了一些不清楚的结果。这是顶部:

在此处输入图片说明

事实证明,最热门的事情之一0x18eb1f是来自libc-2.27.so. 我想了解它是什么,但 gdb 不知道它

(gdb) disas 0x18eb1f
No function contains specified address

Objdump'ing libc 来 grep 我发现的地址

18eb0b:       72 0f                   jb     18eb1c <__nss_group_lookup@GLIBC_2.2.5+0x24ddc>
[...]
18eb1c:       48 89 d1                mov    %rdx,%rcx
18eb1f:       f3 a4                   rep movsb %ds:(%rsi),%es:(%rdi)

看起来它是__nss_group_lookupwhile的一部分__nss_group_lookup似乎不包含地址:

(gdb) disas __nss_group_lookup
Dump of assembler code for function __nss_passwd_lookup:
   0x0000000000169d40 <+0>:     mov    rax,QWORD PTR [rip+0x281121]        # 0x3eae68
   0x0000000000169d47 <+7>:     mov    DWORD PTR fs:[rax],0x26
   0x0000000000169d4e <+14>:    mov    eax,0xffffffff
   0x0000000000169d53 <+19>:    ret    
End of assembler dump. making the things more unclear then it was before.

使事情变得比以前更不清楚。

问题:您能否给出任何提示以了解为什么属于的指令__nss_group_lookup在调用jni_GetByteArrayElements/ 时是最热的,jni_ReleaseByteArrayElements以及它实际上是什么。

我的期望是因为jni_GetByteArrayElements/jni_ReleaseByteArrayElementsbyte[]通过memcpy从 Java 堆复制到 C 堆将是最热门的。

阿潘金

显然,您系统上的 libc 不包含调试符号(.symtab共享库中没有任何部分)。因此 gdb 显示离 最接近的导出符号.dynsym,这与实际最热的函数无关。

rep movsb指令表明这个片段是memcpy实现的一部分

安装libc-dbg包(或在 Linux 发行版中的调用方式)。

例如,在我的 Ubuntu 18.04 上,地址__nss_group_lookup+0x24ddc确实指向memcpy内部:

(gdb) disas __nss_group_lookup+0x24ddc
Dump of assembler code for function __memmove_avx_unaligned_erms:
   0x00007ffffef7ead0 <+0>:     mov    %rdi,%rax
   ...
   0x00007ffffef7eb1c <+76>:    mov    %rdx,%rcx
   0x00007ffffef7eb1f <+79>:    rep movsb %ds:(%rsi),%es:(%rdi)
   0x00007ffffef7eb21 <+81>:    retq

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

不知道函数的removeEventListener

来自分类Dev

不知道如何调用函数

来自分类Dev

当我不知道签名时如何调用函数?

来自分类Dev

Chrome / Chromium不知道JavaScript函数Math.sign

来自分类Dev

Splint不知道库函数正在释放内存

来自分类Dev

在不知道类名的情况下创建函数

来自分类Dev

不知道我是否了解如何创建位函数

来自分类Dev

函数已执行,我不知道为什么

来自分类Dev

Chrome / Chromium不知道JavaScript函数Math.sign

来自分类Dev

不知道如何用Jasmine测试此异步函数

来自分类Dev

Clojure,减少函数。错误:不知道如何创建 ISeq

来自分类Dev

如何在不知道类型的情况下从泛型函数调用函数?

来自分类Dev

我不知道如何在另一个函数中调用先前创建的函数?

来自分类Dev

GDB-如何知道函数调用堆栈?

来自分类Dev

GDB-如何知道函数调用堆栈?

来自分类Dev

C ++当我不知道子类型时,从基类中调用子类函数

来自分类Dev

C ++当我不知道子类型时,从基类中调用子类函数

来自分类Dev

执行任务的角函数我不知道为什么是这个函数

来自分类Dev

绑定函数的第一个参数而又不知道其arity

来自分类Dev

如何在不知道类的情况下从另一个 dll 调用类的函数?

来自分类Dev

PHP函数语法错误,不知道为什么

来自分类Dev

Python函数正在更改输入的值,但我不知道为什么

来自分类Dev

如果不知道数组大小,如何将函数数组作为参数传递

来自分类Dev

我不知道如何在libcsv中使用某些函数的参数

来自分类Dev

处理阻塞的recv()函数之前不知道消息长度,也不想使用asy I / O

来自分类Dev

C ++函数编写不正确,不知道如何简化它[初学者]

来自分类Dev

当您不知道传递给覆盖函数的参数时,在基类中创建覆盖方法?

来自分类Dev

C ++ unordered_map emplace()函数抛出seg错误,我也不知道为什么

来自分类Dev

在不知道函数参数的情况下使用lambda创建std :: function

Related 相关文章

  1. 1

    不知道函数的removeEventListener

  2. 2

    不知道如何调用函数

  3. 3

    当我不知道签名时如何调用函数?

  4. 4

    Chrome / Chromium不知道JavaScript函数Math.sign

  5. 5

    Splint不知道库函数正在释放内存

  6. 6

    在不知道类名的情况下创建函数

  7. 7

    不知道我是否了解如何创建位函数

  8. 8

    函数已执行,我不知道为什么

  9. 9

    Chrome / Chromium不知道JavaScript函数Math.sign

  10. 10

    不知道如何用Jasmine测试此异步函数

  11. 11

    Clojure,减少函数。错误:不知道如何创建 ISeq

  12. 12

    如何在不知道类型的情况下从泛型函数调用函数?

  13. 13

    我不知道如何在另一个函数中调用先前创建的函数?

  14. 14

    GDB-如何知道函数调用堆栈?

  15. 15

    GDB-如何知道函数调用堆栈?

  16. 16

    C ++当我不知道子类型时,从基类中调用子类函数

  17. 17

    C ++当我不知道子类型时,从基类中调用子类函数

  18. 18

    执行任务的角函数我不知道为什么是这个函数

  19. 19

    绑定函数的第一个参数而又不知道其arity

  20. 20

    如何在不知道类的情况下从另一个 dll 调用类的函数?

  21. 21

    PHP函数语法错误,不知道为什么

  22. 22

    Python函数正在更改输入的值,但我不知道为什么

  23. 23

    如果不知道数组大小,如何将函数数组作为参数传递

  24. 24

    我不知道如何在libcsv中使用某些函数的参数

  25. 25

    处理阻塞的recv()函数之前不知道消息长度,也不想使用asy I / O

  26. 26

    C ++函数编写不正确,不知道如何简化它[初学者]

  27. 27

    当您不知道传递给覆盖函数的参数时,在基类中创建覆盖方法?

  28. 28

    C ++ unordered_map emplace()函数抛出seg错误,我也不知道为什么

  29. 29

    在不知道函数参数的情况下使用lambda创建std :: function

热门标签

归档