I want to fly higher
programming Explorer
BlogJava
首頁
新隨筆
新文章
聯系
聚合
管理
posts - 114,comments - 263,trackbacks - 0
<
2011年2月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
常用鏈接
我的隨筆
我的文章
我的評論
我的參與
最新評論
留言簿
(5)
給我留言
查看公開留言
查看私人留言
隨筆分類
(161)
Book(25)
ClassLoader(5)
Concurrency
Dababase
GameServer(10)
HighPerformance
HotSwap(9)
IO
JVM(6)
Language(2)
Mobile
NetWork(2)
NoSQL
Note(8)
OS(6)
Program(69)
Script(1)
ServerFramework(6)
Shell
Sources(8)
Translations
Utils(4)
隨筆檔案
(114)
2018年6月 (1)
2018年3月 (1)
2017年3月 (2)
2017年2月 (2)
2017年1月 (1)
2016年11月 (2)
2016年7月 (4)
2016年6月 (3)
2016年5月 (2)
2015年12月 (2)
2015年10月 (1)
2015年8月 (1)
2015年7月 (4)
2015年6月 (5)
2014年12月 (1)
2014年11月 (4)
2014年4月 (1)
2014年3月 (3)
2014年2月 (5)
2014年1月 (1)
2013年12月 (7)
2013年11月 (4)
2013年8月 (5)
2013年7月 (3)
2013年3月 (6)
2013年1月 (6)
2012年7月 (1)
2011年12月 (9)
2011年8月 (2)
2011年5月 (1)
2011年2月 (2)
2011年1月 (1)
2010年12月 (2)
2010年11月 (1)
2010年7月 (8)
2010年4月 (3)
2010年3月 (3)
2010年2月 (2)
2010年1月 (2)
文章分類
(2)
學習筆記(2)
文章檔案
(2)
2011年12月 (2)
Alibaba
搜索技術博客-淘寶
淘寶開源項目
阿里中間件團隊博客
阿里技術嘉年華
阿里核心系統團隊博客
Comprehensive
InfoQ - 促進軟件開發領域知識與創新的傳播
LinkedIn
stackoverflow
伯樂在線
內存-溢出 為程序員服務
騰訊大講堂
解道
Expert
jrebel
國外牛博
并發編程高手
莊周夢蝶
洞庭散人
美團技術博客
褚霸
Game
云風
Java
JavaEye做最棒的軟件開發交流社區
coderanch
IBM developerWorks 中國 Java 技術專區
Java Tutorials
Javalobby
javapapers
java-source
java-tips
javaworld
Java極客
Java譯站
Programming Tutorial
TheServerSide
專注Java & Android 技術分享
并發編程網
搜索
積分與排名
積分 - 599776
排名 - 78
最新評論
1.?re: Eclipse反編譯工具Jad及插件JadClipse配置
剛剛問題解決了,file types中, .class下還有一個 .class without source。
把這個也設置成JadClipse為默認選項打開嘛,即可。
謝謝版主~~~
--tangyuan
2.?re: Eclipse反編譯工具Jad及插件JadClipse配置
eclipse4.6版本,按照上述來的不行,版主還有推薦的反編工具嘛,推薦一個呢
--tangyuan
3.?re: 交換兩個值,不用臨時變量(C位運算)[未登錄]
評論內容較長,點擊標題查看
--123
4.?re: Markdown基礎語法及發布blog
確實很基礎的語法,很容易就學會了!
--有機綠茶
5.?re: Java8之Stream/Map[未登錄]
總結的很詳細!
--jay
閱讀排行榜
1.?Eclipse反編譯工具Jad及插件JadClipse配置(134367)
2.?Unknown Source的出現及解決(39532)
3.?MMORPG服務器架構(33490)
4.?Java8之Stream/Map(24541)
5.?淺談Eclipse dropins插件安裝的"坑"(附m2e的各個版本插件下載)(19642)
Unknown Source的出現及解決
昨天在公司寫了一段代碼,很簡單,就是測試
Thread的dumpStack
方法的使用。因為Thread的dumpStack方法不是很常用,但它對于如果
想看看誰在運行時調用方法還是非常有幫助
的?;氐秸},看輸出結果:
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(
Unknown Source
)
at Common.getInfo(Tes
tDumpStack.java:21
)
at TestDumpStack.main(
TestDumpStack.java:7
)
大家可以看到在輸出的第二行,顯示的是at java.lang.Thread.dumpStack(Unknown Source)。為什么自己寫的代碼就顯示出了源碼文件的名字及所在行數,而jdk的類庫就顯示出了Unknown Source?
相信很多人在
調試代碼,用log工具打印堆棧異常信息,查看代碼所在行的相關調試信息時
,經常會遇到Unknown Source這個頭痛的問題。那么這個東西到底如何而來?
A.Unknown Source從哪來?
Unknown Source,顧名思義,就是未知的源文件。
因為我們最終解釋運行的是class文件,所以出現這個問題的原因很簡單,就是class文件中沒有源文件的相關調試信息。那為什么class文件會沒有調試信息呢?答案更簡單,當然是我們在用javac命令進行編譯的時候沒有指定調試信息唄。
因為現在很多人都習慣用eclipse等一些現成的ide進行編寫代碼,所以很少人熟悉jdk自己的javac,java,jdb等一些命令的詳細參數(jdk的一些命令和eclipse自帶的一些命令可能不同)。哈哈,不過如果你經常在linux下玩java的話,命令肯定會非常熟悉。那么讓我們看看javac的一些重要參數:
-g-Generate all debugging information, including local variables. By default, only line number and source file information is generated
.在class文件中生成所有調試信息,包括局部變量的信息。默認的話,只寫入源碼的行號和源文件信息。
-g:none-Do not generate any debugging information
.不生成任何調試信息。
-g:(lines,vars,source)-
只生成部分調試信息(源碼行號,變量,源文件信息)。那我們在分別介紹下lines,vars,source的含義。
lines
:將源文件中的行號信息寫到Class文件中,此屬性用于在Class文件中生成方法字節碼流偏移量和源代碼行號之間的映射關系。如果我們不指定此屬性的話,我們將在堆棧異常信息中看不到打印的行號。
vars
:Local variable屬性建立了方法的棧幀中局部變量部分內容與源代碼中局部變量名稱和描述符之間的映射關系。有了這個屬性,調試時,我們才可以看到變量的值。
source
:編譯時指定了這個屬性,會把源文件的屬性信息如源文件名稱寫入class文件。
說了這么多,初學者可能會迷糊,為什么編譯要指定這些調試信息呢?哈哈,
如果編譯不指定這些調試信息的話,你怎么調試呢
?如果你不指定行號信息的話,你在ide中都無法插入斷點。這些調試信息在我們調試程序的時候非常重要。不過這些編譯選項通常在ide中如eclipse中早已默認了。有的人可能還不相信,打開eclipse,依次打開菜單選項:
Window->Preferences->Java->Compiler
,可以看到頁面的下方有一個Classfile Generation,默認是四個選項都選的。
那這個Unknown Source到底是編譯的時候沒有指定哪一項呢?經過測試,
我發現是javac編譯的時候沒有沒有指定source選項,必定出Unknown Source這個問題。
PS1:linux下,很多人用
ant
進行javac任務編譯,查看堆棧異常時也經常會遇到Unknown Source的問題。
ant編譯時,默認相當于指定-g:none
,及不生成任何調試信息的。所以如果要看到日志分析中的源碼和行號信息時,要更改build.xml中的dubug屬性。
PS2:我覺得看看
Log4j
的日志操作類源碼包會對這個理解更有幫助。
B
.剛開始的代碼引子中,為什么自己寫的代碼會有堆棧異常的代碼行數顯示,而jdk的類庫(rt.jar-Runtime Java Archive)代碼會出現Unknown Source?
答案很簡單,因為我們直接用的是jdk直接編譯好的class文件。而
rt.jar源碼編譯打包的時候,是沒有將調試信息放入class文件的
。所以才會顯示Unknown Source。其實,道理很簡單,sun的類庫正常的情況下肯定不會有bug的,之前肯定都是調試過很多遍的,所以沒有必要再加入調試信息,你只負責用就行了。所以,出現Unknown Source很正常。
PS:其實,我覺得這和軟件的開發版本差不多。版本一般都有
dubug
版本和
release
版本。debug版本就是包含調試信息的。不過正式發行后,肯定不包含調試信息的。因為如果包含調試信息的話,可能版本占用空間會很大,而且根本就無需調試信息。
C.如果我們非要對jdk的類庫如rt.jar進行跟蹤調試怎么辦?
因為rt.jar編譯打包的時候,是不包含調試信息的。如果你只是想看看調用的過程,你只需要在
eclipse中rt.jar下的Source attachment指定jdk安裝目錄的src.zip即可
。不過如果你想跟蹤jdk類庫的變量值的時候,這樣就不行了。除非,只有一種辦法,你
重新編譯一下src.zip
,指定好編譯參數,然后用新編譯好的rt.jar覆蓋掉原來的rt.jar。這樣就完全ok了。
D.如果我們想debug其他沒有源代碼的class文件呢?
其實,也不難,利用jad等反編譯工具編譯出源碼后,在進行調試。不過前提是該class文件有調試信息。
PS:在網上看到了一些打印堆棧異常信息的代碼,發現有的竟然打印出了jdk源碼的所在行數。如
at java.lang.Thread.dumpStack(Thread.java:1206)等。我覺得很好奇,原因可能是重新編譯了jdk的源碼或者可能用的不同的ide或者不同版本的jdk吧。這個尚需考證。如果有懂的童鞋,可以和我交流
。
終于寫完了??赡苡泻芏?/span>地方需要改正,希望不吝指教。看了看時間,是凌晨1:46分。不早了,該睡了。天亮說晚安。
posted on 2011-02-27 01:54
landon
閱讀(39532)
評論(1)
編輯
收藏
所屬分類:
Program
FeedBack:
#
re: Unknown Source的出現及解決
2015-03-16 19:26 |
he
看不懂解決方法是甚麼啊
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
Java游戲服務器基礎技術體系
Disruptor入門Ⅰ-Getting Started
Rust/Go/Node.js/Io.js/Groovy/Scala/Lua 語言入門 Ⅰ
Vertx VS Undertow Ⅰ
Java多線程筆記9-InheritableThreadLocal
Java8之Time/Annotation
Java8之Stream/Map
Java8之Lambda
apache-mina-2.07源碼筆記6-nio細節
Java多線程筆記8-ThreadLocal
Copyright ©2025 landon Powered By
博客園
模板提供:
滬江博客
主站蜘蛛池模板:
亚洲av最新在线网址
|
亚洲av无码一区二区三区在线播放
|
久久精品国产精品亚洲艾
|
瑟瑟网站免费网站入口
|
精品视频在线免费观看
|
啦啦啦高清视频在线观看免费
|
色视频色露露永久免费观看
|
国产成人亚洲精品
|
成年人在线免费看视频
|
亚洲国产精品国产自在在线
|
看成年女人免费午夜视频
|
亚洲精品成人区在线观看
|
一级黄色毛片免费看
|
69天堂人成无码麻豆免费视频
|
亚洲精品在线播放
|
日产久久强奸免费的看
|
午夜性色一区二区三区免费不卡视频
|
亚洲美女aⅴ久久久91
|
美女裸体无遮挡免费视频网站
|
免费国产人做人视频在线观看
|
久久亚洲国产伦理
|
直接进入免费看黄的网站
|
亚洲男人的天堂在线va拉文
|
九一在线完整视频免费观看
|
日本特黄特色免费大片
|
久久久亚洲精品无码
|
精品免费久久久久久久
|
亚洲精品成a人在线观看☆
|
91精品啪在线观看国产线免费
|
亚洲日本在线免费观看
|
国产男女猛烈无遮挡免费网站
|
东方aⅴ免费观看久久av
|
亚洲美女视频免费
|
国产精品成人免费综合
|
成人网站免费大全日韩国产
|
亚洲精品亚洲人成在线麻豆
|
日韩免费高清一级毛片在线
|
99在线免费视频
|
国产AⅤ无码专区亚洲AV
|
国产成人人综合亚洲欧美丁香花
|
亚洲国产精华液网站w
|