如何dump出一个Java进程里的类对应的Class文件

如何dump出一个Java进程里的类对应的Class文件,第1张

class-dump-x 提取私有库里面的隐藏文件

class-dump

This is a command-line utility for examining the Objective-C runtime information stored in Mach-O files It generates declarations for the classes, categories and protocols This is the same information provided by using 'otool -ov', but presented as normal Objective-C declarations, so it is much more compact and readable

Why use class-dump

It's a great tool for the curious You can look at the design of closed source applications, frameworks, and bundles Watch the interfaces evolve between releases Experiment with private frameworks, or see what private goodies are hiding in the AppKit Learn about the plugin API lurking in Mailapp

If you find class-dump useful, you can donate to help support its development Thanks!

Download

Current version: 333 (Universal, 64 and 32 bit)

Requires Mac OS X 105 or later

class-dump-333dmg

class-dump-333targz

class-dump-333tarbz2

Changes - News

Contact

You can email questions and bug reports to me at class-dump@codethecodecom, or nygard at gmailcom

Usage

class-dump 333 (64 bit)

Usage: class-dump [options] <mach-o-file>

where options are:

-a show instance variable offsets

-A show implementation addresses

--arch <arch> choose a specific architecture from a universal binary (ppc, ppc7400, ppc64, i386, x86_64, etc)

-C <regex> only display classes matching regular expression

-f <str> find string in method name

-H generate header files in current directory, or dir

使用专门的文件工具打开。

dump文件属于加密文件,可以使用DebuggingTools这个文件专用工具来打开,首先安装工具,然后找到DebuggingToolsforWindows(x86)文件夹,再找到WinDbg打开,点击File中的OpenCrashDump,打开后选择DMP文件,在d窗点击yes。就可以打开了。

Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。

当Java Web程序运行变慢,或者发生故障时,需要使用Thread Dumps 如果你觉得ThreadDumps非常复杂,这篇文章很可能帮助你。将会分析Java中的线程,线程如何创建的,如何管理线程,怎么从运行中的程序中dump 线程,最后怎么分析他们得到阻塞和存在瓶颈的线程。本文是在应用程序调试下得到的结果。

Java和线程

一个web server使用几十到几百条线程去处理大量的并发用户。如果多条线程使用共享的资源,无法避免线程之间对数据的竞争,有时候还会发生死锁。

线程竞争是web程序上不同的线程去访问共享资源,一条线程等待另外线程释放锁。例如,在记录log的时候,线程记录log时,必须先获得锁,然后去再访问共享资源。

死锁是一种特殊的线程竞争,两个或多个线程要完成自己的任务,都要必须要等待其他的线程完成他们的任务。

线程竞争会带来各种不同的问题,为了分析这些问题,需要使用Thread Dump。Thread Dump记录了每个线程真正的状态。

Java线程的背景

线程同步

多条线程之间可以同时执行,为了确保多线程在使用共享资源上面的通用性,使用线程同步保证在同一时间只能有一条线程可以访问共享资源。

线程同步在Java中可以使用监视器。每个Java对象都有一个监视器,这个监视器只能被一个线程拥有。当一个线程要获得另外线程拥有的监视器时,需要进入等待队列直到线程释放监视器。

线程的状态

为了分析Thread Dump ,需要先了解线程的状态。线程的状态是在javalangThreadState中。

NEW:线程被创建但是还没有被执行

RUNNABLE:线程正在占用cpu并且在执行任务

BLOCKED:线程为了获得监视器需要等待其他线程释放锁

WAITING:调用了wait,join,park方法使线程等待-无限期等待

TIMED_WAITING:调用了sleep,wait,join,park方法使线程等待--有限期等待

线程类型

java中线程可以分为两种:

1 后台线程

2 非后台线程

当没有其他的非后台线程运行时后台线程将会终止。即使你不创建线程,java应用默认也会创建很多线程。这些大多数都是后台线程,主要为了执行gc或者jmx等类型的任务

从 'static void main(String[] args)’方法中开启的线程叫做非后台线程,当这些线程停止时,其他的所有后台线程也会停止()

获得一个Thread Dump

将会介绍三种常用的方法。请注意还会有其他很多方法可以获取Thread Dump。一个Thread dump仅仅可以显示测量时的线程状态。所以为了查看线程状态的变化,建议5到10次,每次间隔5秒。

