这里有新鲜出炉的 Linux 常用命令,程序狗速度看过来!
Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 UNIX 工具软件、应用程序和网络协议。
下面小编就为大家带来一篇关于 linux 下 core dump【总结】。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
1、前言
一直在从事 linux 下后台开发,经常与 core 文件打交道。还记得刚开始从事 linux 下开发时,程序突然崩溃了,也没有任何日志。我不知所措,同事叫我看看 core,我却问什么是 core,怎么看。同事鄙视的眼神,我依然在目。后来学会了从 core 文件中分析原因,通过 gdb 看出程序挂再哪里,分析前后的变量,找出问题的原因。当时就觉得很神奇,core 文件是怎么产生的呢?难道系统会自动产生,可是我在自己的 linux 系统上面写个非法程序测试,并没有产生 core 问题?这又是怎么回事呢?今天在 ngnix 的源码时候,发现可以在程序中设置 core dump,又是怎么回事呢?在公司发现生成的 core 文件都带有进程名称、进程 ID、和时间,这又是怎么做到的呢?今天带着这些疑问来说说 core 文件是如何生成,如何配置。
2、基本概念
当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做 Core Dump(中文有的翻译成 "核心转储")。我们可以认为 core dump 是 "内存快照",但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。
3、开启 core dump
可以使用命令 ulimit 开启,也可以在程序中通过 setrlimit 系统调用开启。
程序中开启 core dump,通过如下 API 可以查看和设置 RLIMIT_CORE
- #include < sys / resource.h >
- int getrlimit(int resource, struct rlimit * rlim);
- int setrlimit(int resource, const struct rlimit * rlim);
参考程序如下所示:
- #include < unistd.h > #include < sys / time.h > #include < sys / resource.h > #include < stdio.h > #define CORE_SIZE 1024 * 1024 * 500 int main() {
- struct rlimit rlmt;
- if (getrlimit(RLIMIT_CORE, &rlmt) == -1) {
- return - 1;
- }
- printf("Before set rlimit CORE dump current is:%d, max is:%d\n", (int) rlmt.rlim_cur, (int) rlmt.rlim_max);
- rlmt.rlim_cur = (rlim_t) CORE_SIZE;
- rlmt.rlim_max = (rlim_t) CORE_SIZE;
- if (setrlimit(RLIMIT_CORE, &rlmt) == -1) {
- return - 1;
- }
- if (getrlimit(RLIMIT_CORE, &rlmt) == -1) {
- return - 1;
- }
- printf("After set rlimit CORE dump current is:%d, max is:%d\n", (int) rlmt.rlim_cur, (int) rlmt.rlim_max);
- /*测试非法内存,产生core文件*/
- int * ptr = NULL; * ptr = 10;
- return 0;
- }
执行./main, 生成的 core 文件如下所示
GDB 调试 core 文件,查看程序挂在位置。当 core dump 之后,使用命令 gdb program core 来查看 core 文件,其中 program 为可执行程序名,core 为生成的 core 文件名。
以上这篇关于 linux 下 core dump【总结】就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持 phperz。
来源: http://www.phperz.com/article/17/0712/318535.html