www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]最近寫了幾篇IntelliJ IDEA系列的文章,反響蠻好。

最好的IDEA debug長(zhǎng)文?看完我佛了

前言

你好,我是A哥(YourBatman)。

最近寫了幾篇IntelliJ IDEA系列的文章,反響蠻好。我想了下,因?yàn)椴⒎鞘欠窒硎裁雌平夥椒?、推薦插件、主題這種蛋炒飯式嘩眾取寵的文章,而是真實(shí)對(duì)工作有幫助,對(duì)提高工作效率很有用的內(nèi)容。同學(xué)們對(duì)使用IDEA還是有不少痛點(diǎn),或者姿勢(shì)不夠正確優(yōu)雅,一直以來A哥堅(jiān)持寫些不隨波逐流、有一定深度專欄文章,哪怕只是個(gè)工具IDEA而已。

上篇文章 文末做了說明,本計(jì)劃IDEA系列告一段落,但有收到幾條上百字的留言和私信,覺得有些讀者確實(shí)很用心在看,所以決定寵粉再干幾篇。對(duì)于IDEA系列,工具嘛,研究原理沒有意義,而是站在使用者的角度,介紹正確姿勢(shì)和最佳實(shí)踐,用工具提效是唯一目的。

當(dāng)然,也有私信問我我的主題咋設(shè)置的挺好看?用了哪些好用的插件?自定義的插件如何開發(fā)?之類的,我認(rèn)為這種確實(shí)沒必要單獨(dú)分享嘍,因?yàn)橛霉雀璋俣纫幌戮涂梢哉业揭煌评?,各行大佬寫的文章多了去?/span>

本篇介紹IDEA調(diào)試debug,因?yàn)樗_實(shí)很重要。會(huì)不會(huì)debug,有沒有debug的意識(shí),懂不懂 debug 的技巧,是有沒有入門編程的重要標(biāo)志。 關(guān)于IDEA debug調(diào)試的文章我在CSDN里早已發(fā)表過,反響還不錯(cuò)(看來有痛點(diǎn)的人不少呀):

最好的IDEA debug長(zhǎng)文?看完我佛了

今天我就把它“搬過來”,并做“增強(qiáng)”改動(dòng)分享出來,希望你喜歡。

本文提綱

最好的IDEA debug長(zhǎng)文?看完我佛了

版本約定

  • IntelliJ IDEA:2020.3.2

小插曲:IDEA剛發(fā)布了其2020.3.2這個(gè)小版本,啟動(dòng)圖換成了20周年圖,IntelliJ IDEA 20周歲啦,為期2天的周年慶活動(dòng)對(duì)開發(fā)者免費(fèi)開放,感受一下:

最好的IDEA debug長(zhǎng)文?看完我佛了

正文

Debug調(diào)試對(duì)IT從業(yè)者不是個(gè)陌生概念,工作中經(jīng)常會(huì)用到它,這無關(guān)乎于初級(jí)、中級(jí)、高級(jí)程序員。調(diào)試程序的方式有多種,如:輸出日志、增加輔助變量、拆分函數(shù)體、斷點(diǎn)調(diào)試等等,本文將介紹的是斷點(diǎn)調(diào)試 -- 一種最行之有效的調(diào)試方法。準(zhǔn)確的講,本文講述是使用IntelliJ IDEA斷點(diǎn)調(diào)試。

Debug用來追蹤代碼的運(yùn)行流程,通常在程序運(yùn)行過程中出現(xiàn)異常時(shí),啟用Debug模式可以分析定位異常發(fā)生的位置,以及在運(yùn)行過程中參數(shù)的變化。除此之外,我們也可以使用Debug模式來跟蹤代碼的運(yùn)行流程來學(xué)習(xí)優(yōu)秀的開源框架。

斷點(diǎn)調(diào)試有多重要?

俗話說編碼5分鐘,debug2小時(shí),從這句話就能體現(xiàn)出調(diào)試的重要性,畢竟它占據(jù)你“大部分”的時(shí)間。

為了真實(shí)的體現(xiàn)出它的重要性,我“引經(jīng)據(jù)典”,找來了幾個(gè)資深行業(yè)經(jīng)驗(yàn)的大佬用引用他們的話來表述:

  1. 調(diào)試技巧比編碼技巧 更為重要,因?yàn)榛ㄙM(fèi)在調(diào)試上的時(shí)間往往比編碼還多,學(xué)到的東西比編碼中學(xué)到的更豐富
  2. 調(diào)試技能重要性甚? 超過學(xué)習(xí)?門語?
  3. 不會(huì)調(diào)試的程序員, 肯定編制不出任何好的軟件

我把關(guān)鍵詞都加粗劃重點(diǎn)了,其重要性可見一斑。大佬尚且這么認(rèn)為,何況是我等?所以,本文好好閱讀O(∩_∩)O哈哈~

什么是斷點(diǎn)?

突然被這么一問,是不是腦袋懵懵的?

最好的IDEA debug長(zhǎng)文?看完我佛了

一個(gè)天天都在用的“東西”,若是真要你對(duì)它下個(gè)定義說給別人聽,估計(jì)一時(shí)半會(huì)還解釋不清。當(dāng)然嘍,大道至簡(jiǎn),領(lǐng)會(huì)其要義能熟練使用才是硬道理。本文作為一篇“嚴(yán)肅”的技術(shù)文章,自然需要先把斷點(diǎn)這個(gè)概念用文字描述出來。

斷點(diǎn):為了調(diào)試而故意讓程序暫停的地方。它是一種附加在源代碼上面的特殊標(biāo)記,在debug模式下可以觸發(fā)特定動(dòng)作,如暫停執(zhí)行、打印線程堆棧、計(jì)算表達(dá)式的值、變量跟蹤等等。斷點(diǎn)的設(shè)置和取消全人為手動(dòng)管理,若不手動(dòng)處理(刪除)將會(huì)和項(xiàng)目一直存在。

