K8s中Java应用调用C++原生库崩溃时Core Dump未生成问题
K8s中Java服务调用原生库崩溃后未生成Core Dump问题
我的Java服务运行在K8s集群中,依赖C++编写的原生库。已通过命令echo "/nfs/core_dumps/core.%t.%p" | tee /proc/sys/kernel/core_pattern将Core Dump输出路径设置到持久化挂载的NFS目录。但当调用原生方法触发SIGSEGV信号崩溃时,日志显示会在/nfs/core_dumps路径生成Core Dump文件,实际却未生成。Pod重启后进入容器shell查看NFS目录,找不到对应的Core文件,相关报错日志如下:
报错日志(中文翻译)
# # Java运行时环境检测到致命错误: # # SIGSEGV (0xb) 信号触发于 pc=0x00007efde450e688,进程ID=1,线程ID=103 # # JRE版本:OpenJDK Runtime Environment Temurin-17.0.13+11 (17.0.13+11) (build 17.0.13+11) # Java虚拟机:OpenJDK 64位服务器版 Temurin-17.0.13+11 (17.0.13+11,混合模式,分层编译,压缩指针,压缩类指针,G1垃圾收集器,linux-amd64) # 问题栈帧: # C [lib.Converter.so.1.0+0xee688] SetConverterMode+0xc8 # # Core转储将被写入。默认路径:/nfs/core_dumps/core.%t.1 # # JFR记录文件将被写入。路径://hs_err_pid1.jfr # # 包含详细信息的错误报告已保存至: # /nfs/my-folder/core_dump_%t.log # # 若要提交bug报告,请参考所使用JDK的官方支持渠道 # 崩溃发生在Java虚拟机之外的原生代码中。 # 请查看问题栈帧以确定bug报告的提交对象。 # [错误报告过程中出现异常(), id 0xb, SIGSEGV (0xb) 信号触发于 pc=0x00007eff17d249a2]
排查与解决方向
- 检查NFS目录权限:确认容器内运行Java进程(pid=1)对
/nfs/core_dumps目录拥有读写权限。可在Pod正常运行时进入容器,执行touch /nfs/core_dumps/test_file测试,若失败需调整NFS目录权限或Pod的securityContext配置。 - 确保core_pattern配置持久化:K8s容器内修改
/proc/sys/kernel/core_pattern仅对当前会话有效,Pod重启后会丢失。需将该配置命令加入Pod的启动脚本(如entrypoint.sh),保证每次容器启动时自动执行。 - 检查Core文件大小限制:执行
ulimit -c查看当前进程的Core文件大小限制,若值为0则无法生成Core Dump。需在Pod的securityContext中设置resources.limits.core为unlimited,或在启动脚本中添加ulimit -c unlimited命令。 - 排查错误报告阶段二次崩溃:日志末尾显示“错误报告过程中出现异常”,说明JVM在尝试生成Core Dump或错误日志时再次触发SIGSEGV。这可能是原生库崩溃导致进程状态不稳定,无法完成文件写入。可先排查原生库
SetConverterMode函数的内存问题,修复崩溃根源后再验证Core Dump生成情况。 - 验证NFS挂载稳定性:检查NFS服务器运行状态,确认Pod与NFS服务器之间的网络无丢包或中断。可在容器内执行
mount命令查看NFS挂载状态,或写入其他文件测试NFS可用性。
内容的提问来源于stack exchange,提问作者Lokesh P
相关产品推荐
相关产品推荐

