使用调试器进行事后跟踪
我最近一直在使用的大多數調試器的好功能是能夠在斷點上記錄信息。 這對理解代碼而無需修改是非常有用的,它涉及字節碼修改。
讓我們考慮一下這種非常瑣碎且效率低下的函數實現,以返回斐波那契數列中的第n個數字。
現在我們添加一個簡單的斷點,我將對其進行一些修改,以使其不會停止; 但是它將記錄一個簡單的表達式,該表達式為我們提供了number的當前值
這為我們效率不高的代碼提供了以下輸出:
ebugger connected to local process. Source breakpoint: Fib.java:11, evaluate(number)=10 (long) Source breakpoint: Fib.java:11, evaluate(number)=8 (long) Source breakpoint: Fib.java:11, evaluate(number)=6 (long) Source breakpoint: Fib.java:11, evaluate(number)=4 (long) Source breakpoint: Fib.java:11, evaluate(number)=2 (long) Source breakpoint: Fib.java:11, evaluate(number)=0 (long) Source breakpoint: Fib.java:11, evaluate(number)=1 (long) Source breakpoint: Fib.java:11, evaluate(number)=3 (long) Source breakpoint: Fib.java:11, evaluate(number)=1 (long) Source breakpoint: Fib.java:11, evaluate(number)=2 (long) ... sometime later Source breakpoint: Fib.java:11, evaluate(number)=1 (long) Source breakpoint: Fib.java:11, evaluate(number)=2 (long) Source breakpoint: Fib.java:11, evaluate(number)=0 (long) Source breakpoint: Fib.java:11, evaluate(number)=1 (long) 55因此,我們在此處所做的就是添加事后跟蹤,您甚至可能無法訪問源,仍然能夠從代碼的工作中獲取有用的信息。
現在,與上面的示例明顯不同的是,我們一次又一次地計算相同的值。 因此,這里是代碼的另一個版本,它使用Map來存儲序列中先前計算的值。 還請注意,在不使Lambda變得不那么漂亮的情況下,將跟蹤添加到此代碼比在以前的情況下更加痛苦。
import java.util.HashMap; import java.util.Map;public class Fib {Map<Long, Long> data = new HashMap<>();{data.put(1L, 1L);}public long fib(long number) {return data.computeIfAbsent(number,n -> n < 1 ? 0 : fib(n - 2) + fib(n - 1)); // Breakpoint here}public static void main(String[] args) {Fib fib = new Fib();System.out.println(fib.fib(10L));}}這里需要注意兩件事,首先,斷點日志表達式應評估Lambda參數n的值,其次是您應始終將表達式放在新行上,以便將來的開發人員可以輕松地對其進行斷點。 (現在,如果將代碼放在一個代碼上,看起來會顯得小得多/漂亮/聰明)。
因此,跟蹤輸出現在如下所示,因為每個值只計算一次,所以效果更好。
Debugger connected to local process. Source breakpoint: Fib.java:17, evaluate(n)=10 Source breakpoint: Fib.java:17, evaluate(n)=8 Source breakpoint: Fib.java:17, evaluate(n)=6 Source breakpoint: Fib.java:17, evaluate(n)=4 Source breakpoint: Fib.java:17, evaluate(n)=2 Source breakpoint: Fib.java:17, evaluate(n)=0 Source breakpoint: Fib.java:17, evaluate(n)=3 Source breakpoint: Fib.java:17, evaluate(n)=5 Source breakpoint: Fib.java:17, evaluate(n)=7 Source breakpoint: Fib.java:17, evaluate(n)=9 55 該博客中的屏幕截圖來自Jdeveloper。 但是Intelij和Netbeans中提供了類似的功能,如果您比較精明 ,可以在Eclipse中獲得類似的功能。
翻譯自: https://www.javacodegeeks.com/2014/01/post-hoc-tracing-using-a-debugger.html
總結
以上是生活随笔為你收集整理的使用调试器进行事后跟踪的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乐播手机投手机(乐播投安卓)
- 下一篇: 在Activiti中执行自定义查询