1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Debug 實(shí)現(xiàn)原理!還不懂嗎?

        共 5011字,需瀏覽 11分鐘

         ·

        2022-01-04 19:41


        1

        前言


        本文將會(huì)講述JPDA的組成,Debugger的實(shí)現(xiàn)原理等。


        程序異常了!

        返回結(jié)果不對!

        在我這兒正常啊。


        每一次遇到這種異常的情況,要處理問題時(shí),我們一定會(huì)想到


        “等我Debug一下,分分鐘解決?!?/span>


        而如果是線上的問題,我們一定會(huì)想


        “如果能debug一下該多好啊”


        我們在說起Debug的時(shí)候,一般是在IDE里代碼中加斷點(diǎn),一步步跟蹤。然后觀察變量的值,觀察輸出等等。


        這種在Debug工具,許多IDE中都有提供,像Eclipse,DEA,NetBeans,甚至我們可以直接使用JDK自帶的jdb工具進(jìn)行高度。這些工具都支持本地調(diào)試和遠(yuǎn)程調(diào)試。


        那在我們加斷點(diǎn),debug,單步調(diào)試等一系列動(dòng)作背后,是如何實(shí)現(xiàn)的呢?


        說到這些,就不得不提JPDA(Java Platform Debugger Architecture)。我們每次使用的debug功能,都是靠JPDA的支撐實(shí)現(xiàn)的。














        大道至簡,是宇宙萬物發(fā)展之規(guī)律,是中華文化之精髓,是中華道家哲學(xué),是大道理極其簡單,簡單到一兩句話就能說明白。所謂“真?zhèn)饕痪湓?,假傳萬卷書”?!叭f物之始,大道至簡,衍化至繁”出自老子的《道德經(jīng)》。大道至簡,不僅被哲學(xué)流派道家、儒家等所重視,也是人生在世的生活境界。


        大道至簡,大道無形,大道無法,這是一種大道自然、返樸歸真的高級功態(tài)。在這種清凈無為、忘我無私、天人合一的狀態(tài)中,不求長功,功力自然上長;不求治病,身心自然調(diào)整;不求功能,功能自然顯現(xiàn);你不求大小周天,百脈自然暢通,最深刻的真理是最簡單最普通的真理。把最復(fù)雜的變成最簡單的,才是最高明的。最偉大的人僅僅因?yàn)楹唵尾棚@得崇高。


        大道至簡,人生亦簡。開悟,深?yuàn)W了就簡單,簡單了才深?yuàn)W,從看山是山,到看山是山,境界不一樣,從簡單到復(fù)雜,再從復(fù)雜到簡單,就是升華。生活的意義在于簡單,人修煉到一定程度,會(huì)淡泊一些事,會(huì)簡單,你可以理解別人,但別人不一定理解你,其實(shí)人不在理解,在認(rèn)同。


        精于心,簡于形??絾栰`魂這是人的終極問題,簡不僅是一種至美,也是一種能力、一種境界??赐噶瞬徽f透,高境界;朦朧地看,心透 ;透非透、 知未知 ,故意不看透,才是透徹;知道世事看不透,就是透,透徹后的不透徹,明白后的不明白,難得糊涂是真境界。


        “大道至簡”是做人的智慧,做人做事要將一件復(fù)雜的事情化為簡單,那是需要智慧的。將繁雜的事情回歸到簡單,要有智慧、能力,也要有決心。有智慧的人都喜歡大道至簡,因此,功和利,不可趨之若鶩;名和財(cái),不可為之所累。淡泊以明志,寧靜以致遠(yuǎn)。我們要簡簡單單的做人,踏踏實(shí)實(shí)的做事,用智慧化難為簡。


        為名利盡拋寵辱,清純似兒時(shí)天真的童貞,樸實(shí)如父輩耕耘的沃土,只有心情平靜的人方能視見“斜陽照墟落,窮巷牛羊歸”的悠閑,聽聞“荷風(fēng)送秋氣,竹露滴清響”的天籟,感受那“空山不見人,但聞人語響”的空曠。陶淵明就是這樣的人,所以他能夠吟出“采菊東籬下,悠然見南山”的絕句;歐陽修也是這樣的一個(gè)人,所以他在謫居時(shí)仍能悠然自得的寫出《醉翁亭記》。


        大道至簡,人生亦簡。簡不是物質(zhì)的貧乏,而是精神的自在;簡不是生命的空虛,而是心靈的單純。大道至簡是最高的道理往往是最簡明的,人要學(xué)會(huì)簡單、簡樸生活、簡捷行事,放下自己的私心雜念,當(dāng)超出自我欲望的牢籠,當(dāng)真正忘記自己的思想,忘記自己的意識(shí),進(jìn)入忘我忘物的狀態(tài)。


        人生的繁出于惑,以“仁”抗拒誘惑,以“智”解除困惑。不惑,才是人生由繁入簡的標(biāo)志。弱水三千,我只取一瓢飲;人生百態(tài),須當(dāng)從一而終。樂以忘憂,簡以存真,才是人生的“大道至簡”。


        有個(gè)大道至簡、平常心是道的故事:一個(gè)行者問老道長:“您得道前,做什么?”老道長:“砍柴擔(dān)水做飯?!毙姓邌枺骸澳堑玫篮竽兀俊崩系篱L:“砍柴擔(dān)水做飯?!毙姓哂謫枺骸澳呛沃^得道?”老道長:“得道前,砍柴時(shí)惦記著挑水,挑水時(shí)惦記著做飯;得道后,砍柴即砍柴,擔(dān)水即擔(dān)水,做飯即做飯?!崩系篱L和行者的對話讓我們開悟,許多至高至深的道理都是含蘊(yùn)在一些極其簡單的思想中。


        大道至簡,人生易簡。一千個(gè)人有一千種生存方式和生活道路,走過歲月、走過生活,心里有許多的感慨,一切放下,一切自在;當(dāng)下放下,當(dāng)下自在,生活中的很多問題并不需要放在心里,人生的很多負(fù)擔(dān)并不需要挑在肩上。一念放下,才能感受到簡單生活的樂趣,才能感受到心靈飛翔的快感。要想改變一些事情,首先得把自己給找回來。我們都有潛在的能量,只是很容易:被習(xí)慣所掩蓋,被時(shí)間所迷離,被惰性所消磨。我們應(yīng)該記住該記住的,忘記該忘記的,改變能改變的,接受不能改變的。我們要用最少的悔恨面對過去,用最少的浪費(fèi)面對現(xiàn)在,用最多的夢面對未來。


        天地之道,簡易而已。人生苦短,諸事不想太復(fù)雜,簡單生活。人生這部大戲一旦拉開序幕,不管你如何怯場,都得演到戲的結(jié)尾。成長過程中最大的挑戰(zhàn)在于有些路段,只能自己寂靜地走,快樂工作、簡單生活才是幸福生活,人要懂得知足常樂,所有的哀傷、痛楚,所有不能放棄的事情,不過是生命里的一個(gè)過渡,你跳過了就可以變得更精彩。


        最好的生活就是簡單生活,一盞茶,一張桌,一處清幽,日子平淡,心無雜念??墒呛唵蔚纳顓s需要百般的努力,這樣才會(huì)無憂無慮欣然享受生活。生活總的來說是完美的,不完美的是心態(tài),不懂得欣賞的人,就會(huì)用挑剔把一切變得有殘缺。簡單做人,率性而為,把握分寸,隨遇而安,坦然接受現(xiàn)實(shí);簡單做事,不惹事、不生事、不怕事,不悔、不怨、不惜自己所做的事。


        人生就是一場漫長對抗,有些人笑在開始,有些人卻贏在最終。試著微笑,試著回眸,放松自己,不強(qiáng)求、不萎靡、不浮躁。簡單生活,隨心、隨性、隨緣,做最好的自己,知足、微笑、淡然,即使再苦再累,只要堅(jiān)持往前走,屬于自己的風(fēng)景終會(huì)出現(xiàn)。


        生活容不容易,關(guān)鍵看你怎么活。處境在于心境,心境改變了,處境也會(huì)改變。你向生活要得越多,你就會(huì)變得越緊張、越復(fù)雜,生活也就越不容易。反之,你對生活要求的越少,就越容易滿足,越容易快樂。江山明月,本無常主,得閑便是主人;大道至簡,活在當(dāng)下,知足便能常樂。


        悟入無懷之靜境,一輪之心月獨(dú)明,盡顯心靜之境界;心靜自然從容灑脫,持心若水笑面人生,更現(xiàn)心靜之魅力。人生在世,平淡才是最真,靜默才是最美,生命里最持久的不是繁華,而是平淡,不是熱鬧而是清歡。保持一顆童心,不開心的時(shí)候,心無遮攔地向朋友傾訴煩惱,開心的時(shí)候,肆無忌憚地開懷大笑,也許所有的憂愁會(huì)在傾訴中流走,所有的緊張會(huì)在大笑中釋放。像孩子一樣,簡單生活,快樂生活,保持心靈原生態(tài),一切都是美好的。


        生命里總有一個(gè)故事,想講述卻難以開口,就這樣在心底,漸漸譜成了曲。人就是這樣,得不到的永遠(yuǎn)向往,失去了的,才會(huì)覺到珍貴。所謂的,得失、情緣、風(fēng)景、驛站,都在時(shí)光的塵煙中,慢慢淡散。雖然,有些事情放下很難,但是,不屬于自己的東西,終究會(huì)走遠(yuǎn)。


        人的一生,注定要經(jīng)歷很多。紅塵路上,有朗朗的笑聲,有委屈的淚水,懵懂的堅(jiān)持著,有成功的自信,有失敗的警醒,每一段經(jīng)歷注定珍貴。生命的豐盈緣于心的慈悲,生活的美好緣于擁有一顆平常心,生活簡單讓人輕松快樂,想法簡單讓人平和寧靜。因?yàn)楹唵?,才深悟生命之輕,因?yàn)楹唵?,才洞悉心靈之靜。




        2

        什么是JPDA?


        官方文檔里這樣介紹:


        The Java Platform Debugger Architecture (JPDA) consists of three interfaces designed for use by debuggers in development environments for desktop systems.


        我們看到,JPDA由三部分組成:


        • JVMTI(Java Virtual Machine Tool Interface)

        • JDWP(Java Debugger Wire Protocol)

        • JDI(Java Debug Interface)


        熟悉JVM的朋友可能聽說過JVMPI和JVMDI,在JDK1.5他們統(tǒng)一被替換為JVMTI。


        JVMTI


        以前的文章里我們提到過Class的hotSwap,就是通過Instrument實(shí)現(xiàn)class的redefine和retransform。


        而本質(zhì)上JVMTI是一個(gè)programming interface,主要用在開發(fā)和監(jiān)控上。而且它提供了接口去觀察(inspect) 應(yīng)用狀態(tài)和控制應(yīng)用的執(zhí)行。工具通過它提供的接口,可以進(jìn)行如下功能的實(shí)現(xiàn):


        • profiling

        • debuging

        • monitoring

        • thread analysis

        • coverage analysis


        可以看到,我們使用到的debug,只是JVMTI提供的眾從能力中的一種。


        JDWP


        觀察過Java debug進(jìn)程的同學(xué)也許有印象,以debug方式啟動(dòng)的JVM進(jìn)程,看起來是這樣的:


        -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:63971,server=y,suspend=n


        除了進(jìn)程名之外,還在啟動(dòng)參數(shù)里包含agentlib:jdwp這些。這個(gè)就是現(xiàn)在要介紹的JDWP。


        什么是JDWP?


        Java Debug Wire Protocol,是debugger和它要debug的JVM之間進(jìn)行通訊的協(xié)議。


        更多具體協(xié)議的細(xì)節(jié)這里不介紹,感興趣的同學(xué)可以到這兒查看:http://docs.oracle.com/javase/6/docs/technotes/guides/jpda/jdwp-spec.html


        注意,這僅僅是一個(gè)協(xié)議的格式,具體的傳輸實(shí)現(xiàn)不是由JDWP來實(shí)現(xiàn)的。我們的debugger執(zhí)行的操作發(fā)送到JDWP的實(shí)現(xiàn)上,然后再轉(zhuǎn)給JVMTI來具體控制。


        JDI


        JDI是三個(gè)模塊中最高層的一個(gè)接口,通過JDI,debugger可以更方便的編寫符合JDWP格式的數(shù)據(jù),用來進(jìn)行調(diào)試數(shù)據(jù)傳輸。JDI的引入,提高了開發(fā)debugger的效率。


        所以,從整體上看,我們可以把JPDA看作一個(gè)兩個(gè)互相通訊的程序,所以我們可以在任意地點(diǎn)很方便的調(diào)試另一個(gè)JVM上運(yùn)行的程序。


        我們每次在IDE里進(jìn)行代碼調(diào)試時(shí),實(shí)質(zhì)上是通過IDE里的debugger這個(gè)界面執(zhí)行GUI操作,然后通過JDI發(fā)送數(shù)據(jù)到JDWP,再經(jīng)過JVMTI最終實(shí)現(xiàn)程序的高度。


        每次我們打開IDE調(diào)試一個(gè)Java應(yīng)用的時(shí)候,或者遠(yuǎn)程attach一個(gè)Java進(jìn)程的時(shí)候,別忘了這個(gè)IDE背后的男人---JPDA。


        另外,Tomcat啟動(dòng)腳本中也直接包含了debug方式啟動(dòng)的功能,在命令行中輸入catalina jpda start, Tomcat就以debug方式啟動(dòng)了。




        往期推薦



        面試常問的數(shù)據(jù)庫問題,建議收藏!

        一個(gè) hashCode() 函數(shù)引發(fā)的「慘案」

        推薦幾款大家常使用 SSH 客戶端工具

        來了解下這款開源 MarkDown 編輯器吧!

        一個(gè)由“ YYYY-MM-dd ”引發(fā)的慘案 !元旦來臨前的警惕

        Java常用類,這一次幫你總結(jié)好!



        瀏覽 76
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            久久久久国产无码 | 亚洲天堂视频网 | 国产成人精品a v久久 | 99久久婷婷国产综合精品青牛牛 | 免费无码无遮挡永久视频 | 亚洲小说区图片区另类 | 欧美日韩国产不卡视频 | 无码一区一区 | 靠逼视频大全 | 操皮视频|