当应用程序运行过程中发生异常,即屏幕中显示了“Segmentation fault”字样,则代表出现了coredump。如果屏幕中没有显示“Segmentation fault”,没有Python堆栈,plog日志中也没有ERROR级别的日志,且有进程收到11号信号,则也是属于出现了coredump。
ulimit -c
如果为unlimited,则表示生成coredump文件的大小设置为无限制,此时如果进程崩溃就会生成coredump文件。
如果为0,即使发生了异常,也不会保存coredump文件,需要执行如下命令进行配置:
ulimit -c unlimited
# 临时修改生成的coredump文件的名称,加粗命令为文件名称的变量,可自行设置 sysctl -w kernel.core_pattern=core-%e.%p.%h.%t # 设置coredump生成目录,加粗命令为文件名称的变量和生成目录,可自行设置 echo "/{path_to_coredump}/core.%t.%e.%p" >/proc/sys/kernel/core_pattern
gdb命令行调试主要针对coredump场景,执行目录下会生成core dump文件,使用gdb调试该文件并打印堆栈,方法如下:
gdb python3 core*.* # coredump文件名请根据用户自己的设置修改
执行命令后,gdb工具会将发生异常的代码、其所在的函数、文件名和所在文件的行数打印到屏幕,方便定位问题。
调试环境需与生成coredump文件的环境一致。例如,容器场景需进入对应的容器内进行调试。
(gdb) bt # 查看堆栈 (gdb) thread apply all bt # 查看所有进程的堆栈
根据回显中的函数堆栈找到出错的位置。