1. 工程上的JDB是什麼
JDB:就是無油滑動軸承、石墨銅套的簡稱。是在高力黃銅的基體上,鑲嵌石墨或MoS2固體潤滑劑的一高性能固體潤滑產品。它突破了一般軸承依靠油膜潤滑的局限性。在使用過程中,通過摩擦熱使固體潤滑劑與軸摩擦,形成油、粉末並存潤滑的優異條件,既保護軸不磨損,又使固體潤滑特性永恆。它的硬度比一般銅套高一倍,耐磨性能也高一倍。目前已廣泛運用於冶金連鑄機,列車支架、軋鋼設備、起重機械、模具導套、礦山機械、船舶、輪機等高溫、高載、低速重載等場合使用。
JDB是基於文本和命令行的調試工具(例如Sun JDB);雖然現在有一些很好的調試工具,然而 java 調試器 (JDB) 提供了一些優點。最重要的是 JDB 可以免費獲取並且是平台獨立的。其缺點是它只有命令行格式,一些開發人員認為這很原始,而且難以使用。一些 IDE 已經將 GUI 界面構建到 JDB 調試 API(如 Jikes)。JDB 是 JDK 安裝的一部分。它在 Java 2 平台中得到了增強。
2. 如何用代碼調試實物板
如何用代碼調試實物板,什麼是代碼調試?
查找和改正錯誤的過程稱為調試(debugging)。
調試的一般途徑是採用各種方法逐步縮小程序中 bug 所在的范圍。
二、常見的代碼調試方式
2.1、手工跟蹤(hand trace)
手工跟蹤(hand trace)程序(即通過讀程序找錯誤),也可以插入列印語句,顯示變數的值或程序的執行流程。
2.2、手工跟蹤的適用范圍
這種方法適用於短小、簡單的程序。
2.3、使用調試工具
對於龐大、復雜的程序,最有效的調試方法還是使用調試工具。
JDK 包含了一個命令行調試器 Jdb,結合一個類名來調用該命令。
Jdb 本身也是一個 Java 程序,運行本身的一個 Java 解釋器的拷貝。
2.4、調試工具具備的特性
所有的 Java IDE 工具,比如 Eclipse 和 NetBeans 包含集成的調試器。調試器應用讓你可以跟蹤一個程序的執行。他們因程序的不同,但是大都支持以下特徵中的多數:
3. jdb的命令列表
1. ** 命令列表 **
2. connectors - 列出此 VM 中可用的連接器和傳送器 3.
4. run [類 [參數]] - 開始執行應用程序的主類 5.
6. threads [線程組] - 列出線程 7. thread <線程 ID> - 設置默認線程
8. suspend [線程 ID] - 暫停線程(默認為所有線程) 9. resume [線程 ID] - 恢復線程(默認為所有線程) 10. 其中 [<線程 ID> | all] - 轉儲線程的堆棧
11. 其中 [<線程 ID> | all] - 轉儲線程的堆棧,以及 pc 信息 12. up [n 幀] - 向上移動線程的堆棧 13. down [n 幀] - 向下移動線程的堆棧
14. kill <線程 ID> <表達式> - 中止具有給定的異常對象的線程 15. interrupt <線程 ID> - 中斷線程 16.
17. print <表達式> - 輸出表達式的值 18. mp <表達式> - 輸出所有對象信息
19. eval <表達式> - 輸出表達式的值(與 print 相同) 20. set <lvalue> = <表達式> - 為欄位/變數/數組元素指定新值 21. locals - 輸出當前堆棧幀中的所有局部變數 22.
23. classes - 列出當前已知的類 24. class <類 ID> - 顯示已命名的類的詳細信息 25. methods <類 ID> - 列出類的方法 26. fields <類 ID> - 列出類的欄位 27.
28. threadgroups - 列出線程組 29. threadgroup <名稱> - 設置當前線程組 30.
31. stop in <類 ID>.<方法>[(參數類型,...)]
32. - 在方法中設置斷點 33. stop at <類 ID>:<行> - 在行中設置斷點 34. clear <類 ID>.<方法>[(參數類型,...)]
35. - 清除方法中的斷點 36. clear <類 ID>:<行> - 清除行中的斷點 37. clear - 列出斷點 38. catch [uncaught|caught|all] <類 ID>|<類模式>
39. - 出現指定的異常時中斷 40. ignore [uncaught|caught|all] <類 ID>|<類模式>
41. -- 對於指定的異常,取消 catch 42. watch [access|all] <類 ID>.<欄位名>
43. - 監視對欄位的訪問/修改 44. unwatch [access|all] <類 ID>.<欄位名>
45. - 停止監視對欄位的訪問/修改 46. trace methods [線程] - 跟蹤方法輸入和退出 47. untrace methods [線程] - 停止跟蹤方法輸入和退出 48. step - 執行當前行
49. step up - 執行到當前方法返回到其調用程序 50. stepi - 執行當前指令
51. next - 跳過一行(跨過調用) 52. cont - 從斷點處繼續執行 53.
54. list [line number|method] - 輸出源代碼 55. use(或 sourcepath) [源文件路徑]
56. - 顯示或更改源路徑 57. exclude [<類模式>, ...| 「無」]
58. - 對於指定的類,不報告步驟或方法事件 59. classpath - 從目標 VM 輸出類路徑信息 60.
61. monitor <命令> - 每次程序停止時執行命令 62. monitor - 列出監視器 63. unmonitor <監視器號> - 刪除監視器
64. read <文件名> - 讀取並執行命令文件 65.
66. lock <表達式> - 輸出對象的鎖信息 67. threadlocks [線程 ID] - 輸出線程的鎖信息 68.
69. pop - 彈出整個堆棧,且包含當前幀 70. reenter - 與 pop 相同,但重新輸入當前幀 71. redefine <類 ID> <類文件名>
72. - 重新定義類的代碼 73.
74. disablegc <表達式> - 禁止對象的垃圾收集 75. enablegc <表達式> - 允許對象的垃圾收集 76.
77. !! - 重復執行最後一個命令 78. <n> <命令> - 將命令重復執行 n 次 79. help(或 ?) - 列出命令 80. version - 輸出版本信息 81. exit(或 quit) - 退出調試器 82.
83. <類 ID>:帶有軟體包限定符的完整類名 84. <類模式>:帶有前導或後綴通配符 (*) 的類名 85. <線程 ID>: threads 命令中報告的線程號 86. <表達式>:Java(TM) 編程語言表達式。 87. 支持大多數常見語法。 88.
89. 可以將啟動命令置於 jdb.ini 或 .jdbrc 之中 90. (兩者位於 user.home 或 user.dir 中
4. 如何讓android啟動時顯示命令行
1.TraceView
1)功能:用於熱點分析和性能優化,分析每個函數佔用的CPU時間,調用次數,函數調用關系等
2)方法:
a)在程序代碼中加入追蹤開關
import android.os.Debug;
……
android.os.Debug.startMethodTracing(「/data/tmp/test」);// 先建/data/tmp目錄
……// 被追蹤的程序段
android.os.Debug.stopMethodTracing();
b)編譯,運行後,設備端生成/data/tmp/test.trace文件
c)把trace文件復制到PC端
$ adb pull /data/tmp/test.trace ./
d)使用android自帶工具分析trace文件
$ANDROID_SRC/out/host/linux-x86/bin/traceview test.trace
此時可看到各個函數被調用的次數CPU佔用率等信息
e)使用android自帶工具分析生成調用關系類圖
$ apt-get install graphviz# 安裝圖片相關軟體
$ANDROID_SRC/out/host/linux-x86/bin/dmtracemp -g test.png test.trace
此時目錄下生成類圖test.png
3)注意
trace文件生成與libdvm模塊DEBUG版本相沖突,所以此方法只適用於對非DEBUG版本模擬器的調試,否則在分析trace文件時會報錯
2.HProf (Heap Profile)
1)功能:
用於java層面的內存分析,顯示詳細的內存佔用信息,指出可疑的內存泄漏對象
2)方法:
a)在代碼中加入mp動作
import android.os.Debug;
import java.io.IOException;
……
try {
android.os.Debug.mphprofData(「/data/tmp/input.hprof」); // 先建/data/tmp目錄
} catch (IOException ioe) {
}
b)把hprof文件復制到PC端
$ adb pull /data/tmp/input.hprof ./
c)使用命令hprof-conv把hprof轉成MAT識別的標準的hprof
$ $ANDROID_SRC/out/host/linux-x86/bin/hprof-conv input.hprof output.hprof
d)使用MAT工具看hprof信息
下載MAT工具:http://www.eclipse.org/mat/downloads.php
用工具打開output.hprof
3)注意:此工具只能顯示java層面的,而不能顯示C層的內存佔用信息
3.SamplingProfile (android 2.0上版本使用)
1)功能
每隔N毫秒對當前正在運行的函數取樣,並輸出到log中
2)在代碼中加入取樣設定
import dalvik.system.SamplingProfiler
……
SamplingProfile sp = SamplingProfiler.getInstance();
sp.start(n);// n為設定每秒采樣次數
sp.logSnapshot(sp.snapshot());
……
sp.shutDown();
它會啟一個線程監測,在logcat中列印信息
4.用發系統信號的方式取當前堆棧情況和內存信息
1)原理
dalvik虛擬機對SIGQUIT和SIGUSR1信號進行處理(dalvik/vm/SignalCatcher.c),分別完成取當前堆棧和取當前內存情況的功能
2)用法
a)$ chmod 777 /data/anr -R# 把anr目錄許可權設為可寫
$ rm /data/anr/traces.txt# 刪除之前的trace信息
$ ps # 找到進程號
$ kill -3 進程號 # 發送SIGQUIT信號給該進程,此時生成trace信息
$ cat /data/anr/traces.txt
功能實現:遍歷thread list(dalvik/vm/Thread.c:dvmDumpAllThreadEx()),並列印當前函數調用關系(dalvik/vm/interp/Stack.c:mpFrames())
b)$ chmod 777 /data/misc -R
$ ps # 找到進程號
$ kill -10 進程號 # 發送SIGQUIT信事信號給該進程,此時生成hprof信息
$ ls /data/misc/*.hprof
此時生成hprf文件,如何使用此文件,見第二部分(HProf)
注意:hprof文件都很大,注意用完馬上刪除,以免占滿存儲器
5.logcat及原理
1)android.util.Log利用println的標准java輸出詞句,並加前綴I/V/D….
2)dalvik利用管道加線程的方式,先利用p2把stdout和stderr重定向到管理中(vm/StdioConverter.c:dvmstdioConverterStartup),然後再啟動一個線程從管道另一端讀出內容(dalvik/vm/StdioConverter.c:stdioconverterThreadSt art()),使用LOG公共工具(system/core/liblog/logd_write.c: __android_log_print())輸出到/dev/log/*中去
3)logcat通過加不同參數看/dev/log/下的不同輸入信息
# logcat -b main顯示主緩沖區中的信息
# logcat -b radio顯示無線緩沖區中的信息
# logcat -b events顯示事件緩沖區中的信息
6.jdwp(java debug wire protocol)及原理
1)虛擬機(設備端)在啟動時載入了Agent JDWP 從而具備了調試功能。在調試器端(PC端)通過JDWP協議與設備連接,通過發送命令來獲取的狀態和控制Java程序的執行。JDWP 是通過命令(command)和回復(reply)進行通信的。
2)JDK 中調試工具 jdb 就是一個調試器,DDMS也提供調試器與設備相連。
3)dalvik為JDWP提供了兩種連接方式:tcp方式和adb方式,tcp方式可以手工指定埠,adb方式自動設定為8700埠,通常使用DDMS調試就是通過adb方式
7.monkey
1)monkey是一個android自帶的命令行工具。它向系統發送偽隨機的用戶事件流,實現對正在開發的應用程序進行壓力測試。
2)方法
在設備端打開setting界面
$ adb shell
# monkey -p com.android.settings -v 500
此時可以看到界面不斷被切換
8.其它小工具
具體見android.os.Debug中提供的工具
1)取毫微秒級的時間,用於計算時間
threadCpuTimeNanos()
2)統計兩點間的內存分配情況
startAllocCounting()
stopAllocCounting()
getGlobalAllocCount()
get…..
3)列印當前已load的class
getLoadedClassCount()
printLoadedClasses()它需要打開NDEBUG功能才能打開system/core/中Log功能
9.列印debug信息
$ adb bugreport
5. Java有位元組碼級別的單步動態調試工具嗎
作者:RednaxelaFX
鏈接:https://www.hu.com/question/36051329/answer/65735192
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
例如這個?Bytecode Visualizer不過題主想要的功能多半還得在上面這個工具的基礎之上再擴展一下。我自己做位元組碼層面調試的時候通常就直接用JDK自帶的jdb命令行調試器,支持位元組碼層面調試,不過用起來當然沒有帶GUI的工具那麼直觀咯。之前寫的一篇博文里有用jdb舉過例子:借HSDB來探索HotSpot VM的運行時數據。雖然那篇沒有提到,但其實用 stepi 和 nexti 命令就可以在jdb里做位元組碼層面的單步調試(普通的基於代碼行的單步調試命令則是 step 和 next,少個i後綴)。jdb的位元組碼層面調試最讓人不爽的一點就是它不能在任意位元組碼指令上設斷點。我以前用jdb都是只能設方法入口斷點然後不斷的 stepi 單步走到我要的指令上。這對稍微復雜一點的調試工作來說就極其紗布。jdb間接基於JVMTI實現,而JVMTI的SetBreakpoint函數其實是可以在任意位元組碼指令上設斷點的,只要GetJLocationFormat返回1(JVMTI_JLOCATION_JVMBCI)。jdb直接基於的是JVMTI之上的Java層包裝,JDI。它的本體入口在這里:jdk7u/jdk7u/jdk: e228aaace9c9 src/share/classes/com/sun/tools/example/debug/tty/TTY.java而斷點相關的部分在這里:jdk7u/jdk7u/jdk: e228aaace9c9 src/share/classes/com/sun/tools/example/debug/tty/BreakpointSpec.java鼓搗鼓搗這里就能讓它支持位元組碼指令層面(BCI,bytecode index)的斷點…
6. 下列哪個選項是Java調試器,如果編譯器返回程序代碼的錯誤,可以用它對程序進行調試( )
調試器--jdb.exe(轉)
Java調度器為Java程序提供了一個命令行調試環境。它既可在本地,也可在與遠程的解釋器的一次對話中執行。
jdb於本地機器中可用如下的命令啟動:
C:>jdb classname
當你使用-debug選項開始一個Java常式時, 必須提供給Jdb 一個密碼, 這樣 Jdb才能開始運轉起來。下表包含了所有jdb命令。
選項 功能
catch calssID 為特定異常出口而中斷
classes 列出當前已知的類
clear classID:line 清除一個斷點
cont 從斷點處繼續執行
down[n frames] 下移一個線程的堆棧
mp ID[ID...] 顯示所有對象信息
exit(或quit) 退出調試器
help(或?) 列出所有命令
ignore classID 忽略特定的異常出口
list[line number] 顯示源代碼
load classbame 載入要調試的Java類
locals 在當前堆棧幀中顯示所有局部變數
memory 報告內存使用情況
methods classID 列出一個類的成員函數集
print ID[ID...] 列出對象或域
resume [threadID...] 恢復線程(默認情況恢復所有線程)
run class [args] 開始執行已下載的Java類
step 執行當前行
stop in classID:method 在一成員函數中設一斷點
stop at classID:line 在一行設一斷點
suspend[threadID...] 停止一個線程(默認情況停止所有線程)
hreads threadgroup 列出線程
thread threadID 設置當前線程
threadgroups 列出線程組
threadgroup name 設置當前線程組
up [n frames] 上移一個線程堆棧
use [path] 顯示或改變源程序路徑
where [threadID] or all 使一線程的堆線置空
!! 重復上一次命令
-host hostname 該命令告訴Jdb到哪裡去建立遠程運行的Java解釋器對話過程
-password password 本選項告訴Jdb 用哪個密碼去與遠程運行的Java 對話進程相連接。 密碼 password是由運行帶有-debug選項的Java解釋器所提供的。
7. java項目中如何打斷點測試
如果使用的是MyEclipse或者eclipse,只需要在編輯器中對你認為容易出問題的地方左邊對應的行數雙擊添加斷點即可,然後啟動debug(也就是debug模式啟動),就是工具欄中像獨角仙的那個。。
8. jdb什麼意思
JDB是基於文本和命令行的調試工具(例如Sun JDB)。
雖然有一些很好的調試工具,然而 Java 調試器 (JDB) 提供了一些優點。最重要的是 JDB 可以免費獲取並且是平台獨立的。
相關信息:
其缺點是它只有命令行格式,一些開發人員認為這很原始,而且難以使用。一些 IDE 已經將 GUI 界面構建到 JDB 調試 API(如 Jikes)。JDB 是 JDK 安裝的一部分。它在 Java 2 平台中得到了增強。
JDB還有很多的調試手段,除了上面那些最常用的,其他很重要的還有clear清除斷點,use設置源程序路徑,memory顯示當前內存使用狀況,gc強制進行內存回收,重復上面的命令,thread設置當前線程,quit和exit退出jdb等,還有遠程調試等內容,都很有用。
9. java中調用jdb去debug別的程序要怎麼編
java.lang.Process p=java.lang.Runtime.getRuntime().exec(命令行);
InputStream in=getInputStream();
OutputStream out=getOutputStream();
在out流里寫命令,從in流里得到返回,理論上可以,沒試過。