产生core dump文件的两种方法

由于应用错误,如浮点异常、段错误,操作系统转入内核的异常处理,向对应的进程发送特定的信号(如SIGSEGV)。如果进程中没有对这些信号进行处理,就会转入默认的处理,产生coredump文件就是其中一种。coredump文件其实就是内存的映像,即进程执行时的内存的所有内容。

很多系统默认情况下,产生coredump文件的开关是关闭的。下面介绍2种产生coredump文件的方法。
1、通过异常信号产生coredump文件
默认情况下,如果coredump开关开启,进程收到以下异常信号会产生coredump文件。信号:
3)SIGQUIT 4)SIGILL 6)SIGABRT 8)SIGFPE 11)SIGSEGV 7)SIGBUS 31)SIGSYS 5)SIGTRAP 24)SIGXCPU 25)SIGXFSZ 29)SIGIO
使用ulimit -a命令可查看coredump文件开关是否开启。如下图,如果core file size选项值不为0,则表示开关开启:
产生core dump文件的两种方法_第1张图片
如果core file size值为0,可以使用ulimit -c SIZE/unlimited命令开启coredump。其中SIZE表示coredump文件的大小限制,unlimited表示无限制。

需要注意的是,ulimit命令只对同一个session有效。即使是同一个账号,在不同的session下开启core dump,也不会有效。另外,在同一个session下,需要先开启core dump,再运行程序,才能产生core dump。

在程序未接受到以上信号的情况下,如果要强制产生core dump文件,可以使用kill -signal PROCESS_ID或者killall -signal PROCESS_NAME向进程发送信号。注意,这样做,会让进程异常退出。

很多时候,部署到线上的程序出现问题需要定位,如果程序并未异常退出,为了不影响业务的正常运行,需要在程序运行时产生coredump文件做分析,可以使用下面的方法。
2、使用gcore命令产生coredump文件
获取运行进程的ID,然后执行gcore PROCESS_ID命令可以产生coredump文件。

coredump文件产生后,可以使用gdb工具对coredump文件做进一步分析。命令如下:
gdb PROCESS_NAME core_file。

你可能感兴趣的:(gdb)