如果你看過前兩篇文章,一定能解釋為何它會(huì)一直存在項(xiàng)目里。建議你前往參閱

可見,斷點(diǎn)的核心要義是暫停程序,從而在暫停那時(shí)刻就可以看到上線文的變量情況、IO情況、線程情況等信息,進(jìn)而更深入的了解程序,及時(shí)發(fā)現(xiàn)問題和追蹤到錯(cuò)誤的根源。

斷點(diǎn)參數(shù)

斷點(diǎn)并不是孤立存在的,它也可以有參數(shù),從而定制出不同的斷點(diǎn)行為,讓其能在不同條件下生效,這個(gè)參數(shù)就叫斷點(diǎn)參數(shù)。

我們平時(shí)用得比較多的條件斷點(diǎn),它就是斷點(diǎn)參數(shù)的最典型應(yīng)用。當(dāng)然除了條件斷點(diǎn),其它的斷點(diǎn)類型也是可以定制化參數(shù)的。那到底有哪些斷點(diǎn)類型可以使用和定制呢?那么接下來就步入到本文主體內(nèi)容,開始進(jìn)入更有意思的部分啦。

斷點(diǎn)的基本使用

應(yīng)該沒人不會(huì)打斷點(diǎn)吧,即使你是產(chǎn)品經(jīng)理(產(chǎn)品經(jīng)理莫名躺槍,手動(dòng)狗頭~)。

打斷點(diǎn)最簡(jiǎn)單最直接的方式就是在你想設(shè)置斷點(diǎn)的哪一行代碼的最左邊窗欄鼠標(biāo)左鍵單擊一下,完成后能看到一個(gè)小紅點(diǎn),就表示斷點(diǎn)設(shè)置成功啦,再點(diǎn)擊一下就取消。形如這樣:

最好的IDEA debug長(zhǎng)文?看完我佛了

因?yàn)槲业腎DEA界面簡(jiǎn)潔,盡可能的去掉了“按鈕”,所以平時(shí)我自己是使用到大量的快捷鍵來操作IDEA,打斷點(diǎn)也是如此經(jīng)常用快捷鍵去完成。當(dāng)然嘍,很多時(shí)候也用鼠標(biāo)的啦,畢竟鼠標(biāo)處理還是有其很大優(yōu)勢(shì)的。

說明:我的快捷鍵是Ctrl + Shift + B,僅供給你參考

管理斷點(diǎn)

管理斷點(diǎn)包括新增、刪除斷點(diǎn)。

對(duì)于少量斷點(diǎn)來講,鼠標(biāo)一個(gè)個(gè)的點(diǎn)擊給它刪除掉是可以的。但若打了“大量”的斷點(diǎn)在代碼里(比如看xxx源碼的時(shí)候),這時(shí)讓去一個(gè)個(gè)找來刪除是不太現(xiàn)實(shí)的,畢竟你可能自己都忘了哪兒有斷點(diǎn)。這個(gè)時(shí)候一個(gè)管理頁面/窗口就顯得格外的重要了,在IDEA中提供了這樣的窗口,你有多種方式打開它:

  1. 菜單欄方式:Run -> view breakpoints,缺點(diǎn)是路徑太長(zhǎng)太麻煩
  2. Actions方式:雙擊shift調(diào)出Actions窗口,輸入view breakpoints即可打開
  3. 任意斷點(diǎn)處鼠標(biāo)右鍵:選擇more即可打開管理窗口。缺點(diǎn)是:你至少得找到一個(gè)斷點(diǎn)作為抓手(當(dāng)然嘍你可以任意處隨意打一個(gè)點(diǎn)進(jìn)去也成)
  4. 調(diào)試窗口:該打開方式下面會(huì)提到
  5. 快捷鍵方式:毫無疑問,這是我最為推薦的方式嘍

最好的IDEA debug長(zhǎng)文?看完我佛了

在這個(gè)管理頁面,你可以對(duì)斷點(diǎn)進(jìn)行增刪改。

說明:我的快捷鍵是Ctrl + Shift + F8,僅供給你參考

如何debug模式運(yùn)行?

額,這講得是不是有點(diǎn)過于簡(jiǎn)單了點(diǎn)。

啟動(dòng)Debug模式運(yùn)行的方式有多種,比如工具欄的蟲子小圖標(biāo)按鈕、程序方法入口左鍵點(diǎn)擊、菜單欄、右鍵菜單欄等等,下面簡(jiǎn)單演示下:

Gif大了來,查閱地址:https://img-blog.csdnimg.cn/20210128073454666.gif

據(jù)我了解,很多同學(xué)最常用的方式是點(diǎn)擊上方工具欄右上角的蟲子圖標(biāo),因?yàn)槲摇皼]有”這個(gè)圖標(biāo),所以“教程”中就不演示了。A哥平時(shí)99%情況下都是使用快捷鍵方式啟動(dòng)程序,因?yàn)槲艺J(rèn)為那是最迅速和便捷的(當(dāng)然不一定適合你)。

此功能我的快捷鍵分為兩大類

  1. 運(yùn)行右上角當(dāng)前選中的入口類。它有一組快捷鍵
    1. Ctrl + Shift + Alt + enter:Run運(yùn)行
    2. Ctrl + Shift + Alt + \:Debug運(yùn)行
  2. 因?yàn)楹芏鄷r(shí)候需要從 新的入口啟動(dòng)程序,做Spring Boot工程開發(fā)可能體會(huì)不到(入口只有一個(gè)),但在做教程、Demo的時(shí)候程序入口是經(jīng)常變化的,所以不可能每次都還人肉去改啟動(dòng)類,效率太低。為此我就新設(shè)置了這組快捷鍵
    1. Ctrl + Shift + Alt + [:Run運(yùn)行, 鼠標(biāo)焦點(diǎn)所在作為入口
    2. Ctrl + Shift + Alt + ]:Debug運(yùn)行, 鼠標(biāo)焦點(diǎn)所在入口