使用jstack获得Thread Dump

通过使用jsp命令来获得当前正在运行的Java程序的PID

[user@linux ~]$ jps -v 25780 RemoteTestRunner -Dfileencoding=UTF-8 25590 subrmiregistryRegistryImpl 2999 -Dapplicationhome=/home1/user/java/jdk160_24 -Xms8m 26300 suntoolsjpsJps -mlvV -Dapplicationhome=/home1/user/java/jdk160_24 -Xms8m

使用PID作为jstack的参数获得Thread Dump

[user@linux ~]$ jstack -f 5824

使用jVisualVM获得Thread Dump

通过使用jVisualVm来获得Thread Dump

左边的标记,当前正在运行的进程。点击你想查看的进程,选择现场选项来查看实时的线程信息。点击Thread Dump右边的按钮来获得Thread Dump文件

在Linux终端中生成

通过使用ps -ef命令去获得当前正在运行的Java进程

[user@linux ~]$ ps - ef | grep java

user 2477 1 0 Dec23 00:10:45

user 25780 25361 0 15:02 pts/3 00:00:02 /jstatd -J -Djavasecuritypolicy=jstatdallpolicy -p 2999

user 26335 25361 0 15:49 pts/3 00:00:00 grep java

Use the extracted pid as the parameter of kill –SIGQUIT(3) to obtain a thread dump

Thread Information from the Thread Dump File

"pool-1-thread-13" prio=6 tid=0x000000000729a000 nid=0x2fb4 runnable [0x0000000007f0f000] javalangThreadState: RUNNABLE at javanetSocketInputStreamsocketRead0(Native Method) at javanetSocketInputStreamread(SocketInputStreamjava:129) at sunniocsStreamDecoderreadBytes(StreamDecoderjava:264) at sunniocsStreamDecoderimplRead(StreamDecoderjava:306) at sunniocsStreamDecoderread(StreamDecoderjava:158) - locked <0x0000000780b7e688> (a javaioInputStreamReader) at javaioInputStreamReaderread(InputStreamReaderjava:167) at javaioBufferedReaderfill(BufferedReaderjava:136) at javaioBufferedReaderreadLine(BufferedReaderjava:299) - locked <0x0000000780b7e688> (a javaioInputStreamReader) at javaioBufferedReaderreadLine(BufferedReaderjava:362)

Thread name:当使用 Java.lang.Thread类去生成一个线程,将被命名为Thre-(Number),然而当使用java.util.concurrent,ThreadFactory类,将会被命名为pool-(Number)-thread-(Number)

Priority:表示线程的优先级

Thread ID:代表线程的唯一id。(通过线程id可以获得一些有用的信息,包括cpu使用率,或者内存使用率)

Thread status:代表线程的状态

Thread callstack:代表线程调用的堆栈信息

Thread Dump模式的类型

当无法获得一个锁(阻塞)

当一个线程占领住锁而其他线程无法获得这个锁,而导致应用程序所有的性能都下降。在下面的例子中,

BLOCKED_TEST pool-1-thread-1 线程运行时获得<0x0000000780a000b0>锁, 同时BLOCKED_TEST pool-1-thread-2 和 BLOCKED_TEST pool-1-thread-3正在等待获得<0x0000000780a000b0>锁

