一、core dump文件生成

Core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试。当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文件,默认生成位置与可执行程序位于同一目录下。

1.查看core文件生成是否开启

ulimit -a

第一行core file size 如果是0表示没有打开,unlimited表示不限制产生文件大小。

ulimit -c 查看也可以

2.开启关闭core

关闭或阻止core文件生成:
$ulimit -c 0 打开core文件生成且不限制:
$ulimit -c unlimited

如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。

在调试这样的core文件的时候,gdb会提示错误。

临时设置(如下设置2G,单位为kbyte)

ulimit -c 4194304

3.修改core文件名称

(1)临时修改:

修改/proc/sys/kernel/core_pattern文件,但/proc目录本身是动态加载的,每次系统重启都会重新加载,因此这种方法只能作为临时修改。

使用root用户修改core文件生成名和路径:生成的core文件保存在/tmp/corefile 目录下,且core文件名为:

core-命令名-pid-时间戳(需系统支持修改该文件)

echo /tmp/corefile/core-%e-%p-%t > /proc/sys/kernel/core_pattern

可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳

以下是参数列表:

%p - insert pid into filename 添加pid(进程id)
%u - insert current uid into filename 添加当前uid(用户id)
%g - insert current gid into filename 添加当前gid(用户组id)
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加导致产生core的命令名

(2)永久修改:

可以通过在/etc/sysctl.conf文件中,对sysctl变量kernel.core_pattern的设置。

#vi /etc/sysctl.conf 然后,在sysctl.conf文件中添加下面两行:

kernel.core_pattern = /tmp/corefile/core-%e-%p-%t
kernel.core_uses_pid = 0

kernel.core_uses_pid 这个参数控制core文件的文件名是否添加pid作为扩展,如果这个文件的内容被配置成1,即使core_pattern中没有设置%p,最后生成的core dump文件名仍会加上进程ID

使用以下命令,使修改结果马上生效。

sysctl –p /etc/sysctl.conf

二、GDB工具使用

1.介绍

GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。

在实际应用中,有两种调试方法:在线调试和离线调试。

离线调试适用于开发测试环境,可以自由启停进程,设置断点;

在线调试一般用于现场问题分析,不能随便启停进程。

GDB主要来调试C/C++语言写的程序,当然也可以调试其他语言程序

GDB调试一定要是可执行文件而不是.c文件,要用gcc进行编译

如果调试PostgreSQL和类似的国产数据库,建议PostgreSQL编译项的enable-debug打开,它会开启调试符号使调试器跟踪代码。

gcc -g 源文件.c -o 输出的目标文件
gcc -g test.c -o test

-g表示以OS本地格式(stabs,COFF,XCOFF或DWARF 2)产生调试信息

2.GDB主要可以做四种事情来帮助你找到bug:

启动你的程序,指定任意可以影响程序行为的参数。
让你的程序在指定的条件停住.
测试你的程序停止的时候发生了什么。
改变程序内部的变量,来改正程序的错误继续执行。

3.使用GDB

(1)调试可执行文件

可以不带任何参数或选项执行gdb命令,但是最常用的启动gdb的方式是带一个或者两个参数,指定一个可执行文件来作为参数:

gdb program(gdb+可执行文件名称)

(2)分析core文件

也可以再gdb文件后面指定可执行文件 和 core文件的名称:

gdb program core(gdb + 可执行文件 +core文件)

在获取core文件时候,可以根据file命令获取是谁产生的

上边的core.20458文件是我执行kill -s SIGSEGV $$生成的

因此执行

gdb /bin/bash -c core.20458

图中显示我没有符号表,需要把符号表拷贝到相应的bin目录下,例如如果是openGauss数据库产生的core的话,就找到相应的符号表的包解压出来,把gaussdb.symbol拷贝到数据库的bin/下。(根据提示放到指定位置就可以)

(3)根据进程调试

如果要调试正在运行的进程,可以指定进程ID作为第二个参数

也可以指定一个进程id作为第二个参数,如果你想调试一个正在运行的程序:

gdb program 1234(gdb进程名+进程id)

会附加gdb到进程1234上(除非有一个文件名“1234”;GDB首先检查core文件)

4.调试

常用调试命令

break [file:]function     设置一个断点在函数中(在文件中)
run [arglist] 启动程序带上指定的参数
bt Backtrace: 显示堆栈
print expr 显示表达式的值
c 继续执行你的程序(程序停住后,例如:在断点处停止)
next/n 执行程序的下一行代码(程序停止以后);跨过任何当前行的函数调用。
edit [file:]function 查看当前程序停在哪。
list [file:]function 显示程序当前停住的代码行附近的代码
step 单步调试 执行程序的下一行(程序停住后),进入当前行的函数调用的内部,退出函数时使用finish
finish 结束函数
help [name] 显示gdb命令的相关信息。
return 忽略当前未执行的部分,强制返回
quit 退出gdb

5.测试

编写一个测试的文件ysla.c

#include<stdio.h>
int main()
{
int a,gw,bw,sw,g,b,r; scanf("%d",&a);
if(a<10&&a>99)
{
gw=a%10;
r=a/10;
sw=r%10;
bw=r/10;
b=gw;
g=bw;
r=b*100+sw*10+g;
printf("%d\n",r);
}
return 0;
}

编译生成执行文件

gcc -g ysla.c -o ysla

使用GDB调试

gdb ysla

(1)列出代码

(gdb) l

列出代码,相当于list,从第一行开始例出源码

直接回车会重复上一次的操作

(2)设置断点

(gdb) break 13

(3)查看断点信息

(gdb) info break

(4)运行程序,run命令简写

(gdb) r

会在断点处停住

(5)单条执行,next命令简写