另外,若要區(qū)分本次是Run運(yùn)行還是Debug運(yùn)行,除了看右上角小蟲子圖標(biāo)外,更好的方式看底部控制臺(tái)窗口激活的是哪個(gè)。這樣看的優(yōu)點(diǎn)是:即使同一份應(yīng)用啟動(dòng)多次,也能快速看出來哪些debug哪些run。

最好的IDEA debug長(zhǎng)文?看完我佛了

最好的IDEA debug長(zhǎng)文?看完我佛了

Debug模式運(yùn)行

值得一提的是:debug模式運(yùn)行,若沒有任何斷點(diǎn)被激活(比如你壓根就沒打斷點(diǎn)),效果和run模式啟動(dòng)是一樣(但控制臺(tái)窗口不一樣,因此日志輸出的位置也就不一樣)。

調(diào)試窗口詳解

調(diào)試窗口是我們斷點(diǎn)調(diào)試的操作面板,熟練的使用此面板推提高效率和掌握更多技巧非常重要。先來認(rèn)識(shí)下它:

最好的IDEA debug長(zhǎng)文?看完我佛了

此操作面板上按鈕不少,對(duì)Debug調(diào)試有多熟練很大程度上是由操作此面板的熟練度決定的。

調(diào)試按鈕

最常用的一排按鈕,入門必備。

最好的IDEA debug長(zhǎng)文?看完我佛了

一共9個(gè)按鈕,從左往右依次解釋下:

1.最好的IDEA debug長(zhǎng)文?看完我佛了Show Execution Point:回到當(dāng)前激活的斷點(diǎn)處。效果:若你鼠標(biāo)現(xiàn)在在別的頁面/別的類上面,點(diǎn)擊它快速“歸位”

2.最好的IDEA debug長(zhǎng)文?看完我佛了 Step Over步過:也叫單步調(diào)試,一行一行往下走,若這一行是方法也不會(huì)進(jìn)入里面去。這個(gè)應(yīng)該是平時(shí)使用得最多的按鈕了,沒有之一。所以,建議記住你的快捷鍵來提高效率哈

3.最好的IDEA debug長(zhǎng)文?看完我佛了Step Into步入:進(jìn)入方法體內(nèi)部。這里的方法指的你自定義的方法or三方庫的方法,不會(huì)進(jìn)入到JDK官方的方法里(如上面的System.out.println()這種它是不會(huì)進(jìn)去的)

4.最好的IDEA debug長(zhǎng)文?看完我佛了Force Step Into強(qiáng)制步入:能進(jìn)入任何方法,包括JDK的。一般查看底層源碼才會(huì)用到它

5.最好的IDEA debug長(zhǎng)文?看完我佛了Step Out步出:它是搭配(Force) Step Into一起使用的,當(dāng)通過step into進(jìn)入到方法體內(nèi)部想出來時(shí),一般有兩種方案:?jiǎn)尾秸{(diào)試慢慢出來,另一個(gè)就是step out(推薦)

6.最好的IDEA debug長(zhǎng)文?看完我佛了Drop frame:回到當(dāng)前方法的調(diào)用處,同時(shí)上下文內(nèi)所有的變量的值也回到那個(gè)時(shí)候。該按鈕能夠點(diǎn)擊的前提條件是:當(dāng)前所處的方法有上級(jí)方法,如果你是main方法里,那么按鈕就是灰色嘍

7.最好的IDEA debug長(zhǎng)文?看完我佛了Run to Cursor運(yùn)行到光標(biāo)處:你想要代碼在哪里停一下,就把光標(biāo)放在哪就成。這個(gè)功能實(shí)在太好用了,大大緩解了密密麻麻的斷點(diǎn),強(qiáng)烈推薦

8.最好的IDEA debug長(zhǎng)文?看完我佛了

Evaluate Expression表達(dá)式計(jì)算器:看圖標(biāo)就是個(gè)計(jì)算器嘛,所以你可以在這里執(zhí)行任何合法的表達(dá)式


最好的IDEA debug長(zhǎng)文?看完我佛了


最好的IDEA debug長(zhǎng)文?看完我佛了Trace Current Stream Chain跟蹤當(dāng)前Stream流:只有代碼停在Stream流語句上,此圖標(biāo)才點(diǎn)亮可以被點(diǎn)擊。這是IDEA提供的由于調(diào)試Stream流的殺手锏級(jí)別的功能,放在文下詳細(xì)解釋

這一排按鈕非常重要,甚至是最重要,一定要熟練掌握,可以大大提高調(diào)試代碼的效率,親測(cè)有效。

服務(wù)按鈕

把最左邊一豎排定義為服務(wù)按鈕,為調(diào)試過程提供服務(wù)。

最好的IDEA debug長(zhǎng)文?看完我佛了

一共10個(gè),但都比較簡(jiǎn)單和好理解。同樣的從上到下過一遍:

  1. Rerun xxx:關(guān)閉當(dāng)前程序,重新運(yùn)行
  2. Modify Run Configuration:顧名思義,修改運(yùn)行的配置。點(diǎn)擊此按鈕的效果同點(diǎn)擊右上角的框框:

最好的IDEA debug長(zhǎng)文?看完我佛了

點(diǎn)擊會(huì)彈出這個(gè)配置窗口:

最好的IDEA debug長(zhǎng)文?看完我佛了

每份運(yùn)行期配置都是具名且唯一的,互相隔離。運(yùn)行配置可修改的項(xiàng)非常多,大概如下:

說明:我截圖的頁面可能和你不一樣,因?yàn)槲矣玫氖亲钚掳娴腎DEA,此頁面在2020.3版本做了改版

