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

时间:2019-06-04 16:25:50

标签: java c performance file-io jvm

我有一个简单的JNI函数,可用来将文件中的数据从C代码byte[]读取到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应用程序进行性能分析显示了一些不清楚的结果。这是顶部:

enter image description here

最热门的事情之一是来自0x18eb1f的地址libc-2.27.so的指令。我想了解它是什么,但gdb对此一无所知

(gdb) disas 0x18eb1f
No function contains specified address

禁止使用libc复制我发现的地址

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_lookup的一部分,而__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.

使事情比以前更不清楚。

问题: :在调用{{1时,为什么属于__nss_group_lookup的指令为什么最热门? }} / jni_GetByteArrayElements及其实际含义。

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

1 个答案:

答案 0 :(得分:2)

显然,您系统上的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