qt5.9.0調試如何查看變量的值_深入了解 Java 調試

Bug(俗稱"八阿哥") 是軟件開發繞不過的一道坎,因此調試便成了每位程序員一項必備的核心技能。調試不僅有助于理解程序的運行流程,還能改進代碼質量,最終提高開發者解決問題的能力以及交付軟件的品質。

本文旨在討論 Java 調試關鍵技巧,同時也會介紹生產環境中調試 Java 的最佳實踐。

0 調試 Java 項目

本節討論 Java 項目調試中的常見概念與技巧,包括Breakpoint (斷點)、Step filter (單步過濾器)、Drop to Frame (跳出函數到選定層)等。這些技術同樣可以在復雜場景下使用。

條件斷點

斷點用來指定在調試過程中程序停止執行的位置。通過臨時掛起執行過程,可以觀察或修改字段與變量值。下面的內容雖然使用了 Eclipse進行演示,但是相關概念同樣適用于其他 Java IDE。條件斷點即設置成在滿足特定條件時觸發的斷點,用來檢查條件發生時程序的狀態、調用堆棧及重要的變量值。

下面的示例對音樂專輯得分計算算術平均值:

044238a0dd7fce9e16546698bfbaf434.png

假設有數百張專輯,可以在循環中設置條件斷點 album.getRating().score == 0。當出現專輯得分為0時,程序就會停止執行。

其他斷點類型

除了上面介紹的斷點類型,不同的 Java IDE 還提供了其他類型的斷點:

  • 事件斷點:與事件綁定,在遇到調試器能夠識別的事件時觸發;
  • 字段斷點:給定字段或表達式的值發生變化時,字段斷點將停止正在執行的程序。調試時可以指定一個字段作為觀察點,表達式讀取、修改時停止執行;
  • 方法斷點 :進入或退出指定方法時掛起程序,用來檢查特定方法的進入或退出事件;
  • 行斷點:程序到達斷點中設置的特定代碼行時停止程序執行。

使用 Rookout 設置斷點

Rookout 是一個創新的調試平臺,在不停止或中斷程序的情況下搜集調試數據。支持自定義斷點觸發條件。Rookout 提供的"斷點狀態"功能非常強大:在斷點附近通過警告標志或 展示斷點狀態。

Rookout 有5種斷點狀態:

  • Active (紫色, 實心)
  • Pending (紫色, 空心)
  • Warning (紫色, 實心, 帶三角形)
  • Error (紫色, 空心, 帶三角形)
  • Disabled (灰色, 空心)

87118d7474f6668e8a6984b58edf5013.png

"斷點狀態" 可以在查看日志或調試信息前就能對程序運行狀況有所了解。

Step Filter (單步過濾器)

Step Filter 可以在調試中指定需要跳過的 package。在調試多個 class、第三方庫或框架時非常好用。在 Eclipse 中可以通過 Window Preferences >>Java Debug >>Step Filtering 配置。

Drop to frame (跳出函數到選定層)

這種技術可以在調試期間選擇并重新執行程序的一部分:指定程序調用堆棧中任意幀(frame),在 Debug View 中點擊 Drop-to-frame 按鈕,調試器會從這里重新啟動。Drop to frame 不會影響字段或現有數據,例如已寫入數據庫的記錄。

1 遠程調試

大多數 Java IDE 都支持 JVM 遠程調試。設置調試參數如下:

4334e2ff77585f46bebfd7fdd4bdfdff.png

Eclipse 用戶需輸入主機名 (hostname) 和端口號,如下圖所示:

bf6735b72ddb889cd3ed37a47c780c2a.png

2 在生產環境調試 Java

現如今開發節奏越來越快,代碼發布也是如此。無論測試流程如何嚴格,總會有漏網之魚。當這些漏洞遇到生產中的實際數據,產生的壓力隨之飆升。因此,進行系統擴展的同時解決潛在的漏洞非常關鍵。

下面的策略可供每個 Java 開發者參考:

  • 確定錯誤發生的時間;
  • 評估錯誤的嚴重程度(優先級);
  • 篩選定位導致程序出錯的狀態;
  • 接下來,跟蹤并解決根本原因(root cause);
  • 最后,打補丁。

除了上面的五個步驟,還應當遵守下面這些生產環境最佳實踐:

提高日志等級