最好的IDEA debug長(zhǎng)文?看完我佛了

  1. Resume Program:恢復(fù)程序。當(dāng)斷點(diǎn)激活時(shí)程序“停止”了,點(diǎn)擊這個(gè)按鈕就是恢復(fù)的意思。它給到的效果是: 跳到下一個(gè)斷點(diǎn)(用這句話解釋貌似更容易理解些),若后面沒有斷點(diǎn)就直接運(yùn)行結(jié)束了。這個(gè)按鈕 非常常用。
  2. Pause Program:暫停程序。嗯,只要你現(xiàn)在“卡”在斷點(diǎn)處,那么狀態(tài)就是Pause的狀態(tài)。這時(shí)候就有疑問了,難道這個(gè)按鈕一直是灰色不可點(diǎn)狀態(tài)?有啥用呢?我網(wǎng)絡(luò)上看了看,幾乎 沒人能夠解釋它的作用,這里A哥嘗試給你解釋下,用張圖給你整得明明白白,服服帖帖:

最好的IDEA debug長(zhǎng)文?看完我佛了

  1. Stop xxx:不解釋

  2. View Breakpoints:打開斷點(diǎn)管理窗口。文上已詳細(xì)解釋了此窗口的用法

  3. Mute Breakpoints:這個(gè)按鈕挺有意思的,作用是讓所有斷點(diǎn)變?yōu)榛疑?,也就是說讓它們失效。它是一個(gè)批量操作,操作對(duì)象是所有斷點(diǎn),而不可針對(duì)于某一個(gè)。若你現(xiàn)在不想把所有斷點(diǎn)刪除,但又不想它們阻攔你,那么可用這個(gè)按鈕實(shí)現(xiàn)

  4. Get Thread Dump:拿到當(dāng)前線程的dump,可以查看到當(dāng)前線程的狀態(tài)。如下圖:

最好的IDEA debug長(zhǎng)文?看完我佛了

    最好的IDEA debug長(zhǎng)文?看完我佛了

  1. 子線程當(dāng)前狀態(tài)為Runnable
  2. Settings:打開設(shè)置菜單。屬于高級(jí)使用,每一項(xiàng)開啟后有什么效果,放在文下解釋

最好的IDEA debug長(zhǎng)文?看完我佛了

  1. Pin tab:如果你這會(huì)調(diào)試xxx這個(gè)程序很頻繁,那么把它“釘”上會(huì)更有助于效率提升

方法調(diào)用棧

顯示當(dāng)前方法(位于棧頂)所經(jīng)過的所有方法。

最好的IDEA debug長(zhǎng)文?看完我佛了

說明:點(diǎn)擊右上角的小漏斗圖標(biāo)可以不顯示類庫的方法,只顯示你自己寫的方法,方便調(diào)試

變量區(qū)Variables

在此區(qū)域可以查看當(dāng)前斷點(diǎn)上下文范圍內(nèi)的所有變量值(即使不在本類內(nèi)也可以點(diǎn)過去查看哦),包括static靜態(tài)的。

最好的IDEA debug長(zhǎng)文?看完我佛了

值得注意:此區(qū)域里的變量IDEA會(huì)自動(dòng)調(diào)用其toString()方法,因此若你遇到正常運(yùn)行只輸出一句日志,debug輸出多句這種case很可能就是這個(gè)情況哦。

Watches變量跟蹤

有的時(shí)候變量很多,而只需要重點(diǎn)關(guān)注某幾個(gè)變量,就可以使用Watches。







最好的IDEA debug長(zhǎng)文?看完我佛了

除了以上這些,還有什么動(dòng)態(tài)改變變量值set Value,跳轉(zhuǎn)到源碼處jump to source等都是非常實(shí)用的功能,這就留你自己開發(fā)和實(shí)驗(yàn)哈。

為何調(diào)試窗口沒自動(dòng)打開?

有同學(xué)遇到過這個(gè)情況:明明斷點(diǎn)激活了(程序暫停了),但是那個(gè)“操作面板”并沒有出來,怎么破?

話不多說,檢查你的這個(gè)配置項(xiàng)是勾選狀態(tài)即可。這個(gè)狀態(tài)IDEA默認(rèn)是勾選上的,一般不用操心。

最好的IDEA debug長(zhǎng)文?看完我佛了

斷點(diǎn)調(diào)試的奇淫巧技

最后,站在使用層面,介紹些非常實(shí)用的“奇淫巧技”給你,這些小技巧可拿來就用。

強(qiáng)制返回(中斷debug)

場(chǎng)景描述:調(diào)試時(shí),當(dāng)我走到第三步就發(fā)現(xiàn)了問題,這個(gè)時(shí)候并不希望走完后續(xù)流程(比如因?yàn)榍懊嬗衎ug后續(xù)流程會(huì)有刪除數(shù)據(jù)操作等等),這個(gè)時(shí)候怎么處理?

咔嚓,Stop程序。是的,很長(zhǎng)一段時(shí)間里我也是這么干的,確實(shí)能達(dá)到目的。直到我發(fā)現(xiàn)了一個(gè)更優(yōu)雅的方法:Force Return,效果為:強(qiáng)制返回方法返回值(自己給個(gè)值)來避免后續(xù)的流程。

最好的IDEA debug長(zhǎng)文?看完我佛了

條件斷點(diǎn)

指定斷點(diǎn)的激活條件,都能稱作條件斷點(diǎn)。一般情況下,在行斷點(diǎn)下給定一個(gè)計(jì)算表達(dá)式,結(jié)果為true就激活斷點(diǎn)這是最常用的方式。因?yàn)樯厦嬉延邪咐?,這里省略