"BLOCKED_TEST pool-1-thread-1" prio=6 tid=0x0000000006904800 nid=0x28f4 runnable [0x000000000785f000] javalangThreadState: RUNNABLE at javaioFileOutputStreamwriteBytes(Native Method) at javaioFileOutputStreamwrite(FileOutputStreamjava:282) at javaioBufferedOutputStreamflushBuffer(BufferedOutputStreamjava:65) at javaioBufferedOutputStreamflush(BufferedOutputStreamjava:123) - locked <0x0000000780a31778> (a javaioBufferedOutputStream) at javaioPrintStreamwrite(PrintStreamjava:432) - locked <0x0000000780a04118> (a javaioPrintStream) at sunniocsStreamEncoderwriteBytes(StreamEncoderjava:202) at sunniocsStreamEncoderimplFlushBuffer(StreamEncoderjava:272) at sunniocsStreamEncoderflushBuffer(StreamEncoderjava:85) - locked <0x0000000780a040c0> (a javaioOutputStreamWriter) at javaioOutputStreamWriterflushBuffer(OutputStreamWriterjava:168) at javaioPrintStreamnewLine(PrintStreamjava:496) - locked <0x0000000780a04118> (a javaioPrintStream) at javaioPrintStreamprintln(PrintStreamjava:687) - locked <0x0000000780a04118> (a javaioPrintStream) at comnbptheplatformthreaddumpThreadBlockedStatemonitorLock(ThreadBlockedStatejava:44) - locked <0x0000000780a000b0> (a comnbptheplatformthreaddumpThreadBlockedState) at comnbptheplatformthreaddumpThreadBlockedState$1run(ThreadBlockedStatejava:7) at javautilconcurrentThreadPoolExecutor$WorkerrunTask(ThreadPoolExecutorjava:886) at javautilconcurrentThreadPoolExecutor$Workerrun(ThreadPoolExecutorjava:908) at javalangThreadrun(Threadjava:662) Locked ownable synchronizers: - <0x0000000780a31758> (a javautilconcurrentlocksReentrantLock$NonfairSync) "BLOCKED_TEST pool-1-thread-2" prio=6 tid=0x0000000007673800 nid=0x260c waiting for monitor entry [0x0000000008abf000] javalangThreadState: BLOCKED (on object monitor) at comnbptheplatformthreaddumpThreadBlockedStatemonitorLock(ThreadBlockedStatejava:43) - waiting to lock <0x0000000780a000b0> (a comnbptheplatformthreaddumpThreadBlockedState) at comnbptheplatformthreaddumpThreadBlockedState$2run(ThreadBlockedStatejava:26) at javautilconcurrentThreadPoolExecutor$WorkerrunTask(ThreadPoolExecutorjava:886) at javautilconcurrentThreadPoolExecutor$Workerrun(ThreadPoolExecutorjava:908) at javalangThreadrun(Threadjava:662) Locked ownable synchronizers: - <0x0000000780b0c6a0> (a javautilconcurrentlocksReentrantLock$NonfairSync) "BLOCKED_TEST pool-1-thread-3" prio=6 tid=0x00000000074f5800 nid=0x1994 waiting for monitor entry [0x0000000008bbf000] javalangThreadState: BLOCKED (on object monitor) at comnbptheplatformthreaddumpThreadBlockedStatemonitorLock(ThreadBlockedStatejava:42) - waiting to lock <0x0000000780a000b0> (a comnbptheplatformthreaddumpThreadBlockedState) at comnbptheplatformthreaddumpThreadBlockedState$3run(ThreadBlockedStatejava:34) at javautilconcurrentThreadPoolExecutor$WorkerrunTask(ThreadPoolExecutorjava:886 at javautilconcurrentThreadPoolExecutor$Workerrun(ThreadPoolExecutorjava:908) at javalangThreadrun(Threadjava:662) Locked ownable synchronizers: - <0x0000000780b0e1b8> (a javautilconcurrentlocksReentrantLock$NonfairSync)

当是死锁的状态

线程A需要获得线程B的锁才能继续执行任务,同时线程B需要获得线程A的锁才能继续执行任务。在Thread Dump中,可以发现 DEADLOCK_TEST-1 线程拥有0x00000007d58f5e48锁,并且试着去获取0x00000007d58f5e60这把锁。另外 DEADLOCK_TEST-2 线程拥有0x00000007d58f5e60锁,并且尝试获取0x00000007d58f5e78锁。,DEADLOCK_TEST-3 线程拥有0x00000007d58f5e78锁,并且尝试获得0x00000007d58f5e48锁。可以看得出来,每个线程都在等待另外线程的锁,这种状态知道一个线程放弃锁之前都不会被改变。

"DEADLOCK_TEST-1" daemon prio=6 tid=0x000000000690f800 nid=0x1820 waiting for monitor entry [0x000000000805f000] javalangThreadState: BLOCKED (on object monitor) at comnbptheplatformthreaddumpThreadDeadLockState$DeadlockThreadgoMonitorDeadlock(ThreadDeadLockStatejava:197) - waiting to lock <0x00000007d58f5e60> (a comnbptheplatformthreaddumpThreadDeadLockState$Monitor) at comnbptheplatformthreaddumpThreadDeadLockState$DeadlockThreadmonitorOurLock(ThreadDeadLockStatejava:182) - locked <0x00000007d58f5e48> (a comnbptheplatformthreaddumpThreadDeadLockState$Monitor) at comnbptheplatformthreaddumpThreadDeadLockState$DeadlockThreadrun(ThreadDeadLockStatejava:135) Locked ownable synchronizers: - None "DEADLOCK_TEST-2" daemon prio=6 tid=0x0000000006858800 nid=0x17b8 waiting for monitor entry [0x000000000815f000] javalangThreadState: BLOCKED (on object monitor) at comnbptheplatformthreaddumpThreadDeadLockState$DeadlockThreadgoMonitorDeadlock(ThreadDeadLockStatejava:197) - waiting to lock <0x00000007d58f5e78> (a comnbptheplatformthreaddumpThreadDeadLockState$Monitor) at comnbptheplatformthreaddumpThreadDeadLockState$DeadlockThreadmonitorOurLock(ThreadDeadLockStatejava:182) - locked <0x00000007d58f5e60> (a comnbptheplatformthreaddumpThreadDeadLockState$Monitor) at comnbptheplatformthreaddumpThreadDeadLockState$DeadlockThreadrun(ThreadDeadLockStatejava:135) Locked ownable synchronizers: - None "DEADLOCK_TEST-3" daemon prio=6 tid=0x0000000006859000 nid=0x25dc waiting for monitor entry [0x000000000825f000] javalangThreadState: BLOCKED (on object monitor) at comnbptheplatformthreaddumpThreadDeadLockState$DeadlockThreadgoMonitorDeadlock(ThreadDeadLockStatejava:197) - waiting to lock <0x00000007d58f5e48> (a comnbptheplatformthreaddumpThreadDeadLockState$Monitor) at comnbptheplatformthreaddumpThreadDeadLockState$DeadlockThreadmonitorOurLock(ThreadDeadLockStatejava:182) - locked <0x00000007d58f5e78> (a comnbptheplatformthreaddumpThreadDeadLockState$Monitor) at comnbptheplatformthreaddumpThreadDeadLockState$DeadlockThreadrun(ThreadDeadLockStatejava:135) Locked ownable synchronizers: - None

持续等待来自远程服务的信息

线程看起来是正常的,因为它的状态一直都是RUNNABLE,然而当你将thread dump按时间有序的排列,你可以看出来socketReadThread线程一直在读socket

dump文件是一个进程或者系统在某一个给定的时间的快照。

dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开。

dump文件中包含了程序运行的模块信息、线程信息、堆栈调用信息、异常信息等数据。

在服务器运行我们的Java程序时,是无法跟踪代码的,所以当发生线上事故时,dump文件就成了一个很关键的分析点。

这里介绍两种方式,一种是主动的,一种是被动的。

主动生成dump文件。首先要查找运行的Java程序的pid。

使用top命令:

然后使用jmap命令生成dump文件。file后面是保存的文件名称,1246则是java程序的PID。

您好,dump文件默认保存位置在C:\Windows目录下,MEMORYDMP文件就是了!解决方法如下:

第一步、对着桌面计算机图标,点击鼠标右键,菜单中选择“属性”

第二步、在系统界面左侧,控制面板主页下面找到并点击“高级系统设置”

第三步、在“系统属性”对话框“高级”选项卡下,找到并点击“启动和故障恢复”选项里面的“设置”按钮

第四步、在“启动和故障恢复”对话框,找到并点击“写入调试信息”下面“核心内存转储”后面的向下箭头,点击选择“小内存转储”后,确定退出,下次再次出现蓝屏状况时,minidump文件就能被保存下来了!

你可以先将你抓到的包保存到文件

主要代码:

/ 回调函数,用来处理数据包 /

void packet_handler(u_char dumpfile, const struct pcap_pkthdr header, const u_char pkt_data)

{

/ 保存数据包到堆文件 /

pcap_dump(dumpfile, header, pkt_data);

}

然后用wireshark 这款软件,打开文件你保存抓包信息的文件,查看你抓到的包

Wireshark(前称Ethereal)是一个网络封包分析软件。

以上就是关于如何dump出一个Java进程里的类对应的Class文件全部的内容,包括:如何dump出一个Java进程里的类对应的Class文件、门禁卡dump文件怎么打开、如何分析Thread Dump等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9312649.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存