在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ART虛擬機method tracing技術解析

Linux閱碼場 ? 來源:內核工匠 ? 2023-04-28 09:37 ? 次閱讀

一、method tracing介紹

概述

這個是谷歌提供的對java的函數級trace工具,和systrace只支持打點不同,method tracing能支持到函數,看到具體的函數執行時間,準確的分析出來執行的時間短板。

99f6dfc0-e4eb-11ed-ab56-dac502259ad0.png

1.生成trace的方式

sampling方式:

sampling方式采用sample任務,定期抓取各個線程的調用棧,采集精度和采集的頻次正相關,同時由于java stack采集的時候需要做suspend,因此還是有一部分的效率損失。

9a32dc82-e4eb-11ed-ab56-dac502259ad0.png

我們可以看到,原生單次采集使用的是suspendall,而不是對threadlist上的線程逐個做getStackTrace,因此效率損失會比較嚴重。

trace方式:

通過在執行流程插入enter-exit來觀測:

9a4cb346-e4eb-11ed-ab56-dac502259ad0.png

相比于sample 方式,trace可以準確的獲取到每個函數的進入和退出時間,精度可以非常高。

由于art虛擬機執行特點,這個方案相較于sample方式復雜度要高不少,下文會著重介紹trace方式的實現原理

2.trace啟動流程

我們從trace方式的啟動入口開始看起

9a5f9d9e-e4eb-11ed-ab56-dac502259ad0.png

幾個關鍵的流程分別是

1.停用掉JIT GC,這個是防止stub方式替換之后,因為JIT GC引起的重新指定執行方式,釋放JIT code和entry之間存在競爭。

2.進行suspend all,這是因為后續真正開啟trace的時候,會對所有的函數入口做重新指定,必然要對整個java世界進行停頓,保證安全性。

3.注冊listener

然后進入EnableMethodTracing,真正發起tracing的核心流程。

9a81d5b2-e4eb-11ed-ab56-dac502259ad0.png

根據是否要回切解釋執行,有兩種不同的處理方式。

9a927a84-e4eb-11ed-ab56-dac502259ad0.png

具體內部流程有兩個關鍵的處理:

1.構造一個InstallStubsClassVisitor,這個的作用是遍歷所有類,然后對每個類做執行方法入口的重定向,也就是stub回填。

2.對各個線程的當前棧做一下處理,主要是植入exit frame。為什么exit point要單獨處理,我們后文詳細介紹,這個地方谷歌采用了一個非常trick的方式。

9ab28e78-e4eb-11ed-ab56-dac502259ad0.png

接下來我們繼續看InstallStubsClassVisitor遍歷class替換入口的處理:

9ac50814-e4eb-11ed-ab56-dac502259ad0.png

真正的核心處理流程其實是下述:

9adc1176-e4eb-11ed-ab56-dac502259ad0.png

如果是解釋執行方式,則把入口都換成GetQuickToInterpreterBridge

如果是stub方式,則換成了GetQuickInstrumentationEntryPoint

3.trace采集的分類

從前面的代碼流程中,我們能發現,分成了兩個類型。

采集的方式分類

interpretor only:這是最簡單粗暴的方式,直接強制整個系統回退到解釋執行。

stubs方式:這個方式是希望提升tracing開啟之后的性能表現,因此在支持解釋執行的基礎上,對JIT和AOT的函數,也做了特殊處理進行支持,而不需要強制回退到解釋執行。相比純解釋執行,這部分的技術細節更豐富,使用了一些“奇技淫巧”,本文后續著重介紹stub對JIT和AOT支持的方式。

trace執行主要是在函數進出的地方植入enter-exit對來實現對函數執行流程的打點。

因為要在一個java 方法的入口和出口植入事件的記錄,所以trace的實現就和虛擬機的執行方式強相關,我們先簡單介紹下虛擬機的幾種執行方式。

虛擬機的執行方式

解釋執行:解釋執行ART能夠全程介入java函數的執行,這就包括了函數的入棧和出棧,因此設置觀測點非常容易,直接在虛擬機執行流程中增加enter/exit埋點即可。

JIT:經過JIT編譯的dex code其實target已經是asm了,這個時候的java函數調用和arm64的native函數是非常類似的。

AOT:同JIT,區別在AOT是提前構建而JIT是運行時構建的。