多線程調(diào)試

多線程程序的好處固然不用多說,但總所周知它調(diào)試起來是比較困難的,比如這段:

public static void main(String[] args) { // 共放3個(gè)"令牌" CyclicBarrier cyclicBarrier = new CyclicBarrier(3); // 模擬多個(gè)線程去搶 for (int i = 0; i < 10; i++) { new Thread(() -> { try {
                String name = Thread.currentThread().getName();

                System.out.println(name + ",準(zhǔn)備搶令牌");
                cyclicBarrier.await();
                System.out.println(name + ",已搶到");
            } catch (Exception e) {
            }
        }, "線程" + i).start();

    }

}

這個(gè)時(shí)候如果你想研究await()方法的實(shí)現(xiàn),需要具備的前提條件是多個(gè)線程進(jìn)入,因此需要hold住多個(gè)線程。若只是在await()這一行打個(gè)普通的行斷點(diǎn),那結(jié)果是這樣子的:



最好的IDEA debug長(zhǎng)文?看完我佛了

所有線程都是Running狀態(tài),顯示這是不可能的,因?yàn)榭偣仓挥?個(gè)另外,拿完了其它的都得等待才對(duì),所以這個(gè)根本就不是真實(shí)的執(zhí)行場(chǎng)景,也就不可能跟蹤到await()方法里面去探究其實(shí)現(xiàn)。

為了模擬出這種場(chǎng)景進(jìn)行調(diào)試,就對(duì)斷點(diǎn)阻塞條件設(shè)置為這樣:

最好的IDEA debug長(zhǎng)文?看完我佛了

再次運(yùn)行程序,線程情況如下:

最好的IDEA debug長(zhǎng)文?看完我佛了

快速計(jì)算表達(dá)式

都知道調(diào)試面板里的Evaluate Expression可以計(jì)算表達(dá)式/變量的值,但那畢竟還得彈個(gè)窗稍顯麻煩,其實(shí)還有更為方便的方式:

最好的IDEA debug長(zhǎng)文?看完我佛了

用鼠標(biāo)操作,效率指數(shù)級(jí)提升。這個(gè)操作方式是:鼠標(biāo)指針選中表達(dá)式(IDEA智能自動(dòng)選中) + 鼠標(biāo)左鍵單擊。當(dāng)然嘍,如果你想執(zhí)行自定義的不存在于代碼中的表達(dá)式,那必須調(diào)起窗口來操作。

Stream流調(diào)試

Java 8的流行,徹底讓流式編程走進(jìn)我們的視野。使用Stream編程的好處眾多,但一直被大家詬病的是難以閱讀和難以調(diào)試,特別是后者。

為了調(diào)試它,我們經(jīng)常需要插入其它斷點(diǎn),并分析流中的每個(gè)轉(zhuǎn)換,不可為不麻煩。還好IDEA提供了處理該痛點(diǎn)的“能力”:當(dāng)調(diào)試器在Stream API調(diào)用鏈之前或之內(nèi)停止時(shí),點(diǎn)擊Trace Current Stream Chain這個(gè)圖標(biāo)即可以“非常好看”的圖形化方式展示出來,一目了然:

最好的IDEA debug長(zhǎng)文?看完我佛了

主動(dòng)拋出異常

需求場(chǎng)景:你寫了一個(gè)全局異常組件,現(xiàn)在想測(cè)試它生效情況如何,那么時(shí)候你就需要主動(dòng)拋出這種異常,一般的做法是形如這樣:

// 自己在程序內(nèi)主動(dòng)throw一個(gè) throw new NullPointerException(); // 或者構(gòu)建個(gè)表達(dá)式 int i = 1/0;

這種做法均有一定的代碼侵入性,用后還得刪除。其實(shí)IDEA還提供了一種更為優(yōu)雅的解決方案:

最好的IDEA debug長(zhǎng)文?看完我佛了


掌握了IDEA斷點(diǎn)調(diào)試的基本技能,下面進(jìn)入到本文深水區(qū):斷點(diǎn)類型。難度不高,依舊是使用層面的事,但由于很多同學(xué)并不知道,因此是用于你超車的好材料。

四大斷點(diǎn)類型

對(duì)于打斷點(diǎn),估計(jì)大部分同學(xué)都只會(huì)左邊鼠標(biāo)單擊這種最基礎(chǔ)的方式。所以,看到這個(gè)小標(biāo)題估計(jì)你得再懵一次吧。what?斷點(diǎn)還有種類?

若你也是只在代碼左邊鼠標(biāo)單擊打上“小紅點(diǎn)”,然后嘎嘎就是干,空中轉(zhuǎn)體720度向后翻騰三周半......一把唆的選手,那么接下來就坐穩(wěn)嘍,準(zhǔn)備發(fā)車。

最好的IDEA debug長(zhǎng)文?看完我佛了

這么個(gè)姿勢(shì)也許能幫你定位50%以上的問題,但還有另外一半的case呢?如for循環(huán)調(diào)試,Stream流調(diào)試,lambda調(diào)試、異常調(diào)試等這些場(chǎng)景,用那“一把唆”的方式就很難搞定甚至說搞不定了。斷點(diǎn)是幫我們快速定位問題的,不同的場(chǎng)景打上合適的斷點(diǎn)將能事半功倍。

殊不知,IDEA給我們開發(fā)者提供了非常的斷點(diǎn)類型,以應(yīng)對(duì)不同場(chǎng)景下的調(diào)試。在對(duì)應(yīng)的場(chǎng)景下使用合適正確的斷點(diǎn)類型,能夠大大提高調(diào)試的效率,從而別人加班你下班,效率就是時(shí)間,而時(shí)間就是生命。

最好的IDEA debug長(zhǎng)文?看完我佛了

