返回顶部
首页 > 资讯 > 操作系统 >怎么用源码分析在linux上符号表的读取
  • 461
分享到

怎么用源码分析在linux上符号表的读取

2023-06-17 11:06:13 461人浏览 泡泡鱼
摘要

这期内容当中小编将会给大家带来有关怎么用源码分析在linux上符号表的读取,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。通常我们使用jmap,jstack 去检查堆栈信息的时候,是不会使用-f参数的,但有

这期内容当中小编将会给大家带来有关怎么用源码分析linux上符号表的读取,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

通常我们使用jmap,jstack 去检查堆栈信息的时候,是不会使用-f参数的,但有的时候系统在无法打印出堆栈信息的时候,会建议你使用参数-F。

关于-F参数与非-F参数的区别笔者已经在前面的博客中讲述(Http://blog.csdn.net/raintungli/article/details/7023092),简单的说也就是一种是让JVM进程自己打印出堆栈信息,另有一种是直接访问jvm的堆栈区通过固定的结构找出我们需要的信息。

1. Linux-F参数的实现

在linux中可以使用ptrace的系统调用去访问运行中的进程的内存信息,具体如何实现可以参考笔者的博客(http://blog.csdn.net/raintungli/article/details/6563867)

在java中使用动态加载的方式加载jvm自己的链接共享库,jvm的核心链接共享库是libjvm.so,linux中如何动态加载可以参考(http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/#dynamiclinking)

因为是动态共享库,当想查找具体的参数的值,内存的信息的时候,就需要计算出正确的参数或者函数的地址。

2. 共享库中的符号相对地址偏移

可运行程序,共享库使用ELF格式,当运行一个程序的时候,内核会把ELF加载到用户空间,里面记录了程序的函数和数据的地址和内容,elf文件格式就不具体描述了。

在linux 中可以使用结构体ELF_EHDR,ELF_PHDR,ELF_SHDR读出elf 的program header, section header, section data.

在jvm中源码具体实现请参考 /hotspot/agent/os/linux/salibelf.c

在linux中本身就自带一个读取elf格式的工具,readelf 你可以使用不同的参数读取不同的内容。

readelf -s libjvm.so

显示共享库中的方法参数的虚拟地址,类型,名字

readelf -l libjvm.so

读取program headers,其中出现2个LOAD的类型,***个是程序的指令虚拟的起始地址,另一个是程序数据的起始地址。

通过2个地址我们就能找到共享库中的参数,函数的相对地址的偏移。

3. 进程中的符号地址

在第二章节中,得到的只是相对的地址偏移,并不是真实运行中的进程的符号地址,如何得到真实的地址在linux中就相对比较简单。

cat /proc/$processid/maps

在maps里详细记录了进程的堆栈分配的地址,包括共享库的地址,那么起始地址就是这个库分配的最小地址

进程中共享库分配的最小地址+相对地址的偏移 =真实的进程中该函数或变量的真实地址

4. Java tool 保存的符号表

在jmap/jstack 中,为了提高读取符号地址的性能,避免每一次要找符号的地址从elf文件中查找,只是在初始话的时候将符号表保存成哈希表,其中key是符号的名字,内容是符号的地址,长度。

上述就是小编为大家分享的怎么用源码分析在linux上符号表的读取了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网操作系统频道。

--结束END--

本文标题: 怎么用源码分析在linux上符号表的读取

本文链接: https://lsjlt.com/news/288510.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么用源码分析在linux上符号表的读取
    这期内容当中小编将会给大家带来有关怎么用源码分析在linux上符号表的读取,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。通常我们使用jmap,jstack 去检查堆栈信息的时候,是不会使用-f参数的,但有...
    99+
    2023-06-17
  • 如何用源码分析在linux上的safe point
    这篇文章将为大家详细讲解有关如何用源码分析在linux上的safe point,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。safe point 顾明思意,就是安全点,当需要jvm做一些操作...
    99+
    2023-06-17
  • 如何分析Java开源工具在linux上的信号处理
    今天就跟大家聊聊有关如何分析Java开源工具在linux上的信号处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。当java虚拟机启动的时候,会启动很多内部的线程,这些线程主要在th...
    99+
    2023-06-17
  • 怎么在Linux上查找和删除损坏的符号链接
    本篇内容主要讲解“怎么在Linux上查找和删除损坏的符号链接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Linux上查找和删除损坏的符号链接”吧!符号链接是指向另一个文件的 Linux ...
    99+
    2023-06-16
  • 怎么在Linux上给用户赋予指定目录的读写权限
    本篇内容主要讲解“怎么在Linux上给用户赋予指定目录的读写权限”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Linux上给用户赋予指定目录的读写权限”吧!  &nbs...
    99+
    2023-06-16
  • 在Linux上怎么给用户赋予指定目录的读写权限
    这篇文章主要讲解了“在Linux上怎么给用户赋予指定目录的读写权限”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在Linux上怎么给用户赋予指定目录的读写权限”吧!有两种方法可以实现这个目标...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作