java程序崩溃调试core文件

java程序崩溃调试core文件,第1张

在Java程序崩溃时,通常不会生成core文件,因为Java虚拟机(JVM)默认不会生成core文件。不过,如果你想要在Java程序崩溃时生成core文件,你可以通过在启动JVM时设置参数来实现。例如,如果你使用的是Linux *** 作系统,可以通过以下命令启动JVM并生成core文件:

plaintext

Copy code

java -XX:ErrorFile=/tmp/java_error%!p(MISSING).log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:+CrashOnOutOfMemoryError -XX:OnOutOfMemoryError="gcore %!p(MISSING)kill -9 %!p(MISSING)" YourJavaProgram

其中,-XX:ErrorFile用于指定JVM错误日志的保存路径,-XX:+HeapDumpOnOutOfMemoryError用于在发生内存溢出时生成堆转储文件,-XX:HeapDumpPath用于指定堆转储文件的保存路径,-XX:+CrashOnOutOfMemoryError用于在发生内存溢出时直接崩溃,-XX:OnOutOfMemoryError用于在发生内存溢出时执行指定的命令。在这个例子中,我们使用gcore命令生成core文件,并将进程杀掉。

在生成了core文件之后,你可以使用gdb来分析core文件。首先,你需要使用以下命令启动gdb:

plaintext

Copy code

gdb YourJavaProgram core

其中,YourJavaProgram是你的Java程序的可执行文件名,core是你生成的core文件名。启动gdb后,你可以使用gdb命令来分析core文件,例如,可以使用bt命令来查看堆栈信息,使用info命令来查看线程信息等等。

需要注意的是,在使用gdb分析core文件时,你需要了解Java程序的内部实现,例如,你需要知道Java线程是如何映射到 *** 作系统线程的,以及Java对象是如何映射到内存中的。否则,你可能无法正确地分析core文件,或者分析结果可能不准确。

gdb调试core文件或进程时,出现加载so库符号失败,错误信息如下

warning: Could not load shared library symbols for ../libadd.so

Do you need "set solib-search-path" or "set sysroot"?

登录后复制

执行info sharedlibrary,查看Syms Read字段为No, 表示对应so库符号加载失败。

$ pwd /home/gdb

(gdb) info sharedlibrary

FromTo Syms Read Shared Object Library

0x00007fba2c572570 0x00007fba2c57267b No ../libadd.so

0x00007fba2c370570 0x00007fba2c37066b No ../../var/libsub.so

(gdb) bt

#0 0x00007fba2c57266b in ?? ()

#1 0x00007ffc6f703ff0 in ?? ()

登录后复制

解决方法

设置gdb的solib-search-path选项, 指定加载失败的so的搜索路径即可。

solib-search-path可以指定多个路径。在linux上,路径之间用冒号分隔,命令如下:

(gdb) set solib-search-path /var:/home

Reading symbols from ../libadd.so...done.

Loaded symbols for ../libadd.so

Reading symbols from ../../var/libsub.so...done.

Loaded symbols for ../../var/libsub.so

(gdb) info sharedlibrary

FromTo Syms Read Shared Object Library

0x00007fba2c572570 0x00007fba2c57267b Yes ../libadd.so

0x00007fba2c370570 0x00007fba2c37066b Yes ../../var/libsub.so

(gdb) bt

#0 0x00007fba2c57266b in add (a=1, b=2) at add.c:5

#1 0x0000000000400600 in ?? ()

登录后复制

或者设置gdb的solib-absolute-prefix选项,指定被搜索so文件路径的前缀, 与solib-search-path区别在于solib-absolute-prefix只能有一个,使用如下gdb指令:


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

原文地址: http://outofmemory.cn/tougao/11881578.html

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

发表评论

登录后才能评论

评论列表(0条)

保存