如圖,IDEA把斷點(diǎn)分為四大類型(截圖中只有三類):

  1. Line breakpoint(行斷點(diǎn)):圖中紅色小圓圈。顧名思義,在指定代碼行設(shè)置斷點(diǎn)
  2. Field watchpoint(屬性斷點(diǎn)):圖中紅色小眼睛。打在類的屬性(static or 非static)上的斷點(diǎn),作用是在該屬性 讀取和寫入時(shí)激活
  3. Method breakpoint(方法斷點(diǎn)):圖中紅色小菱形。標(biāo)記在方法簽名的那一行,在該方法執(zhí)行的入口/出口處被激活
  4. Exception breakpoint(異常斷點(diǎn)):紅色小閃電。這是一個(gè)特殊但很好用的斷點(diǎn),當(dāng)程序拋出 指定異常時(shí)會(huì)激活異常斷點(diǎn)。和其它斷點(diǎn)不同,異常斷點(diǎn)是項(xiàng)目 全局的,它不需要打在具體某一行上

下面就到了“啃硬骨”的時(shí)候了,來吧。

行斷點(diǎn)Line breakpoint

使用得最最最廣泛的斷點(diǎn)類型,平時(shí)大部分情況下都使用此種斷點(diǎn)。

Gif太大了放不上來,查閱地址:https://img-blog.csdnimg.cn/20210128011543377.gif

從“教程”中可以看到該斷點(diǎn)有很多的設(shè)置項(xiàng),也就是有很多的斷點(diǎn)參數(shù)可以配置,來了解下。

斷點(diǎn)參數(shù)

因?yàn)檫@是第一個(gè)介紹斷點(diǎn)參數(shù)的類型,因此會(huì)說得詳細(xì)些,這樣子后面相同功能的參數(shù)就不用再贅述了。對(duì)照這個(gè)截圖頁:

最好的IDEA debug長(zhǎng)文?看完我佛了

  • Enabled:不解釋。但需注意:若此項(xiàng)不勾選上,小紅點(diǎn)并不會(huì)消失,而是由實(shí)心的變?yōu)?空心的,當(dāng)然嘍,一般情況下并不會(huì)動(dòng)此項(xiàng)
  • Suspend:眾所周知,斷點(diǎn)激活時(shí)會(huì)阻塞程序的繼續(xù)運(yùn)行,從而阻塞當(dāng)前線程。但是當(dāng)你發(fā)現(xiàn)它是個(gè)復(fù)選框的時(shí)候,有沒有被詫異到?并且,并且,并且你還可以根本就不勾選它,有何區(qū)別:
    • All(默認(rèn)):阻塞該程序內(nèi)所有線程

    • Thread:只阻塞當(dāng)前斷點(diǎn)所在線程最好的IDEA debug長(zhǎng)文?看完我佛了

      如上圖,不勾選Suspend:線程14和線程15正常運(yùn)行,“暢通無阻”

    • Gif大了來,查閱地址:https://img-blog.csdnimg.cn/20210128062330308.gif

    • 如上圖,勾選Suspend-All:在斷點(diǎn)處,所有線程都被阻塞了,統(tǒng)一給我等待。

    • 若不勾選選中:此斷點(diǎn)相關(guān)活動(dòng)(如打日志等)依舊正常進(jìn)行,只是 不阻塞進(jìn)程
    • 若勾選中:

最好的IDEA debug長(zhǎng)文?看完我佛了

      如上圖,勾選Suspend-Thread:method1的線程被阻塞,但是并不影響另外一個(gè)線程調(diào)用method2。

試想一下,既然“勾選Suspend-Thread”影響更小,那為何IDEA默認(rèn)幫你選擇All而不是Thread呢?原因是這樣子的:調(diào)試的目的就是讓程序“慢下來”,最好是靜止下來方便分析問題。否則,其它線程如果仍舊繼續(xù)保持執(zhí)行的話,可能一會(huì)這個(gè)請(qǐng)求改掉這個(gè)數(shù)據(jù)一會(huì)改掉那個(gè)數(shù)據(jù),增加了不可控性。不確定的增加從而大大增加調(diào)試難度和定位問題的難度,所以索性上個(gè)“同步鎖”來得省心,因此默認(rèn)選中Suspend-All是合理為之。

說明:很多時(shí)候我們需要用本機(jī)連接測(cè)試環(huán)境打斷點(diǎn)進(jìn)行遠(yuǎn)程調(diào)試,若在這個(gè)case下強(qiáng)烈建議你使用Thread模式,否則你懂的

  • Condition:斷點(diǎn)被激活的條件。你可以在此處書寫表達(dá)式,只有表達(dá)式返回 true時(shí)此斷點(diǎn)才會(huì)被激活
    • 條件斷點(diǎn)嚴(yán)格來講不屬于一種斷點(diǎn)類型,屬于斷點(diǎn)參數(shù)決定的,很多類型的斷點(diǎn)都可加條件

最好的IDEA debug長(zhǎng)文?看完我佛了

  • Log:它有三個(gè)選項(xiàng),是checkbox哦。也就是說可都選,也可都不選,默認(rèn)一個(gè)都不選
    • Breakpoint hit message:斷點(diǎn)激活時(shí)輸出提示日志
    • Stack trace:斷點(diǎn)激活時(shí)輸出程序調(diào)用棧信息
    • Evaluate and log:選擇需要輸出計(jì)算表達(dá)式的值。你可選擇當(dāng)前可達(dá)的變量,如本例的main函數(shù)入?yún)rgs等
  • remove once hit:斷點(diǎn)激活一次后就立馬給移除嘍,也就是所謂的臨時(shí)行斷點(diǎn),下面來介紹下它

還有窗口里最右邊的這塊條件:

最好的IDEA debug長(zhǎng)文?看完我佛了