大多數情況下,錯誤信息沒有包含足夠的上下文內容,因此調試時需要提升日志等級。完整的上下文內容可以有效地理解、定位和確定錯誤的根本原因。一種常見的方法,在每個線程的入口點生成 UUID。

理想情況下,可以按照以下格式設置線程名稱:

e2b1bb600922ecf8a3480ac3afff0b3c.png

這樣,堆棧跟蹤信息會以 “threadName: pool-7-thread-22, UUID: EB85GTA, MsgType: AnalyzeGraph, MsgID: 415669, 29/03/2020 04:44” 開頭,比起 “pool-7-thread-22” 這樣的名字更有意義。

集中日志

在應用程序生命周期各階段尤其是生產階段處理錯誤時,應優先考慮高效的日志記錄機制。把會話中所有重要事件匯集到統一的日志服務器,不但能夠降低調試的難度,而且在跟蹤關鍵產品指標時,還可以幫助監視應用程序中發生錯誤的情況。

檢查堆棧跟蹤和其他日志

調試異常時,堆棧跟蹤非常有用:它能幫助確定在程序崩潰時調用了哪些函數以及調用順序。下面的代碼使用 printStack() 方法打印異常堆棧:

40fff67b351df4e493c00e5a59a79175.png

輸出結果:

ec8f294b6fa939e000e8ac4d51069e99.png

復制實例

獲取日志后,接下來最重要的是在復制場景(實例)。通常會創建一個與 IDE 調試類似的環境,便于分析與解決錯誤。

3 總結

Java 調試并不是開發者的噩夢。一點創造性思維加上合適的工具,開發者會更有信心、更加快速準確地識別、診斷和解決代碼中的錯誤。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542714.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542714.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542714.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python字符串轉浮點數_Python | 打印不同的值(整數,浮點數,字符串,布爾值)...

python字符串轉浮點數In the given example, we are printing different values like integer, float, string and Boolean using print() method in python. 在給定的示例中,我們使用python中的print()方法打印不同的值,例如整數,浮點數&…

(6) 如何用Apache POI操作Excel文件-----POI-3.10的一個和注解(comment)相關的另外一個bug...

如果POI-3.10往一個工作表(sheet)里面插入數據的話,需要注意了,其有一個不太被容易發現的bug。 被插入的工作表(sheet)里面的單元格沒有包含任何的注解(comment)的時候,插…

mysql下拉刷新加載數據_下拉刷新、加載數據功能

paging nick加載更多getData();varm0,n2;//m:button點擊次數 n:一次加載幾條數據$(.page-btn-nick).click(getData);functiongetData(){$.ajax(paging.html).then(function(response){//測試url寫本頁面varobj{developer:[{name:nick},{name:ljy},{name:xzl},{name:jeson},{nam…

mcq 隊列_人工智能邏輯才能問答(MCQ)

mcq 隊列1) Why do we want to implement the concept of Logic in an AI system? So that the agent can have decision making capabilitySo that the agent can think and act humanlySo that the agent can apply the logic for finding the solution to any particular p…

第三周作業!

1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。答:本題思路:先用who命令列出當前登陸的用戶信息,然后使用cut命令對字段進行分割,選出我們需要的字段…

python導入模塊以及類_python模塊的導入以及模塊簡介

標簽: 一、模塊的定義及類型 1、定義 模塊就是用一堆的代碼實現了一些功能的代碼的集合,通常一個或者多個函數寫在一個.py文件里,而如果有些功能實現起來很復雜,那么就需要創建n個.py文件,這n個.py文件的集合就是模塊 …

mysql 指定數字排序_Mysql數據排序

排序數據普通字段排序按照單一字段排序按照多個字段排序手動指定排序順序單個字段手動排序多個字段手動排序普通字段排序按照單一字段排序排序采用order by子句,order by后面跟上排序字段,排序字段可以放多個,多個采用逗號間隔,or…

《黃帝內經 —— 央視60集紀錄片》

下載地址: http://pan.baidu.com/s/1dFI8hxf 目錄 第一部 醫史篇第1集:神奇的秘笈(《黃帝內經》是部什么書)第2集:赫赫始祖(上)(黃帝、炎帝)第3集:赫赫始祖&a…

mnist手寫數字數據集_mnist手寫數據集(1. 加載與可視化)

