首页 > 其他分享 >使用GDB调试

使用GDB调试

时间:2024-08-06 11:41:15浏览次数:17  
标签:core 文件 max .% 转储 GDB 使用 调试 核心

在Linux系统中配置生成用于GDB分析的core dump(核心转储)文件,可以按照以下步骤进行:

步骤 1: 核心转储使能设置

首先,你需要确认系统的核心转储设置是否符合要求。可以通过以下命令检查当前设置:

bashCopy Code
ulimit -c

  1.临时配置

  这个命令会显示核心转储文件的最大大小。如果输出为 0,则表示核心转储功能被禁用。你可以使用以下命令临时修改为不限制大小:

  bashCopy Code
    ulimit -c unlimited

  2.永久配置系统打开生成核心转储文件

  1. 永久性配置: 如果希望永久性地修改核心转储设置,可以编辑 /etc/security/limits.conf 文件,添加如下内容:

  2. Copy Code
    *        hard    core    unlimited
    

    这会使得所有用户的核心转储文件大小限制为无限制。

    格式是<domain>        <type>  <item>  <value>

#<domain> can be:
# - a user name
# - a group name, with @group syntax
# - the wildcard *, for default entry
# - the wildcard %, can be also used with %group syntax,
# for maxlogin limit
#
#<type> can have the two values:
# - "soft" for enforcing the soft limits
# - "hard" for enforcing hard limits
#
#<item> can be one of the following:
# - core - limits the core file size (KB)
# - data - max data size (KB)
# - fsize - maximum filesize (KB)
# - memlock - max locked-in-memory address space (KB)
# - nofile - max number of open file descriptors
# - rss - max resident set size (KB)
# - stack - max stack size (KB)
# - cpu - max CPU time (MIN)
# - nproc - max number of processes
# - as - address space limit (KB)
# - maxlogins - max number of logins for this user
# - maxsyslogins - max number of logins on the system
# - priority - the priority to run user process with
# - locks - max number of file locks the user can hold
# - sigpending - max number of pending signals
# - msgqueue - max memory used by POSIX message queues (bytes)
# - nice - max nice priority allowed to raise to values: [-20, 19]
# - rtprio - max realtime priority
#
#<domain> <type> <item> <value>

 

步骤 2: 核心文件存放位置

核心转储文件默认情况下会存放在进程的当前工作目录下,通常以 core 为文件名前缀。你可以通过修改 /proc/sys/kernel/core_pattern 文件来自定义核心转储文件的存放位置和命名规则。

例如,通过以下命令查看当前的核心转储文件设置:

bashCopy Code
cat /proc/sys/kernel/core_pattern

默认情况下,可能会显示类似于 /var/core/core.%e.%p.%h.%t 的设置,其中 %e 表示可执行文件名,%p 表示进程ID,%h 表示主机名,%t 表示时间戳。你可以根据需要自定义这个模式,确保目录存在并且有合适的权限。

  /var/core/core.%e.%p.%h.%t,这个模式使用了一些特殊变量:

  • %e:可执行文件名。
  • %p:进程ID。
  • %h:主机名。
  • %t:时间戳。
  • %s:线程ID。

临时修改:

echo "/tmp/core.%e.%p.%h.%t" > /proc/sys/kernel/core_pattern

永久修改:

要永久修改核心转储文件的存放位置,你需要编辑系统的配置文件,通常是 /etc/sysctl.conf/etc/sysctl.d/coredump.conf,然后sysctl --system或重启系统以确保修改生效

里面有这配置项

kernel.core_pattern = /new/path/core.%e.%p.%t

 

比如某嵌入式开发板的

/etc/sysctl.d/10-default.conf文件就有以下配置

kernel.core_pattern = /tmp/core.%e.%p.%t.%s

对于10-default.conf文件名,内核参数通常会根据文件名的数字前缀顺序加载,因此较高数字的文件(如99-xxx.conf)会在较低数字的文件(如10-xxx.conf)之后加载。这种顺序控制对于参数之间的依赖关系和优先级很重要

 

Ubuntu20的是用脚本配置

在启动脚本etc/init.d/apport中:

  echo "|$AGENT -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E" > /proc/sys/kernel/core_pattern

cat /proc/sys/kernel/core_pattern后可以看到
  |/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E

 

这个配置文件/proc/sys/kernel/core_pattern指定了系统在出现核心转储(core dump)时如何处理,配置完了sysctl -p或重启生效

|/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E

这个配置告诉系统在生成核心转储时,将核心转储的信息传递给apport工具。具体参数的含义如下:

    • -p%p: 进程号(PID)
    • -s%s: 信号号
    • -c%c: CPU 核心号
    • -d%d: 当前工作目录
    • -P%P: 父进程的 PID
    • -u%u: 用户 ID
    • -g%g: 用户组 ID
    • --: 分隔符,之后是核心文件的路径 %E