見名之意,一系列過濾器:過濾實(shí)例、過濾類、過濾調(diào)用者等等,一般這些們幾乎不會(huì)使用(至少我目前是還沒用過的),所以就一筆帶過。

使用場(chǎng)景

行斷點(diǎn)一般配合單步調(diào)試一起使用,在看框架源碼、定位基礎(chǔ)問題等使用得特別多,是最需要掌握的一種斷點(diǎn)類型,沒得商量。

臨時(shí)行斷點(diǎn)Temporary line breakpoint

它也屬于行斷點(diǎn)的一種,只是參數(shù)不一樣而已。由于它比較特殊,所以單摘出來說道說道。創(chuàng)建普通行斷點(diǎn),然后把Remove once hit復(fù)選框勾選上即是一個(gè)臨時(shí)行斷點(diǎn),效果如下:

最好的IDEA debug長(zhǎng)文?看完我佛了

這種斷點(diǎn)類型,實(shí)際使用場(chǎng)景其實(shí)很少。

屬性斷點(diǎn)Field watchpoint

此類斷點(diǎn)是打在屬性上的,成員屬性和靜態(tài)屬性均可。它不是小紅點(diǎn),而是個(gè)紅色“小眼睛”。

最好的IDEA debug長(zhǎng)文?看完我佛了

斷點(diǎn)參數(shù)

最好的IDEA debug長(zhǎng)文?看完我佛了

如圖,此種斷點(diǎn)類型特有個(gè)watch參數(shù),兩個(gè)可選值的含義為:

  • Filed Access:讀取此屬性時(shí)(寫入時(shí)不管)
  • Filed madification:寫入此屬性時(shí)(讀取時(shí)不管)

使用場(chǎng)景

當(dāng)想知道xxx屬性的賦值是誰時(shí),由于程序太龐雜沒法知道斷點(diǎn)打哪兒從哪開始跟蹤,這個(gè)時(shí)候使用屬性類型的斷點(diǎn)一下子就搞定了,非常的方便。

方法斷點(diǎn)Method breakpoint

斷點(diǎn)必須打在方法簽名的那一行,顏色形狀是個(gè)紅色的小菱形。

最好的IDEA debug長(zhǎng)文?看完我佛了

斷點(diǎn)參數(shù)

最好的IDEA debug長(zhǎng)文?看完我佛了

Watch有三個(gè)可選值:

  • Emulated:仿真。作用:提高調(diào)試性能,因此默認(rèn)情況下使用。官方建議:僅在調(diào)試遠(yuǎn)程代碼或在沒有行號(hào)信息的native方法或 類中設(shè)置斷點(diǎn)時(shí),才建議禁用此選項(xiàng)
  • Method entry:進(jìn)入方法時(shí)激活斷點(diǎn)
  • Method exit:出去方法時(shí)激活斷點(diǎn)

若entry和exit都勾選,那在進(jìn)入之后和出去之前都會(huì)激活斷點(diǎn)

使用場(chǎng)景

對(duì)于此種斷點(diǎn)類型,可能你會(huì)說沒啥卵用。畢竟自己在方法頭尾打個(gè)行斷點(diǎn)就能達(dá)到同樣效果,沒必要單獨(dú)搞個(gè)類型嘛。

其實(shí),它的殺手锏級(jí)使用場(chǎng)景是把此種類型斷點(diǎn)打在接口方法上,這樣子不管哪個(gè)實(shí)現(xiàn)類方法被調(diào)用,都會(huì)激活斷點(diǎn),是不是特別給力。

異常斷點(diǎn)Exception breakpoint

比較小眾,但并不代表不重要。在我理解它比較小眾,可能大多數(shù)同學(xué)不知道如何打一個(gè)異常斷點(diǎn),因?yàn)樗皇鞘髽?biāo)單擊就能輕松搞定。

上面介紹了異常斷點(diǎn)它是一種全局?jǐn)帱c(diǎn)類型,因此并不能在代碼處直接單擊,而是只能在管理窗口里統(tǒng)一添加:

最好的IDEA debug長(zhǎng)文?看完我佛了

和其它斷點(diǎn)類型相比,至少有如下不一樣:

  1. 創(chuàng)建斷點(diǎn)只能通過斷點(diǎn)管理窗口創(chuàng)建,而不能通過鼠標(biāo)點(diǎn)擊方式
  2. 創(chuàng)建完成后,代碼欄處不會(huì)有任何顯示(沒有紅色小圖標(biāo)),直到它被激活時(shí)才會(huì)出現(xiàn)紅色小閃電
  3. 異常斷點(diǎn)作用于全局:本例中任何地方拋出了NullPointException都會(huì)激活此斷點(diǎn)

斷點(diǎn)參數(shù)

最好的IDEA debug長(zhǎng)文?看完我佛了

Notification有兩個(gè)可選值:

  • Catch excetion:只有當(dāng)你自己try-catch了這個(gè)異常才會(huì)激活斷點(diǎn)
  • Uncatch excetion:只有當(dāng)你自己不try-catch時(shí)才會(huì)激活斷點(diǎn)

默認(rèn)情況下這兩個(gè)都會(huì)被勾選上,也就是說任何情況下發(fā)生此異常,都會(huì)激活斷點(diǎn)。

使用場(chǎng)景

知曉了異常斷點(diǎn)的作用和觸發(fā)條件,使用場(chǎng)景就有啦。比如當(dāng)你的程序拋出了一個(gè)異常,但是一時(shí)半會(huì)你并不知道是哪行代碼引起的,這個(gè)時(shí)候通過增加異常斷點(diǎn)的方式可以實(shí)現(xiàn)迅速的問題定位。

4種斷點(diǎn)圖標(biāo)對(duì)比