》》歡迎 點贊,留言,收藏加關注《《1. 模型構建的步驟:在構建AI模型時,一般有以下主要步驟:準備數據、數據預處理、劃分數據集、配置模型、訓練模型、評估優化、模型應用,如下圖所示:【注意】由…

python凱撒密碼實現_密碼:凱撒密碼及其Python實現

python凱撒密碼實現Before we start let’s some basic terminology... 在開始之前,讓我們先介紹一些基本術語... The art and science to achieve security by encoding messages to make them unreadable are known as Cryptography. That’s what the whole art…

qtextedit 默認文案_QT-純代碼控件-QSplitter(分裂器)

版權聲明:本文為博主原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接和本聲明。本文鏈接:https://blog.csdn.net/qq_41488943/article/details/96431379使用Qplitter實現頁面的三布局分布1.新建一個無ui界面的工程&…

TYVJ P1030 乳草的入侵 Label:跳馬問題

背景 USACO OCT09 6TH描述 Farmer John一直努力讓他的草地充滿鮮美多汁的而又健康的牧草。可惜天不從人愿&#xff0c;他在植物大戰人類中敗下陣來。邪惡的乳草已經在他的農場的西北部份佔領了一片立足之地。草地像往常一樣&#xff0c;被分割成一個高度為Y(1 < y < 100)…

kotlin中既繼承又實現_Kotlin程序| 解決繼承中的主要沖突的示例

kotlin中既繼承又實現繼承中的主要沖突 (Overriding Conflicts in Inheritance) It may appear, we inherit more than one implementation of the same method. 看來&#xff0c;我們繼承了同一方法的多個實現。 Need to implement all the methods which we have inherited f…

python雷達圖詳解_Python簡單雷達圖繪制

import numpy as np import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams[font.family] SimHei matplotlib.rcParams[font.sans-serif] [SimHei] lables np.array([綜合,KDA,發育,推進,生存,輸出]) nAttr 6 date np.array([7, 5, 6, 9, 8, 7]) angles…

瀏覽器兼容問題 透明度 position:fixed bootstrap

瀏覽器兼容問題&#xff1a;主要是ie8以下&#xff1a; 用bootstrap框架結合jq寫頁面&#xff0c;因為bootstrap有好多media和html5所以要在引入樣式后引入兩個js <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --><!-- WARNI…

s查找mysql服務_MySQL菜鳥實錄(一):MySQL服務安裝實戰

CentOS 7基本信息系統版本&#xff1a; CentOS 7.3 64bit系統配置&#xff1a; 4vCPUs | 8GB磁盤空間&#xff1a;[rootecs-ce5a-0001 ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/vda1 40G 17G 22G 44% /devtmpfs 3.9G 0 3.9G 0% /devtmpfs 3.9G 0 3.9G 0% /dev…

實驗一 線性表的順序存儲與實現_【自考】數據結構中的線性表,期末不掛科指南,第2篇

線性表這篇博客寫的是線性表相關的內容&#xff0c;包括如下部分&#xff0c;先看下有木有期待啥是線性表線性表的順序存儲線性表的基本運算在順序表上的實現線性表的鏈式存儲線性表的基本運算在單鏈表上的實現循環鏈表與雙向循環鏈表Over&#xff0c;內容還蠻多的&#xff01;…

二叉樹打印葉子節點,非遞歸_使用遞歸打印鏈接列表中的備用節點

二叉樹打印葉子節點,非遞歸Solution: 解&#xff1a; Input: A singly linked list whose address of the first node is stored in a pointer, say head 輸入&#xff1a;一個單鏈表 &#xff0c;其第一個節點的地址存儲在指針中&#xff0c;例如head Output: The alternati…

TYVJ P1012 火柴棒等式 Label:枚舉

背景 NOIP2008年提高組第二題描述 給你n根火柴棍&#xff0c;你可以拼出多少個形如“ABC”的等式&#xff1f;等式中的A、B、C是用火柴棍拼出的整數&#xff08;若該數非零&#xff0c;則最高位不能是0&#xff09;。用火柴棍拼數字0-9的拼法如圖所示&#xff1a;注意&#xff…

java math max_Java Math類靜態double max(double d1,double d2)示例

java math max數學類靜態double max(double d1&#xff0c;double d2) (Math Class static double max(double d1,double d2) ) This method is available in java.lang package. 此方法在java.lang包中可用。 This method is used to return the maximum one of both the give…