(一)GDBdebug调试技术——coredump

2024-06-08 07:18

本文主要是介绍(一)GDBdebug调试技术——coredump,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1.用户空间进程的内核转储:coredump
      • (1)ulimit相关指令
      • (2)在专用目录中生成内核转储
      • (3)自动压缩code dump文件
      • (4)启用Linux系统的内核转储功能
      • (5)code dump排除多余共享内存

1.用户空间进程的内核转储:coredump

(1)ulimit相关指令

查看当前的coredump功能是否有效;-c:表示coredump的大小限制,为0,表示无效
$ ulimit -c 
0不设置coredump文件的大小
$ ulimit -c unlimited设置coredump文件的大小的上限为1G
$ ulimit -c 1073741824
  • eg:codedump-test.c
#include <stdio.h>int main(void)
{int *a=NULL;*a=0x1;return 0;
}
  • gcc -g codedump-test.c -o codedump-test
$ ./codedump-test
Segmentation fault (coredumped)
  • 用gdb调试生成的coredump文件
coredump文件大小设置后,才会在编译链接的当前目录有coredump文件,即:下面的core
$ gdb -c core ./codedump-test解释:由于指针a的值是NULL,可以看出在访问NULL指针的时候,收到了信号。
在调试复杂程序的时候,从内核转储入手也十分有效
  • 结果如下在这里插入图片描述

(2)在专用目录中生成内核转储

  • 转储保存的完整路径,可以通过sysctl变量的kernel.core_pattern进行设置 (也可以通过(3)中的echo来修改)
kernel.core_uses_pid=0改变了文件名中PID的位置。若设置该值为1,则文件名末尾会添加.PID
$ cat /etc/sysctl.conf
kernel.core_pattern=/var/core/%t-%e-%c.core
kernel.core_uses_pid=0
$ sysctl -p生成coredump的时刻-进程名-PID-coredump的大小.core
$ ls /var/core
12223267175-a.out-2820-188446744073709551615.core
  • kernel.core_pattern可以设置的符号表如下:

在这里插入图片描述

(3)自动压缩code dump文件

$ echo "|/usr/local/sbin/core_helper" > /proc/sys/kernel/core_pattern
$ cat /etc/sysctl.conf
kernel.core_pattern=|/usr/local/sbin/core_helper %t %e %p %c
kernel.core_uses_pid=0
$ sysctl -p core_helper的内容是:
$ cat /usr/local/sbin/core_helper
#!/bin/bashexec gzip - > /var/core/$1-$2-$3-$4.core.gz$ ls /var/core
12223267175-a.out-2820-188446744073709551615.core.gz
echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

(4)启用Linux系统的内核转储功能

1./etc/initscript中写一个执行ulimit的脚本,若不行,则执行2
2.以Fedora9为例子
(a)首先编辑/etc/profile:
将 ulimit -S -c 0 > /dev/null 2>&1
修改为
ulimit -S -c unlimited > /dev/null 2>&1(b)让init脚本启动的守护进程中的coredump有效:
在/etc/sysyconfig/init文件中添加:DAEMON_COREFILE_LIMIT='unlimitted'(c)/etc/sysctl.conf中添加。默认情况下,该选项无效,还需要(2)在专用目录中生成内核转储
fs.suid_dumpable=1(d)最后重启Linux

(5)code dump排除多余共享内存

  • 由于各个共享内存的进程中,共享内存的内容是相同的,所以没必要所有进程都转存储
coredump_filter使用比特掩码表示内存类型
$ cat /proc/<PID>/coredump_filter
00000003要调过所有的共享内存区段,应将值改为1
$ echo 1> /proc/<PID>/coredump_filter
  • 比特4用于转储共享库或可执行文件等ELF格式文件,映射到的内存区段的第一页 (x86中为4KB)
    在这里插入图片描述

参考:《GDB/Debug.Hacks中文版:深入调试的技术和工具》

这篇关于(一)GDBdebug调试技术——coredump的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041510

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依