分析Java核心转储

在本文中,我将向您展示如何调试Java核心文件,以查看导致JVM崩溃的原因。 我将使用在上一篇文章: 生成Java Core Dump中生成的核心文件。 您可以通过以下几种方法来诊断JVM崩溃:

hs_err_pid日志文件

当JVM中发生致命错误时,它会在进程的工作目录或操作系统的临时目录中生成一个名为hs_err_pidXXXX.log的错误日志文件。 该文件的顶部包含崩溃的原因和“问题框架”。 例如,我的节目显示:

$ head hs_err_pid21178.log
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x0000002b1d00075c, pid=21178, tid=1076017504
#
# JRE version: 6.0_21-b06
# Java VM: Java HotSpot(TM) 64-Bit Server VM (17.0-b16 mixed mode linux-amd64 )
# Problematic frame:
# C  [libnativelib.so+0x75c]  bar+0x10
#

还有一个堆栈跟踪:

Stack: [0x000000004012b000,0x000000004022c000],  sp=0x000000004022aac0,  free space=3fe0000000000000018k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [libnativelib.so+0x75c]  bar+0x10
C  [libnativelib.so+0x772]  foo+0xe
C  [libnativelib.so+0x78e]  Java_CoreDumper_core+0x1a
j  CoreDumper.core()V+0
j  CoreDumper.main([Ljava/lang/String;)V+7
v  ~StubRoutines::call_stub
V  [libjvm.so+0x3e756d]

堆栈跟踪显示我的Java方法CoreDumper.core()调用到JNI中,并在用本机代码调用bar函数时死亡。

调试Java核心转储

在某些情况下,例如,如果本机代码通过调用abort函数突然中止,则JVM可能不会生成hs_err_pid文件。 在这种情况下,我们需要分析产生的核心文件。 在我的机器上,操作系统将核心文件写到/var/tmp/cores 。 您可以使用以下命令来查看系统配置为将核心文件写到的位置:

$ cat /proc/sys/kernel/core_pattern
/var/tmp/cores/%e.%p.%u.core
$ ls /var/tmp/cores
java.21178.146385.core

有几种不同的方法可以查看核心转储:

1.使用gdb

GNU调试器(gdb)可以检查核心文件,并确定程序崩溃时正在做什么。

$ gdb $JAVA_HOME/bin/java /var/tmp/cores/java.14015.146385.core
(gdb) where
#0  0x0000002a959bd26d in raise () from /lib64/tls/libc.so.6
#1  0x0000002a959bea6e in abort () from /lib64/tls/libc.so.6
#2  0x0000002b1cecf799 in bar () from libnativelib.so
#3  0x0000002b1cecf7a7 in foo () from libnativelib.so
#4  0x0000002b1cecf7c3 in Java_CoreDumper_core () from libnativelib.so
#5  0x0000002a971aac88 in ?? ()
#6  0x0000000040113800 in ?? ()
#7  0x0000002a9719fa42 in ?? ()
#8  0x000000004022ab10 in ?? ()
#9  0x0000002a9a4d5488 in ?? ()
#10 0x000000004022ab70 in ?? ()
#11 0x0000002a9a4d59c8 in ?? ()
#12 0x0000000000000000 in ?? ()

where命令打印堆栈帧,并显示导致崩溃的bar函数abort()

2.使用jstack

jstack为给定的核心文件打印Java线程的堆栈跟踪。

$ jstack -J-d64 $JAVA_HOME/bin/java /var/tmp/cores/java.14015.146385.core
Debugger attached successfully.
Server compiler detected.
JVM version is 17.0-b16
Deadlock Detection:No deadlocks found.Thread 16788: (state = BLOCKED)Thread 16787: (state = BLOCKED)- java.lang.Object.wait(long) @bci=0 (Interpreted frame)- java.lang.ref.ReferenceQueue.remove(long) @bci=44, line=118 (Interpreted frame)- java.lang.ref.ReferenceQueue.remove() @bci=2, line=134 (Interpreted frame)- java.lang.ref.Finalizer$FinalizerThread.run() @bci=3, line=159 (Interpreted frame)Thread 16786: (state = BLOCKED)- java.lang.Object.wait(long) @bci=0 (Interpreted frame)- java.lang.Object.wait() @bci=2, line=485 (Interpreted frame)- java.lang.ref.Reference$ReferenceHandler.run() @bci=46, line=116 (Interpreted frame)Thread 16780: (state = IN_NATIVE)- CoreDumper.core() @bci=0 (Interpreted frame)- CoreDumper.main(java.lang.String[]) @bci=7, line=12 (Interpreted frame)

3.使用jmap

jmap检查核心文件,并打印出共享对象内存映射或堆内存详细信息。

$ jmap -J-d64 $JAVA_HOME/bin/java /var/tmp/cores/java.14015.146385.core
Debugger attached successfully.
Server compiler detected.
JVM version is 17.0-b16
0x0000000040000000      49K     /usr/sunjdk/1.6.0_21/bin/java
0x0000002a9566c000      124K    /lib64/tls/libpthread.so.0
0x0000002a95782000      47K     /usr/sunjdk/1.6.0_21/jre/lib/amd64/jli/libjli.so
0x0000002a9588c000      16K     /lib64/libdl.so.2
0x0000002a9598f000      1593K   /lib64/tls/libc.so.6
0x0000002a95556000      110K    /lib64/ld-linux-x86-64.so.2
0x0000002a95bca000      11443K  /usr/sunjdk/1.6.0_21/jre/lib/amd64/server/libjvm.so
0x0000002a96699000      625K    /lib64/tls/libm.so.6
0x0000002a9681f000      56K     /lib64/tls/librt.so.1
0x0000002a96939000      65K     /usr/sunjdk/1.6.0_21/jre/lib/amd64/libverify.so
0x0000002a96a48000      228K    /usr/sunjdk/1.6.0_21/jre/lib/amd64/libjava.so
0x0000002a96b9e000      109K    /lib64/libnsl.so.1
0x0000002a96cb6000      54K     /usr/sunjdk/1.6.0_21/jre/lib/amd64/native_threads/libhpi.so
0x0000002a96de8000      57K     /lib64/libnss_files.so.2
0x0000002a96ef4000      551K    /lib64/libnss_db.so.2
0x0000002a97086000      89K     /usr/sunjdk/1.6.0_21/jre/lib/amd64/libzip.so
0x0000002b1cecf000      6K      /home/sharfah/tmp/jni/libnativelib.so

有用的链接:

JVM崩溃分析崩溃课程
生成Java核心转储

参考:在fahd.blog博客中分析了我们JCG合作伙伴 Fahd Shariff 的Java Core Dump 。

翻译自: https://www.javacodegeeks.com/2013/02/analysing-a-java-core-dump.html

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

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

相关文章

网页结构 盒模型

HTML是个什么鬼? 前端开发人员要想和浏览器沟通,就要用到浏览器才能够识别的语言(HTML超文本标记语言),所以他是一门浏览器能够识别的语言。是一种由标签组成的超文本标记语言,而非编程语言。一个html文档…

idea创建git分支

此时只是在本地创建好了分支,修改源代码后add,commit将本地分支提交到远程仓库分支已创建,其它成员此时就可以从git拉分支转载于:https://www.cnblogs.com/qianqiu-1026/p/8589218.html

已知华氏温度f c语言,编程题:已知两种温度的换算公式C=(5/9)(F-32),试编写一个程序输入华氏度F,输出摄氏度。...

使用python的写法为:valinput("请输入带有温度表示符号的温度值(例如:32c)")if val[-1] in ["C","c"]:f1.8*float(val[0:-1])32print("转换后的温度为:%.2fF"%f)elif val[-1] in ["F",&qu…

MongoDB身份验证

我最近更新了Mongometer ,使其更加灵活。 发布新版本后不久,其中一位用户通过在帖子中发表评论来反馈问题。 我启动了我的机器,打开了我的IDE,发现了问题,并在半小时内将修复程序推送到了github 。 这不是快速的成功案…

golang ffmpeg 做网络直播

最近在公司做在线视频转码的工作,研究了下ffmpeg 最后直接研究了下网络直播,我是在我自己的mac 上面测试的,效果,还可以,先看看效果图吧 ffmpeg 我是通过brew安装 的,这步就略了 VLC这个播放器怎么安装的也…

androidstudio带pom的上传到jcenter_输送机@网带输送机@304网带输送机@304不锈钢网带输送机@输送机网带厂家定制...

输送机网带输送机食品网带输送机304网带输送机304不锈钢网带输送机输送机网带厂家定制输送机主要用于运输食品原料或成品。食品输送机根据输送带不同可分为皮带的,链板的,网带的。输送形式有:直行的,爬坡提升的,清洗的…

box-sizing -- 盒模型

项目开发中,在浏览同事的代码,发现他经常用一个属性--box-sizing,很好奇是什么,于是乎,上网查阅资料学了起来。  首先我们先复习一下盒模型的组成:一个div通常由 content(内容) margin padding border组成…

有温度传感器的风机控制系统C语言,毕业论文--基于单片机的工业风机控制器设计与实现.doc...

大连东软信息学院本科毕业设计(论文)论文题目论文题目:基于单片机的工业风机控制器设计与实现系 所:电子工程系专 业:电子信息工程(嵌入式系统工程方向)学生姓名:学生学号:指导教师:导师职称:讲…

JAXB和java.util.Map

具有讽刺意味的是,可能很难在JAXB(JSR-222)中映射java.util.Map类? 在这篇文章中,我将介绍一些使其变得更容易的项目。 Java模型 以下是我们将用于此示例的Java模型。 顾客 Customer类具有Map类型的属性。 我之所以…

转载大神的一篇文章----【如何选择开源许可证?】

原文地址:http://www.ruanyifeng.com/blog/2011/05/how_to_choose_free_software_licenses.html 如何为代码选择开源许可证,这是一个问题。 世界上的开源许可证,大概有上百种。很少有人搞得清楚它们的区别。即使在最流行的六种----GPL、BSD、…

教你如何用 lib-flexible 实现移动端H5页面适配

前话 好久没写教程了(可能会误导新手的菜鸟教程( ̄▽ ̄)")。 这是我的github,欢迎前端大大们和我一起学习交流 https://github.com/pwcong 最近入职公司做前端实习,这几个星期来学到了移动端H5页面适配…

使用GlassFish 3.1.2.2和Primefaces 3.4的JDBC领域和基于表单的身份验证

我的博客上最受欢迎的帖子之一是有关JDBC安全领域和带有Primefaces的GlassFish上基于表单的身份验证的简短教程。 在收到有关它不再适用于最新的GlassFish 3.1.2.2的评论后,我认为可能是时候重新访问它并提出更新的版本了。 开始了: 制备 就像在原始教程…

thinkcmf常用标签

1、图片地址&#xff1a;{:cmf_get_image_url($vo.icon)} 2、模板控件 模板变量调用&#xff1a;$theme_vars.title <widget name"aboutUs">{$widget.title} //控件标题 {$widget.vars.subTitle} //控件变量 subTitle {:nl2br($widget.vars.content)} //输…

esplise自定义快捷代码补全_【Eclipse】_Eclipse自动补全增强方法 常用快捷键

一&#xff0c;Eclipse自动补全增强方法在Eclipse中&#xff0c;从Window -> preferences -> Java -> Editor -> Content assist -> Auto-Activation下&#xff0c;我们可以在"."号后面加入我们需要自动提示的首字幕&#xff0c;比如"abc"&…

ubuntu下docker安装,配置python运行环境

参考自: 1.最详细ubuntu安装docker教程 2.使用docker搭建python环境 首先假设已经安装了docker&#xff0c;卸载原来的docker 在命令行中运行&#xff1a; sudo apt-get updatesudo apt-get remove docker docker-engine docker.io containerd runc 安装docker依赖 apt-get…

android前置拍照镜像代码,从Android的前置摄像头拍摄的镜像翻转视频

我有一个能够拍摄图像和录制视频的摄像头应用程序。但是&#xff0c;当从设备前置摄像头捕捉图像或录制视频时&#xff0c;结果会翻转&#xff0c;就像您在看镜子一样。我想再次翻转&#xff0c;所以看起来很正常。我设法与图像要做到这一点&#xff0c;通过使用Matrix翻转Bitm…

python 打造一个sql注入脚本 (一)

0x00前言&#xff1a; 昨天刚刚看完小迪老师的sql注入篇的第一章 所以有了新的笔记。 0x01笔记&#xff1a; sql注入原理&#xff1a; 网站数据传输中&#xff0c;接受变量传递的值未进行过滤&#xff0c;导致直接带入数据库查询执行的操作。 sql注入对渗透的作用&#xff1a; …

文档声明和HTML样式表

文档声明 不是注释也不是元素&#xff0c;总是在HTML的第一行 书写格式&#xff1a;<!DOCTYPE HTML> 是用于通知浏览器目前文档正使用哪一个HTML版本&#xff08;相关属性 lang&#xff09; 若不写文档声明&#xff0c;浏览器渲染页面时会进入怪异模式 HTML元素又叫根元素…

JSF –渴望的CDI bean

每个人都知道JSF 2中热切的托管bean。 ManagedBean具有eager属性。 如果eager true并且范围是application&#xff0c;那么必须在应用程序启动时而不是在第一次引用该bean时创建此bean。 当您要在应用程序启动期间加载应用程序范围的数据&#xff08;例如&#xff0c;菜单的某些…

mybatis添加方法可以传map吗_Mybatis中传递多个参数的4种方法总结

前言现在大多项目都是使用Mybatis了&#xff0c;但也有些公司使用Hibernate。使用Mybatis最大的特性就是sql需要自己写&#xff0c;而写sql就需要传递多个参数。面对各种复杂的业务场景&#xff0c;传递参数也是一种学问。下面给大家总结了以下几种多参数传递的方法。方法1&…