我們看到啟動階段的實現,是直接插入了enter,那真正的函數入口是怎么路由處理的,這里面其實由于虛擬機設計的特殊性,直接插入wrapper有一些問題,具體的下文先補充一些虛擬機的相關知識,然后結合這些背景知識慢慢道來。

二、背景補充

要知道enter和exit的具體植入和運行原理,我們先補充一點art虛擬機的知識。

1.java函數入口

每個java方法,在虛擬機層面都維持著一個ArtMethod數據結構,每次調用一個方法,實際上是通過ArtMethod找到真正的入口,然后進行調用的。

java動態性的方式也是通過:

object->class->art method ->entrypoint來實現的

我們每次對一個對象call function,實際上就是找到對象的類型,類型里面回填了真正的artmethod,然后查找到正確的入口。

這個布局我們在看替換stub的整體流程的時候就發現了,替換stub就是沿著遍歷class-遍歷method的方式來完成的執行入口重定向。

在只有一個入口可以插入的情況下,我們很容易想到做一個wrapper,在wrapper中調用art_method同時完成跟蹤:

9af2d226-e4eb-11ed-ab56-dac502259ad0.png

圖示中的stack frame 1 2 3就是對應了我們棧上的棧幀,可以看到如果要使用wrapper方式,會在caller和真正的執行函數之間引入一個新的wrapper棧幀,我們結合下面一個點,就會發現問題。

2.walkstack

在anr,拋出異常的時候,都會對java調用棧進行遍歷,此種遍歷的邏輯主要在walkstack中完成的,這個如果加入了wrapper,會導致穿透的情況變得復雜如下圖:

9b07e184-e4eb-11ed-ab56-dac502259ad0.png

這種棧結構要兼容起來就非常的痛苦,在已有的JNI-解釋,JNI-quick,quik-quik,quik-解釋之上每種都要考慮棧內有wrapper的場景。

總結

通過上述的虛擬機的特征有如下兩個問題:

1.art_method的入口只有一個掛載點,JIT和AOT處理后的java函數調用方式也并不能提供exit事件的記錄時機。

2.最好不要導致stack結構發生變化,否則在進行棧遍歷的時候會帶來非常大的兼容負擔。

1和2看似是矛盾的,因為常規的手段,只有一個函數入口的話,需要使用wrapper,但是如果使用wrapper函數,棧結構就會發生改變。這個矛盾android使用了一個非常巧妙的方法解決,我們下文就對stub的解決方法做個詳細的介紹。

三、stub技術原理探究

因為jit和odex執行的對象實際上都是匯編,我們在匯編中調用一個函數,實際上只能insert一個entrypoint,那出棧如何實現呢?

此處其實就是使用了arm64的calling conversion偷雞,我們先看下替換的函數art_quick_instrumentation_entry,這個函數是純匯編寫的,我們看下匯編的核心處理:

9b1afd64-e4eb-11ed-ab56-dac502259ad0.png

匯編中使用bl指令調用了artInstrumentationMethodEntryFromCode(BL指令在函數結束后,ret會回到此處,而BR則是直接基于當前的contexts做跳轉,ret后就回到caller了),在artInstrumentationMethodEntryFromCode中主要做了三個事情

1.抓取并且查詢到了真實java函數的入口地址

9b2f6f6a-e4eb-11ed-ab56-dac502259ad0.png

2.記錄enter事件

3.記錄返回地址的PC(LR寄存器)

artInstrumentationMethodEntryFromCode通過x0把真正java方法的入口返回,然后art_quick_instrumentation_entry做了如下兩個事情:

1.把x30設置為art_quick_instrumentation_exit的入口地址(adr x30, 0x21a6a0)

2.通過BR跳轉到獲取的java方法入口(br x16)

這樣,在真正的被調函數完成之后ret,就會定向到exit的匯編上下文中:

9b4002d0-e4eb-11ed-ab56-dac502259ad0.png

在exit函數里面

1.記錄了出棧事件

2.還原了caller PC

