欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

怎么用源碼分析在linux上符號表的讀取

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)怎么用源碼分析在linux上符號表的讀取,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)公司專業(yè)成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì),集網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營銷、軟文發(fā)布平臺等專業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計(jì),讓網(wǎng)站在運(yùn)行后,在搜索中有好的表現(xiàn),專業(yè)設(shè)計(jì)制作為您帶來效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。

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

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

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

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

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

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

2. 共享庫中的符號相對地址偏移

可運(yùn)行程序,共享庫使用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)請參考 /hotspot/agent/os/linux/salibelf.c

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

readelf -s libjvm.so

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

readelf -l libjvm.so

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

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

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

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

cat /proc/$processid/maps

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

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

4. Java tool 保存的符號表

在jmap/jstack 中,為了提高讀取符號地址的性能,避免每一次要找符號的地址從elf文件中查找,只是在初始話的時(shí)候?qū)⒎柋肀4娉晒1?,其中key是符號的名字,內(nèi)容是符號的地址,長度。

上述就是小編為大家分享的怎么用源碼分析在linux上符號表的讀取了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站欄目:怎么用源碼分析在linux上符號表的讀取
轉(zhuǎn)載來于:http://chinadenli.net/article30/ppjdso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站排名、響應(yīng)式網(wǎng)站App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司