一、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. Sealos 云操作系统一键集成 runwasi,解锁 Wasm 的无限潜力

    WebAssembly (通常缩写为 Wasm) 是一种为网络浏览器设计的低级编程语言.它旨在提供一种比传统的 JavaScript 更快.更高效的方式来执行代码,以弥补 JavaScript 在性能 ...

  2. python列表之部分列表——切片

    目录 切片 全索引 半索引 负数索引 遍历切片 复制列表 切片 全索引 我们平常可能需要使用一个列表中的子列表,也就是部分元素,这个时候我们就需要用到切片这个功能啦 要创建切片,就如同range()函 ...

  3. 最全的VLOOKUP应用教程

    VLOOKUP是Excel中最常用的函数之一,它可以让我们在一个表格中查找指定值,并返回与该值匹配的另一个单元格中的内容. 在这篇文章中,我们将深入探讨VLOOKUP的使用方法,从而为您提供一份史上最 ...

  4. nacos 安装和使用

    Nacos 是阿里巴巴开源项目,用于构建微服务应用的服务发现.配置管理和服务管理. 在微服务项目中不同模块之间服务调用时,实现服务注册与发现. Nacos 使用: Nacos 是java开发的,依赖 ...

  5. 【笔记】01 -- Spring-Cloud介绍

    第一章节我们主要是介绍微服务 springCloud的架构和分布式的区别 但是后面会主要介绍netflix公司与Alibaba公司的两套架构 系统架构 **概述** 随着互联网的发展,网站应用的规模不 ...

  6. Ubuntu 下建立 eclipse 启动图标,解决ADT没有菜单栏问题(转载)

    原文地址 怎么在这应用程序里边建立图标$sudo gedit /usr/share/applications/Eclipse.desktop输入以下代码 [Desktop Entry]Name=Ecl ...

  7. Linux 多路复用(多路转接)

    出现原因 如果需要从一个文件描述符中读取数据,然后将数据写入到另一个文件描述符时,可以按照如下的阻塞 IO : while ((n = read(STDIN_FILENO, buf, BUFFER_S ...

  8. CSS3学习笔记-句子排版效果

    CSS3提供了丰富的排版效果,可以通过样式属性来控制文本的排列方式.字体样式.行高.字间距等.以下是一些常用的句子排版效果示例: 文本对齐方式: .text-center { text-align: ...

  9. win11 右击还原 win10的

    以管理员身份 打开 powershell, 然后输入如下代码 .\reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a ...

  10. PythonAnywhere 部署Flask项目

    一. 注册账号 官网:https://www.pythonanywhere.com/ 二. 将GitHub上的项目发送至PythonAnywhere 三.配置环境及运行 git clone https ...