通過改寫棧上位置(str x0, [sp, #504]),然后restore的時候(ldp x29, x30, [sp, #496]),就自然讀到目標lr了,同時這樣不會有寄存器污染的問題

還原lr之后,直接使用br指令跳轉到caller原始的位置。

以上就是android利用arm callingconversion實現的exit植入。

總結

如下圖所示,android通過篡改調用前的lr,結合BL和BR指令的不同ret方式,完成了單入口,在破壞棧結構的情況下,記錄了enter和exit事件對。

9b56f526-e4eb-11ed-ab56-dac502259ad0.png

四、安卓最新的演進

1.演進概述

因為復雜度和對jit的沖突,導致了不太好

目前谷歌在最新的安卓版本做出了重大的更新:

1.關閉了對odex的支持

2.在jit code生成的時候,如果開啟了tracing,會生成出帶有enter和exit的code,直接在code gen層面支持。

3.對于stub方式,不做全量的替換,使能trace的時候整個系統回退到解釋執行,然后清理jit cache,新的jit函數會直接生成帶有enter和exit的code

2.谷歌最新變更相關合入:

1.jit code中直接生成enter/exit hook調用

https://cs.android.com/android/_/android/platform/art/+/5097f83c4719a76fdfab1044ab745273841aca45

2.instrument替換掉trace odex的支持

https://cs.android.com/android/_/android/platform/art/+/890b19bd625be5d0e4a876e3eb11b8b893fb0c13

相關引用

method trace概述/舉例:https://juejin.cn/post/7107137302043820039

谷歌method trace介紹:https://developer.android.com/studio/profile/generate-trace-logs?hl=zh-cn

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 谷歌
    +關注

    關注

    27

    文章

    6171

    瀏覽量

    105507
  • 函數
    +關注

    關注

    3

    文章

    4333

    瀏覽量

    62723
  • Method
    +關注

    關注

    0

    文章

    9

    瀏覽量

    7273
  • 虛擬機
    +關注

    關注

    1

    文章

    918

    瀏覽量

    28257
  • ART
    ART
    +關注

    關注

    0

    文章

    26

    瀏覽量

    10492

原文標題:ART虛擬機method tracing技術解析

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    什么是虛擬機虛擬機真的那么好用嗎?

    在日新月異的科技世界中,虛擬技術如同一座橋梁,連接著現實與數字的鴻溝,為我們打開了全新的計算維度。虛擬機,這一概念,自其誕生以來,就以其獨特的魅力和強大的功能,深深地影響了軟件開發、系統測試和云
    的頭像 發表于 07-06 08:05 ?463次閱讀
    什么是<b class='flag-5'>虛擬機</b>?<b class='flag-5'>虛擬機</b>真的那么好用嗎?

    有關虛擬機虛擬技術的幾點詮注

    虛擬機虛擬技術給計算機應用注入了新的研究與開發點,同時也存在諸多不利因素。本文綜述了虛擬機虛擬
    發表于 06-22 18:04 ?36次下載

    虛擬機虛擬技術

    虛擬機虛擬技術給計算機應用注入了新的研究與開發點,同時也存在諸多不利因素。本文綜述了虛擬機虛擬
    發表于 09-07 10:15 ?13次下載

    基于虛擬機技術的DSC仿真系統設計

    提出了基于虛擬機技術的DCS仿真系統的實現方式,描述了虛擬控制器的具體實現方法及虛擬機技術的其他應用。
    發表于 12-03 17:26 ?26次下載
    基于<b class='flag-5'>虛擬機</b><b class='flag-5'>技術</b>的DSC仿真系統設計

    基于虛擬機技術的DCS仿真系統設計與實現

    提出了基于虛擬機技術的DCS仿真系統的實現方式,描述了虛擬控制器的具體實現方法及虛擬機技術的其他應用。
    發表于 01-16 15:04 ?2198次閱讀
    基于<b class='flag-5'>虛擬機</b><b class='flag-5'>技術</b>的DCS仿真系統設計與實現

    什么是區塊鏈虛擬機和普通虛擬機有啥區別

    區塊鏈技術領域基礎設施——虛擬機,是實現智能合約系統最為關鍵和核心的技術。智能合約不僅是業務邏輯的載體,同時又扎扎實實地落在了技術實現的層面。由此可見,
    發表于 03-04 10:50 ?4969次閱讀

    虛擬機:QEMU虛擬機和主機無線網絡通訊設置

    虛擬機:QEMU虛擬機和主機無線網絡通訊設置
    的頭像 發表于 06-22 10:19 ?5460次閱讀
    <b class='flag-5'>虛擬機</b>:QEMU<b class='flag-5'>虛擬機</b>和主機無線網絡通訊設置

    KVM虛擬機管理和基本使用

    KVM — 全稱是基于內核的虛擬機(Kernel-based Virtual Machine)是一個開源軟件,基于內核的虛擬技術,實際是嵌入系統的一個虛擬化模塊,通過優化內核來使用
    的頭像 發表于 02-07 09:20 ?1313次閱讀

    虛擬機技術合集1

    惡意代碼編寫者經常使用反虛擬機技術逃避分析,這種技術可以檢測自己是否運行在虛擬機中。如果惡意代碼探測到自己在虛擬機中運行,它會執行與其本身行
    的頭像 發表于 02-14 13:45 ?1276次閱讀

    虛擬機技術合集2

    惡意代碼編寫者經常使用反虛擬機技術逃避分析,這種技術可以檢測自己是否運行在虛擬機中。如果惡意代碼探測到自己在虛擬機中運行,它會執行與其本身行
    的頭像 發表于 02-14 13:45 ?693次閱讀
    反<b class='flag-5'>虛擬機</b><b class='flag-5'>技術</b>合集2

    虛擬機技術合集3

    惡意代碼編寫者經常使用反虛擬機技術逃避分析,這種技術可以檢測自己是否運行在虛擬機中。如果惡意代碼探測到自己在虛擬機中運行,它會執行與其本身行
    的頭像 發表于 02-14 13:45 ?658次閱讀
    反<b class='flag-5'>虛擬機</b><b class='flag-5'>技術</b>合集3

    虛擬機技術合集4

    惡意代碼編寫者經常使用反虛擬機技術逃避分析,這種技術可以檢測自己是否運行在虛擬機中。如果惡意代碼探測到自己在虛擬機中運行,它會執行與其本身行
    的頭像 發表于 02-14 13:46 ?1050次閱讀
    反<b class='flag-5'>虛擬機</b><b class='flag-5'>技術</b>合集4

    Docker與虛擬機的區別

    Docker和虛擬機是兩種不同的虛擬技術,它們在實現方式、資源消耗、運行性能等方面存在許多差異。本文將會詳細介紹它們的區別。 一、實現方式 1.1 虛擬機
    的頭像 發表于 11-23 09:37 ?9815次閱讀

    怎么安裝linux虛擬機

    在計算機領域,虛擬機是一種軟件程序,它允許在主操作系統上運行多個虛擬操作系統。Linux虛擬機在開發、測試和學習等環境中得到廣泛應用。本文將詳細介紹如何安裝Linux虛擬機,并提供一個
    的頭像 發表于 11-23 10:50 ?1117次閱讀

    虛擬機ubuntu怎么聯網

    虛擬機ubuntu怎么聯網? 虛擬機(Virtual Machine)是運行在物理(Host Machine)上的虛擬操作系統環境。在虛擬機
    的頭像 發表于 12-27 16:51 ?992次閱讀
    主站蜘蛛池模板: 夜夜嘿视频免费看| 69er小视频| 欧美亚洲在线| 1000又爽又黄禁片在线久| 思思99re66在线精品免费观看| 国产女人18毛片水真多18精品 | 18视频免费网址在线观看| 成人精品视频一区二区三区| 久久综合久色欧美婷婷| 三级黄色片免费观看| 免费xxxx大片| www天天干| 黄 色 成 年人在线| 色综合天天操| 天天操夜夜操免费视频| 亚洲精品午夜视频| bt在线天堂| 国产精品视频你懂的| 黑人性xx| 欧美一级免费观看| 色视网站| 四虎永久精品免费网址大全| 亚洲四虎永久在线播放| 中文字幕一精品亚洲无线一区| 男女交性视频免费视频| 女人十六毛片| 在线 你懂| 亚洲丁香| 午夜日韩视频| 特黄特黄aaaa级毛片免费看| 三级毛片网站| 国产稀缺精品盗摄盗拍| 国产成人经典三级在线观看| 国产精品高清一区二区三区不卡| 一丝不遮视频免费观看| 天天摸天天碰成人免费视频| 五月天婷婷亚洲| 天堂资源最新版在线www| 中国高清性色生活片| 韩国理伦片在线观看2828| 一级做a爱|