所以,当系统发生核心转储时,这个配置会将相关的信息传递给apport工具,用于处理和记录核心转储信息。Apport(应用程序错误报告)是一个用于处理和报告应用程序崩溃、错误和异常的工具。它主要用于Ubuntu及其衍生发行版中,用来捕获程序崩溃时的核心转储(core dump)和其他相关信息,然后生成错误报告并向开发者或维护团队发送。

 

可以在自启动脚本中,加入这两句命令也达到永久配置效果

ulimit -c unlimited

echo "/new/path/core.%e.%p.%t" > /proc/sys/kernel/core_pattern

 

步骤 3: 测试核心转储功能

为了验证配置是否生效,可以创建一个简单的程序,例如 test.c

cCopy Code
#include <stdio.h>
#include <stdlib.h>

void segfault() {
    char *ptr = NULL;
    *ptr = 'a';  // 引发段错误
}

int main() {
    segfault();
    return 0;
}

编译并运行该程序:

bashCopy Code
gcc test.c -o test
./test

如果一切配置正确,会在程序运行时生成一个名为 core 的文件(或者根据你设置的模式生成的文件),你可以用 GDB 进行后续分析:

bashCopy Code
gdb ./test core

 

如果不加-g选项进行编译时,就会提示no debug信息,解开core文件后,看到的信息相对比较少,这里是只有函数信息

加入-g编译后

 

 解开core文件后,看到的信息比较多,可以定位到代码的这一行

 

标签:core,文件,max,.%,转储,GDB,使用,调试,核心
From: https://www.cnblogs.com/jest549/p/18344616

相关文章

  • 更安全的alist手动安装挂载本机存储并使用nginx反代
    alist的手动安装挂载本机存储并使用nginx反代一、下载最新alist软件包wgethttps://github.com/alist-org/alist/releases/download/v3.36.0/alist-linux-amd64.tar.gz二、手动安装alist1.创建alist目录sudomkdir/opt/alist#创建运行alist的用户sudouseradd-r-s/us......
  • 外文文献翻译工具使用方法有哪些?先来试试这几种方法
    谁没有为论文拼过命呢?且不说后期的查重和格式规范调整工作,论文撰写前的资料收集就够大家“喝一壶”的了~要是碰上一些用外语撰写的文献,那大家就更难做到快速把握文献的核心观点和数据了。这时要是有办法能够轻松完成文献的翻译,那可就方便多啦!下面我就送上几种便捷的翻译方法......
  • Linux Docker使用代理
    面对dockerpull下载速度过慢,甚至根本无法正常下载的问题,下面介绍三种方法解决Docker联网的问题。内容转载自:https://note.qidong.name/2020/05/docker-proxy/有所修改通常的在终端中设置http_proxy的环境变量不能代理dockerpull的流量,原因在于docker的流量是systemd管理的,......
  • 使用git-bash 进入MINGW64使用mingw32-make编译提示目录前面有个“/cygdrive/d”如何
    问题出现的根本原因使用绝对路径时,exportBUILD_ROOT='D:/XX/XX'注意不能使用单引号直接地址exportBUILD_ROOT=D:/XX/XX 刚刚接触Cygwin,头一个问题就是:Cygwin如何访问Windows的各个磁盘目录,以及在Windows平台下如何访问Cygwin中的目录。执行mount命令后......
  • 使用JS的input框实现音频文件的上传与播放功能
    在网页中实现音频文件的上传和播放功能,可以通过HTML的<input>元素和JavaScript来完成。下面是一个简单的示例,展示了如何使用HTML和JavaScript实现这个功能:HTML部分<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>音频上传与播放</title>......
  • 使用rewriteBatchedStatements属性优化Mybatis-Plus批量插入数据(转)
    原文:https://blog.csdn.net/mcband/article/details/131530297前言由于项目是使用MyBatis-Plus开发的,用起来也确实比较方便,尤其是service层封装好的一些通用的增删改查方法,省去了不少sql语句的书写,但是在开发过程中,我也发现MyBatis-Plus的saveBatch批量插入方法针对MySQL数据库可......
  • 为什么要使用多态?(多态的好处)
    为什么要使用多态?(多态的好处):多态的好处:应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。//多态的真正作用,Java多态的好处:可......
  • Linux 下 perf 的使用
    目录一、概述1、perf作用2、常用的工具集二、perf工具的使用1、perflist2、perfstat3、perftop4、perfrecord/report4.1perfrecord4.2perfreport5、perfannotate一、概述1、perf作用perf是一个性能分析工具(基于Linux内核提供的性能事件perf_eve......
  • Linux 下 ag 命令的使用
    目录一、概述1、功能2、下载二、常用参数说明三、实例四、帮助文档一、概述1、功能在Linux系统中,ag命令是用于文本搜索的高效工具。它具有快速、灵活的搜索功能,并支持正则表达式匹配。2、下载在下面是各个系统安装ag的命令:sudoapt-getinstallsilversea......
  • Linux 下 objdump 命令的使用
    目录一、概述二、常用参数说明三、实例四、实例分析一、概述objdump工具是用来显示二进制文件的信息,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。该命令常用于Linux下反汇编目标文件或者可执行文件。什么是反汇编反汇编(disassembly)是......