我想了解幕后的事情:无法编写核心转储

时间:2015-05-30 20:14:15

标签: java

我打算从终端启动Eclipse,但遇到了这个错误:

A fatal error has been detected by the Java Runtime Environment: SIGSEGV (0xb) at pc=0x00000038d6e08e83, pid=6018, tid=47814740359488 JRE version: Java(TM) SE Runtime Environment (7.0_76-b13) (build
1.7.0_76-b13) Java VM: Java HotSpot(TM) 64-Bit Server VM (24.76-b04 mixed mode linux-amd64 compressed oops) Problematic frame: C  [ld-linux-x86-64.so.2+0x8e83] Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again

我想完全理解为什么会发生这种情况,而不仅仅是运行它向我显示的命令。

我知道有一个问题:Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again 但没有人回答。 所以请详细说明一下,非常感谢您的帮助和时间!

三个问题:

  1. 为什么核心被抛弃?

  2. 为什么在此计算机上禁用核心转储

  3. ulimit -c unlimited的效果是什么?

1 个答案:

答案 0 :(得分:1)

根据您提供的信息,我认为它无法编写核心转储,因为它在文件大小方面太大,至少超出了您的ulimit限制。 Ld-Linux是共享库加载器,它的工作是加载其他共享库。如果在命令行键入ulimit,它将告诉您设置了哪些限制

$ ulimit

也许是2千兆字节,你的eclipse正在花费更多,可能使用64位JVM。

sigsegv是eclipse或者至少是JVM尝试用内存做它不应该做的事情。那就是访问受保护的内存。这可能是写入只读存储器或从分配缓冲区末端掉落的指针。如果你重启eclipse,你会得到同样的错误吗?

如果你获得核心转储,你可以使用调试器(如gdb)来分析出错的地方。

gdb <executable_path> <coredump_file_path>

核心转储将是一个.pid文件。这会告诉你更多关于崩溃的信息,也许是一个溢出缓冲区的strcpy()。