<xmp id="63nn9"><video id="63nn9"></video></xmp>

<xmp id="63nn9"></xmp>

<wbr id="63nn9"><ins id="63nn9"></ins></wbr>

<wbr id="63nn9"></wbr><video id="63nn9"><ins id="63nn9"><table id="63nn9"></table></ins></video>

idea 調試小心得


1、為什么需要Debug

目的:開發過程中 查找或定位錯誤或者閱讀源碼

程序運行的結果(4種情況)

情況1:沒有任何bug,程序執行正確!

情況2: 運行以后,出現了錯誤或異常信息。但是通過 日志文件或控制臺 ,顯示了異常信息的位置。

情況3: 運行以后,得到了結果,但是結果不是我們想要的。
情況4: 運行以后,得到了結果,結果大概率是我們想要的。但是多次運行的話,可能會出現不是我們想要的情況。比如:多線程情況下,處理線程安全問題


2、Debug的步驟

1、添加斷點
2、啟動調試
3、單步執行
4、觀察變量和執行流程,找到并解決問題

■ 斷點的添加、取消、查看

  • 添加/取消某個位置的斷點:點擊行號位置

  • 查看所有斷點:Ctrl + Shift + F8

  • 取消所有斷點: 點擊查看所有斷點,不勾選Java Line Breakpoints

? 調試中的斷點意義:執行到了即生效了,就會暫停一下。

? 打多個斷點的意義:整個項目也可以打一個斷點,然后執行到想要觀察的方法的調用,通過step into 進入觀察,但是可能點快了,直接完執行方法調用。但是項目工程比較大,對于想要觀察的方法打上一個斷點,執行到了,它就會生效暫停,暫停一下更方便而已。

■ 設置好斷點后,啟動選擇debug方式啟動:

  • debug 鍵的位置:行號點擊三角形可以選擇,代碼內容空白位置右鍵可以選擇,菜單工具欄的運行臭蟲子圖標可以選擇

  • 代碼中的打印、日志語句,執行后,在Debug模式下Console 觀察

  • 變量區的變量注意是當前方法棧的


3、idea 調試快捷鍵


4、總結一下調試快捷鍵的使用

(1) 常用的:

觀看下一步的單步調試[F8],進入方法體內部[F7],退出方法體,執行下一步[Shift+F8],直接跳到下一個斷點[F9]

(2) 走神了:

回到當前文件斷點位置[Alt+F10],跳到光標[Alt+F9],

太走神/觀察不細致,那就重來一遍:回退到上一個方法調用的開始處[Drop Frame]

(3) 結束:

結束調試[Ctr+F2]、讓當前斷點后面的所有斷點失效[Mute Breakpoints]


5、調試過程的其他小技巧

(1) Ctr+鼠標

  • 點擊目標進入,再次點擊,如果不能再進入則會出來。目標可以是屬性對象,也可以是類、是接口,是方法等等。

(2) Alt+箭頭方向←

  • 讓光標回到上一個光標位置。有時候,因為Ctr+鼠標點擊進入之后,在不移動光標位置,想退回上一個光標位置,那么Alt+←

(3) 全局搜索快捷鍵

  • Ctr+Shift+F

  • Ctr+Shift+N

(4) 定位當前打開的文件的位置

  • 定位當前文件所在項目目錄結構位置:


6、斷點細分(重點:條件斷點、線程調試)

(1) 方法斷點:

  • 剛進入方法會停頓一下

(2) 字段斷點:

  • 默認會停頓在字段值發生改變的位置

(3) ? 條件斷點----適合觀察循環體的代碼執行流程

  • 可以在斷點位置,設置暫停的條件,右鍵斷點

(4) 異常斷點:

  • 設置某種異常暫停

(5)? 線程調試:

  • 設置,觀察某個線程的執行



7、調試實踐和心得總結

舉例分布式項目調試,比如有三個應用:admin應用-將任務主體存儲到redis,master應用-將redis任務主體進行執行。其中,master實際上是遠程調用了worker應用-去執行任務主體。