每種斷點(diǎn)類型都有自己對(duì)應(yīng)的圖標(biāo),且有不同的狀態(tài)。我從官網(wǎng)趴了一張對(duì)比圖,總結(jié)得特別好,在這里一并分享給你:

最好的IDEA debug長(zhǎng)文?看完我佛了

遠(yuǎn)程調(diào)試(遠(yuǎn)程Debug)

現(xiàn)在大都是微服務(wù)架構(gòu)方式,每個(gè)微服務(wù)一般會(huì)有N多個(gè)上/下游依賴,如此以至于給調(diào)試帶來了很大困難,畢竟你幾乎不可能在本地同時(shí)把依賴都啟起來用IDEA做調(diào)試。所以,遠(yuǎn)程調(diào)試來了,它是調(diào)試分布式系統(tǒng)的一個(gè)利器。

遠(yuǎn)程調(diào)試:顧名思義,使用本地IDEA調(diào)試遠(yuǎn)程代碼(一般為QA環(huán)境,線上環(huán)境不可能開啟調(diào)試端口的)。那么如何開啟遠(yuǎn)程調(diào)試呢?

開啟步驟

開啟遠(yuǎn)程調(diào)試只需要兩步即可:

第一步:讓遠(yuǎn)程部署的那個(gè)應(yīng)用支持遠(yuǎn)程調(diào)試,也就是暴露遠(yuǎn)程調(diào)試端口。方式方法為在應(yīng)用啟動(dòng)時(shí)加上對(duì)應(yīng)的JVM參數(shù)即可,JDK版本不同參數(shù)也不一樣

  • JDK 9+:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:${debug_port}
  • JDK 5-8:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=${debug_port}
  • JDK 4:-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=${debug_port}
  • JDK 3-:-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=${debug_port}

第二步:用IDEA創(chuàng)建一個(gè)remote運(yùn)行配置,填上遠(yuǎn)程主機(jī)的ip + 暴露的調(diào)試端口即可。操作路徑為:Edit Configurations -> Add New Configuration ->



最好的IDEA debug長(zhǎng)文?看完我佛了

萬事俱備,點(diǎn)擊debug運(yùn)行,控制臺(tái)里能看到如下字樣就證明你鏈接成功了:

最好的IDEA debug長(zhǎng)文?看完我佛了

值得注意的是:遠(yuǎn)程調(diào)試時(shí)請(qǐng)確保你本地代碼和遠(yuǎn)程代碼一模一樣,已達(dá)到最佳效果。

傳統(tǒng)Tomcat如何開啟遠(yuǎn)程調(diào)試?

若你是個(gè)Spring Boot應(yīng)用,那么在jar -jar時(shí)加上JVM參數(shù)即可,那么如果是要使用傳統(tǒng)的tomcat方式部署呢?這個(gè)時(shí)候找到傳統(tǒng)tomcat的啟動(dòng)腳本startup.sh:

#!/bin/sh os400=false

...

PRGDIR=`dirname "$PRG"`
EXECUTABLE=catalina.sh

...

exec "$PRGDIR"/"$EXECUTABLE" start "$@"

為了加上咱們的JVM參數(shù),只需要在exec xxx之前添加一個(gè)變量值即可(以JDK8為例):

JPDA_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=具體的端口號(hào)’ 

注意:這個(gè)key名稱必須是JPDA_OPTS。

有好奇心的你可能不禁就要問了:為何加個(gè)JPDA_OPTS參數(shù)就行了呢?也沒見exec xxx使用它呀,其實(shí)不然,下面簡(jiǎn)單解釋下,不展開。

exec執(zhí)行時(shí)引用了變量 $EXECUTABLE,它代表的是就是catalina.sh這個(gè)文件,該文件里面有大量變量判斷腳本,當(dāng)然包括負(fù)責(zé)對(duì)JPDA_OPTS解釋:

#!/bin/sh cygwin=false
darwin=false
...
if [ "$1" = "jpda" ] ; then
  if [ -z "$JPDA_TRANSPORT" ]; then
    JPDA_TRANSPORT="dt_socket"
  fi
  if [ -z "$JPDA_ADDRESS" ]; then
    JPDA_ADDRESS="localhost:8000"
  fi
  if [ -z "$JPDA_SUSPEND" ]; then
    JPDA_SUSPEND="n"
  fi
  if [ -z "$JPDA_OPTS" ]; then
    JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
  fi
  CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS"
  shift
fi
...

關(guān)于JVM調(diào)試平臺(tái)JPDA更多知識(shí)點(diǎn),可自行用谷歌百度一下學(xué)習(xí)學(xué)習(xí)

嵌入式Tomcat如何開啟遠(yuǎn)程調(diào)試?

這不就是Spring Boot應(yīng)用形式麼?所以,如何開啟,不用再?gòu)U話了吧~

總結(jié)

人和動(dòng)物的最大區(qū)別之一是人會(huì)使用工具,且善于使用工具。工具被創(chuàng)造出來,使命就是提效的,畢竟我們不可能用記事本去寫Java程序吧。

IntelliJ IDEA作為最為流行的JVM平臺(tái)IDE,我們應(yīng)該盡可能的去挖掘出它的效用,既然作為集成開發(fā)環(huán)境,其實(shí)很多功能都可以一站式搞定,在一個(gè)平臺(tái)里做很多數(shù)據(jù)都能打通。比如IDEA的rest接口調(diào)試、數(shù)據(jù)庫映射、Shell終端等等,應(yīng)付平時(shí)的開發(fā)一般搓搓有余,推薦使用,畢竟軟件啟得越多電腦越卡不是。

用IDEA和會(huì)用IDEA是兩個(gè)層次,除了代碼本身,最常用的開發(fā)工具也是值得花番心思的。大道至簡(jiǎn),知易行難,知行合一,得到功成!


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