异常java.lang.Thread.dumpStack(Unknown Source)

转自: http://www.blogjava.net/landon/archive/2011/02/27/345265.html


昨天在公司写了一段代码,很简单,就是测试Thread的dumpStack方法的使用。
因为Thread的dumpStack方法不是很常用,但它对于如果想看看谁在运行时调用方法还是非常有帮助的。回到正题,看输出结果:
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Unknown Source)
at Common.getInfo(TestDumpStack.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吧。这个尚需考证。如果有懂的童鞋,可以和我交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java集合框架——接口图+类图+遗留类图

【0】README 0.1)绝对的干货,理清 java集合框架中类和接口的层次关系;

构建maven项目插件_如何构建一个Maven插件

构建maven项目插件使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。 由于其插件生态系统的普及,Apache Maven仍然是Java领域最受欢迎的构建工具。 很容易找到…

shu函数php,【函数分享】每日PHP函数分享(2021-3-3)

array_intersect_assoc — 带索引检查计算数组的交集说明array_intersect_assoc ( array $array1 , array $array2 , array $... ? ) : arrayarray_intersect_assoc() 返回一个数组,该数组包含了所有在 array1 中也同时出现在所有其它参数数组中的值。注意和 arra…

spring 注释_Spring@主要注释

spring 注释介绍: 当存在多个相同类型的bean时,使用Spring Primary批注为标记的bean提供更高的优先级。 默认情况下,Spring按类型自动连线。 因此,当Spring尝试自动装配并且有多个相同类型的bean时,我们将得到一个NoU…

java集合——集合接口+迭代器接口

【0】README 0.1) 本文描述转自 core java volume 1, 源代码 diy 的, 旨在理解 java集合框架——集合接口迭代器接口 的相关知识; 0.2) for full source code , please visit https://github.com/pacosonTang/core-j…

snmp在php中的使用,在php中转换python代码以计算snmpvlan掩码的最佳方法

我有一些python代码,我想在一个100%的php代码中使用。你知道我怎么转换代码吗???我在转换代码时遇到问题,尤其是部分get bit和set bit。在位掩码通过snmp从交换机中读取,掩码表示交换机端口位于定义的vlan中…

java ssl发送邮件_通过SSL发送的Java邮件

java ssl发送邮件抽象 本博客的目的是演示如何使用Java Mail通过具有SSL连接的SMTP服务器发送电子邮件。 免责声明 这篇文章仅供参考。 在使用所提供的任何信息之前,请认真思考。 从中学到东西,但最终自己做出决定,风险自负。 要求 我使用以…

java集合—— 链表(java中的所有链表都是双向链表)

【0】README 0.1) 本文描述转自 core java volume 1, 源代码 diy 的, 旨在理解 java集合—— 链表(java中的所有链表都是双向链表) 的相关知识; 0.2) for full source code , please visit ht…

使用matlab内存不足,Matlab内存不足问题(Out of memory)

今天遇到过这个错误:??? Error using > horzcatOut of memory. Type HELP MEMORY for your options.做算法仿真时,矩阵太大,超出内存了。当信号矩阵缩到可以满足内存时,仿真也没意义了,只有找解决办法了。找到一…

java 邮件 tls_通过TLS发送的Java邮件

java 邮件 tls抽象 本博客的目的是演示如何使用Java Mail通过具有TLS连接的SMTP服务器发送电子邮件。 免责声明 这篇文章仅供参考。 在使用所提供的任何信息之前,请认真思考。 从中学到东西,但最终自己做出决定,风险自负。 要求 我使用以下…

java中的break与continue用法

一、break break 的作用为跳出循环&#xff0c;执行循环外面的操作 &#xff08;1&#xff09;简单break public class Main {public static void main(String[] args) {int i0;for(;i<100;i){if(i2)break;}System.out.println(i);} } 输出结果&#xff1a;2 双重循环 publ…

java中的native关键字有什么作用?(java本地方法)

转自&#xff1a; http://zhidao.baidu.com/link?urlXu94DBMxXz3sJyCrG7G1sCmXoHuyuYx4DMG1x7UqYL7FhfFnqF7-Z9nxIQUpntPkqzaZ0xAyIjKIrEYrwIett_ 1、什么是Native Method 简单地讲&#xff0c;一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一…

php sessionid 重复,php_ session_id 限制同一用户同时登录

出于信息安全的考虑&#xff0c;希望给每个能进入系统的人员一个账户&#xff0c;而不是所有人共用一个账户&#xff0c;并且一个账户同时只能一人登陆。刚开始的做法是登陆加锁&#xff0c;当用户登陆之后&#xff0c;对此用户进行标记&#xff0c;若此用户未下线状态下进行第…

JavaFX之TableView

TableView表 构建一个表主要有TableView,TableColumn,ObservableList,Bean。 添加列table.getColumns().addAll(); ObservableList里面是存放的数据 table.setItems(observableList);添加数据 observableList里面一般是存放的Bean&#xff0c;列与Bean之间建立联系&#xf…

java native关键字(java本地方法)

转自&#xff1a; http://blog.csdn.net/youjianbo_han_87/article/details/2586375 native是与C联合开发的时候用的&#xff01;java自己开发不用的&#xff01; 【1】使用native关键字说明这个方法是原生函数&#xff0c;也就是这个方法是用C/C语言实现的&#xff0c;并且被…

php 按钮的属性值,HTML button标签的属性有哪些

HTML button的属性有&#xff1a;autofocus、disabled、form、formaction、formenctype、formmethod、formnovalidate、formtarget、name、type、value。本教程操作环境&#xff1a;windows7系统、HTML5版、Dell G3电脑。HTML 标签标签定义一个按钮。在 button 元素内部&#x…

javafx之TableView的FXCSS

TableView的FXCSS 一、特殊的table设置 TableView的单元之间去掉行横线 .table-view .table-row-cell { -fx-background-insets: 0; } TableView的单元之间去掉没有数据的竖线 table-row-cell:empty .table-cell { -fx-border-width: 0px; } TableView 的单元…

sql 注射_令人惊讶的注射

sql 注射所以&#xff0c;我欠吉姆道歉。 他编写了一个有效的模拟和JUnit测试&#xff0c;我在回顾中告诉他&#xff0c;我认为它没有达到他的预期。 当我错了时&#xff0c;这种情况对我来说就像是一个错误 。 称它为理想的意外副作用。 假设您有以下两类&#xff1a; public…

java中的equals方法+hashCode方法

【0】README 0.1&#xff09;以下内容均为原创&#xff0c;包括源代码&#xff0c; 旨在理清 equals 和 hashCode 方法的 实现原理&#xff1b; 0.2&#xff09; for full resource code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/chapte…

mysql判断条件用法,MySQL数据库讲解条件判断函数 MySQL数据库使用教程

函数&#xff1a;(1)IF(expr,v1,v2)函数(2)IFNULL(v1,v2)函数(3)CASE函数(相关免费学习推荐&#xff1a;mysql视频教程)(1)if(expr,v1,v2)函数在if(expr,v1,v2)函数中,若表达式expr是true(expr<>0 and epr<>null)返回v1&#xff0c;否则返回v2。【例】使用if()函数…