(1) 多個應用調試觀察執行流程:

  • 要注意流程中應用執行,從A應用執行著到了應用B應用,然后再繼續執行到應用C,調試的時候,也要跟著流程切換應用的調式模式。

  • 當A應用debug著,突然卡著的時候,就需要考慮這時候執行流程是不是進入了應用B了,切換到應用B的debug模式觀察一下。

  • 切換到C應用的時候,觀察執行下一步,遲遲不肯進入下一步,考慮是不是A應用是不是得“放行”,B應用執行到下一步,C應用才有資格進行執行。

    舉例:B應用[master應用],斷點停在了調用遠程C應用[worker應用]的這一行時候:workerWebservice.execChat(chatExecParam);

    然后,因為是遠程調用,如果你還點擊下一步,會進入的是B應用的反射底層代碼,這時候,需要通過打斷點跳到下一個斷點(C應用)的代碼位置,然后觀察C應用的工作流程,但是C工作,真正想要執行run方法,需要B應用執行到下一步,相當于“放行”。

(2) 打斷點要注意遠程調用的代碼位置不能打,否則項目跑不起來

舉例:在@FeignClient的接口中的方法打了斷點,導致項目啟動失敗。

  • 執行流程:A服務遠程調用B服務
// A服務,將chatExecParam 發送給B服務[worker] 去執行
workerWebservice.execChat(chatExecParam);

// 中間的Fegin負載均衡
@FeignClient("chat-worker")
public interface WorkerWebservice {
    @RequestMapping(value = "/execChat", method = RequestMethod.POST)
    boolean execChat(@RequestBody CrawlerExecParam crawlerExecParam);  //《---在這里打了斷點,導致A服務啟動失敗 
}

// B服務
@Override
@RequestMapping(value = "/execChat", method = RequestMethod.POST)
public boolean execCrawler(ChatExecParam chatExecParam) {
   workerContext.getThreadPool().execute(new ExecQueueScanRunnable(chatExecParam, masterWebservice));
   return true;
}
  • 錯誤信息:
2023-03-11 22:45:38.162 [WARN ] [main] com.netflix.config.sources.URLConfigurationSource - No URLs will be polled as dynamic configuration sources.
2023-03-11 22:45:38.172 [INFO ] [main] com.netflix.config.sources.URLConfigurationSource - To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
2023-03-11 22:45:38.855 [WARN ] [main] com.netflix.config.sources.URLConfigurationSource - No URLs will be polled as dynamic configuration sources.
2023-03-11 22:45:38.866 [INFO ] [main] com.netflix.config.sources.URLConfigurationSource - To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
2023-03-11 22:46:30.475 [INFO ] [main] o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
2023-03-11 22:47:43.098 [INFO ] [main] o.s.scheduling.concurrent.ThreadPoolTaskScheduler - Initializing ExecutorService 'taskScheduler'
2023-03-11 22:47:46.228 [INFO ] [main] com.alibaba.nacos.client.naming - initializer namespace from System Property :null
2023-03-11 22:47:46.275 [INFO ] [main] com.alibaba.nacos.client.naming - initializer namespace from System Environment :null
2023-03-11 22:47:46.315 [INFO ] [main] com.alibaba.nacos.client.naming - initializer namespace from System Property :null
  • 分析原因:[?下次抽空補充!?]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  • 解決:取消掉在@FeignClient接口下的方法打斷點


(3) idea 卡著不動/debug 執行太慢:

  • 調試點擊下一步,或者調試跳到下一個斷點的時候,idea 卡著不動:

? 判斷是否卡著:按鍵-結束調試是激活狀態;重要的是在Variables 提示了一句:程序正在運行The application is running

? 程序真正(debug)結束

  • 原因分析

① 可能原因1:方法斷點會使得正在debug調試的程序變慢【建議:少用方法斷點

② 可能原因2:斷點打太多。建議盡量不要在項目里打過多的斷點,調試哪里就在哪里打上,調試完把斷點去掉就好。

③ 可能原因3:執行的方法是遠程方法(和網絡有關)或者執行的方式是數據庫操作有關。


? 心得總結

1、 建議:少用方法斷點

2、 建議:不要打太多斷點,為了觀察方便,需要再打,觀察完,可以去掉斷點。

3、注意:如果項目是分布式項目,負載均衡@Feign的接口中的方法【 本來就不建議在方法的位置打斷點了! 】,如果影響了項目啟動,請取消斷點。




如果本文對你有幫助的話記得給一樂點個贊哦,感謝!

posted @ 2023-03-12 12:53  一樂樂  閱讀(186)  評論(1編輯  收藏  舉報
人碰人摸人爱免费视频播放

<xmp id="63nn9"><video id="63nn9"></video></xmp>

<xmp id="63nn9"></xmp>

<wbr id="63nn9"><ins id="63nn9"></ins></wbr>

<wbr id="63nn9"></wbr><video id="63nn9"><ins id="63nn9"><table id="63nn9"></table></ins></video>