自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java開(kāi)源工具在linux上的源碼分析(六):符號(hào)表的讀取

開(kāi)發(fā) 后端
通常我們使用jmap,jstack 去檢查堆棧信息的時(shí)候,是不會(huì)使用-f參數(shù)的,但有的時(shí)候系統(tǒng)在無(wú)法打印出堆棧信息的時(shí)候,會(huì)建議你使用參數(shù)-F。

通常我們使用jmap,jstack 去檢查堆棧信息的時(shí)候,是不會(huì)使用-f參數(shù)的,但有的時(shí)候系統(tǒng)在無(wú)法打印出堆棧信息的時(shí)候,會(huì)建議你使用參數(shù)-F。

關(guān)于-F參數(shù)與非-F參數(shù)的區(qū)別筆者已經(jīng)在前面的博客中講述(http://blog.csdn.net/raintungli/article/details/7023092),簡(jiǎn)單的說(shuō)也就是一種是讓jvm進(jìn)程自己打印出堆棧信息,另有一種是直接訪問(wèn)jvm的堆棧區(qū)通過(guò)固定的結(jié)構(gòu)找出我們需要的信息。

1. Linux-F參數(shù)的實(shí)現(xiàn)

在linux中可以使用ptrace的系統(tǒng)調(diào)用去訪問(wèn)運(yùn)行中的進(jìn)程的內(nèi)存信息,具體如何實(shí)現(xiàn)可以參考筆者的博客(http://blog.csdn.net/raintungli/article/details/6563867)

在java中使用動(dòng)態(tài)加載的方式加載jvm自己的鏈接共享庫(kù),jvm的核心鏈接共享庫(kù)是libjvm.so,linux中如何動(dòng)態(tài)加載可以參考(http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/#dynamiclinking)

因?yàn)槭莿?dòng)態(tài)共享庫(kù),當(dāng)想查找具體的參數(shù)的值,內(nèi)存的信息的時(shí)候,就需要計(jì)算出正確的參數(shù)或者函數(shù)的地址。

2. 共享庫(kù)中的符號(hào)相對(duì)地址偏移

可運(yùn)行程序,共享庫(kù)使用ELF格式,當(dāng)運(yùn)行一個(gè)程序的時(shí)候,內(nèi)核會(huì)把ELF加載到用戶空間,里面記錄了程序的函數(shù)和數(shù)據(jù)的地址和內(nèi)容,elf文件格式就不具體描述了。

在linux 中可以使用結(jié)構(gòu)體ELF_EHDR,ELF_PHDR,ELF_SHDR讀出elf 的program header, section header, section data.

在jvm中源碼具體實(shí)現(xiàn)請(qǐng)參考 /hotspot/agent/os/linux/salibelf.c

在linux中本身就自帶一個(gè)讀取elf格式的工具,readelf 你可以使用不同的參數(shù)讀取不同的內(nèi)容。

  1. readelf -s libjvm.so 

顯示共享庫(kù)中的方法參數(shù)的虛擬地址,類型,名字

  1. readelf -l libjvm.so 

讀取program headers,其中出現(xiàn)2個(gè)LOAD的類型,***個(gè)是程序的指令虛擬的起始地址,另一個(gè)是程序數(shù)據(jù)的起始地址。

通過(guò)2個(gè)地址我們就能找到共享庫(kù)中的參數(shù),函數(shù)的相對(duì)地址的偏移。

3. 進(jìn)程中的符號(hào)地址

在第二章節(jié)中,得到的只是相對(duì)的地址偏移,并不是真實(shí)運(yùn)行中的進(jìn)程的符號(hào)地址,如何得到真實(shí)的地址在linux中就相對(duì)比較簡(jiǎn)單。

  1. cat /proc/$processid/maps 

在maps里詳細(xì)記錄了進(jìn)程的堆棧分配的地址,包括共享庫(kù)的地址,那么起始地址就是這個(gè)庫(kù)分配的最小地址

  1. 進(jìn)程中共享庫(kù)分配的最小地址+相對(duì)地址的偏移 =真實(shí)的進(jìn)程中該函數(shù)或變量的真實(shí)地址 

4. Java tool 保存的符號(hào)表

在jmap/jstack 中,為了提高讀取符號(hào)地址的性能,避免每一次要找符號(hào)的地址從elf文件中查找,只是在初始話的時(shí)候?qū)⒎?hào)表保存成哈希表,其中key是符號(hào)的名字,內(nèi)容是符號(hào)的地址,長(zhǎng)度。

具體實(shí)現(xiàn)可以參考 /hotspot/src/os/linux/symtab.c build_symtab_internal 函數(shù)。

原文鏈接:http://blog.csdn.net/raintungli/article/details/7289639

【系列文章】

  1. Java開(kāi)源工具在linux上的源碼分析(一):跟蹤方式
  2. Java開(kāi)源工具在linux上的源碼分析(二):信號(hào)處理
  3. Java開(kāi)源工具在linux上的源碼分析(三):執(zhí)行的線程vm thread
  4. Java開(kāi)源工具在linux上的源碼分析(四):safe point
  5. Java開(kāi)源工具在linux上的源碼分析(五):-F參數(shù)的bug
責(zé)任編輯:林師授 來(lái)源: raintungli的博客
相關(guān)推薦

2012-03-02 12:14:19

JavaJstackJmap

2012-03-02 12:20:21

Javajmapjstack

2012-03-02 12:31:50

Javajmapjstack

2012-03-02 12:25:07

Javajmapjstack

2012-03-02 12:38:49

Javajmapjstack

2014-08-28 10:18:36

LinuxShebang

2024-08-28 10:36:19

2017-02-09 20:56:40

iOS符號(hào)表支付寶

2022-06-26 18:09:43

Linux開(kāi)源

2010-01-27 09:58:59

Linuxunix程序日志

2019-10-16 17:00:51

LinuxUbuntuVMware

2024-04-09 12:49:35

2021-03-09 11:25:04

Linux開(kāi)源工具服務(wù)器

2012-05-22 00:28:21

JavaJava開(kāi)源開(kāi)源工具

2022-06-06 14:20:25

個(gè)人財(cái)務(wù)開(kāi)源預(yù)算

2021-08-31 09:41:57

LinuxiPhone開(kāi)源工具

2021-09-01 09:47:25

Linux 工具 開(kāi)發(fā)

2020-05-09 12:01:40

Linux開(kāi)源軟件SDN

2022-12-19 14:38:59

2019-05-23 14:36:24

LinuxSOSReportxsos
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)