(gdb) n

(6)继续执行,continue命令简写

(gdb) c

(7)打印变量,print简写

(gdb) p fp

(8)查看函数堆栈

(gdb) bt

(9)退出函数

(gdb) finish

(10)退出gdb

(gdb) q

————————————————

版权声明:本文为CSDN博主「小怪兽ysl」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_47308871/article/details/122152469

coredump文件生成,以及GDB工具使用的更多相关文章

  1. Doris开发手记3:利用CoreDump文件快速定位Doris的查询问题

    Apache Doris的BE部分是由C++编写,当出现一些内存越界,非法访问的问题时会导致BE进程的Crash.这部分的问题常常较难排查,同时也很难快速定位到对应的触发SQL,给使用者带来较大的困扰 ...

  2. 使用GDB生成coredump文件【转载】

    本文转载自: http://blog.csdn.net/sky_qing/article/details/8548989 如果在测试过程中遇到某个进程的CPU利用率过高或者卡死而需要去调试该进程时,可 ...

  3. gdb 调试coredump文件过程

    gdb 调试coredump文件过程: 第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢? 1. ps -fax|grep                 进程名称 找到 ...

  4. gdb调试coredump文件

    linux上程序崩溃起来挺烦人,不过linux 比较好的是有gdb. 1.生成coredump文件 echo "ulimit -c unlimited" >> /etc ...

  5. gdb 调试coredump文件过程:

    第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢? 1. ps -fax|grep                 进程名称 找到进程的pid 2.gdb -p pid ...

  6. linux shell 值coredump suid_dumpable和 gdb解析coredump文件

    可以设置产生coredump文件,设置dump文件命名非格式,生成dump文件的路径: linux # set suid_dumpable on if [ -e /proc/sys/kernel/su ...

  7. bootstrap 中是通过写less文件来生成css文件,用什么工具来编写呢?

    bootstrap 中是通过写less文件来生成css文件,用什么工具来编写呢? 如果用sublime的话如何实现代码保存后浏览器刷新成最新的代码样式? 或者有什么其他好用的工具? 从网上找了很多方法 ...

  8. CentOS 7.2 无法生成 coredump文件

    CentOS版本 cat /etc/centos-release  CentOS Linux release 7.2.1511 (Core) 设置ulimit -c ulimited 依旧无法生成co ...

  9. centos shell编程4【分发系统】 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要同步的文件 expect文件分发系统 expect自动发送密钥脚本 Linux脚本执行方式 第三十八节课

    centos shell编程4[分发系统] 服务器标准化  mkpasswd 生成密码的工具  expect讲解   expect传递参数   expect自动同步文件  expect指定host和要 ...

  10. Protobuf 文件生成工具 Prototool 命令详解

    Protobuf 文件生成工具 Prototool 命令详解 简介 Prototool 是 Protobuf 文件的生成工具, 目前支持go, php, java, c#, object c 五种语言 ...

随机推荐

  1. 聊聊Flink必知必会(五)

    聊聊Flink的必知必会(三) 聊聊Flink必知必会(四) 从源码中,根据关键的代码,梳理一下Flink中的时间与窗口实现逻辑. WindowedStream 对数据流执行keyBy()操作后,再调 ...

  2. DOS(Terminal)常用命令

    DOS是一款在20世纪末期流行的操作系统,它是一款面向磁盘的系统软件.它的用途非常广泛,大名鼎鼎的 Windows 98 就是基于它的.DOS依然活跃,比如FreeDOS. cmd是指命令行提示符,是 ...

  3. uni-app小程序项目发布流程

    uni-app小程序项目发布流程开发工具:HbuilderX编辑器.微信小程序开发工具1.小程序开发工具就可以点击发行版本了 2.登录开发者平台配置域名白名单 在开发者设置里完成服务器域名配置(域名白 ...

  4. classpath 和 classpath* 的区别

    classpath 和 classpath* 的区别 classpath 和 classpath* 是两种不同的类路径搜索模式,它们在寻找资源文件时有所不同: classpath:classpath ...

  5. 路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法

    Dijkstra(迪杰斯特拉)算法的思想是广度优先搜索(BFS) 贪心策略. 是从一个顶点到其余各顶点的最短路径算法,节点边是不各自不同的权重,但都必须是正数 如果是负数,则需要 Bellman-Fo ...

  6. [CF1416F] Showing Off

    题目链接 如果把方向看做有向边,整个图是一个内向基环树. 所以考虑哪些点有可能放在基环树的非环部分上,当且仅当一个点周围有严格小于他的点. 由于图一定是二分图(黑白染色),没有奇环,所有偶环一定可以拆 ...

  7. [ABC274Ex] XOR Sum of Arrays

    section> Problem Statement For sequences $B=(B_1,B_2,\dots,B_M)$ and $C=(C_1,C_2,\dots,C_M)$, eac ...

  8. 聊一聊 .NET高级调试 内核模式堆泄露

    一:背景 1. 讲故事 前几天有位朋友找到我,说他的机器内存在不断的上涨,但在任务管理器中查不出是哪个进程吃的内存,特别奇怪,截图如下: 在我的分析旅程中都是用户态模式的内存泄漏,像上图中的异常征兆已 ...

  9. 华企盾DSC影响企业微信头像显示空白

    解决方法:1.首先用procmon监控头像存储目录解密一下重新登录企业微信 2.如果方法1不行那么将企业微信的缓存目录删除​ 上图将缓存文件剪切出来后,重登企业微信正常 ​ 上图为不显示头像的异常情况

  10. C#如何对List中的Object进行排序

    首先定义一个List类,这个类里面包含了Name和Total两个属性变量,下面就是针对这两个变量进行排序. public class Player { public string Name { get ...