gdb段错误调试

本文介绍了如何使用gdb进行程序调试,包括启动调试、设置断点、查看变量和堆栈信息等基本操作。同时,文章探讨了段错误产生的原因,如访问错误内存段,特别是0地址和内存越界,并提供了查看和配置core文件的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、gdb调试
  1. gdb调试在编译时要加参数-g
  2. 基本命令:
    启动:gdb file
    罗列代码行数:list 1,
    设置断点:break (行数)
    查看断点信息:info break
    调试运行:run(r)
    单步调试:step(s)
    查看变量:print§ 变量名
    查看堆栈式:bt
    继续调试:continue(c)
    退出程序:q
  3. 列出所有资源的限制,查看core文件的选项是否打开ulimit -a
    不生成core文件原因:
    1、没有足够内存空间;
    2、禁用了core文件的创建;
    3、设置一个进程当前目录没有写文件的权限;
  4. 使用ulimit -c命令可以查看当前系统对于core文件的配置,0表示不生成core文件;不为0的数字a表示限制core文件大小不超过a,单位是k;unlimited则表示不限制core文件大小。
  5. 查看core文件生成路径配2种方法:cat /proc/sys/kernel/core_pattern
  6. 修改core文件路径的办法:
    (1)执行 sysctl kernel.core_pattern=core路径 命令进行修改,重启后失效
    (2)在/etc/sysctl.conf中添加kernel.core_pattern=core路径;然后执行sysctl -p加载
    core文件名称可配置:
    %p 产生core文件进程ID
    %g 产生core文件实际组ID
    %s 产生core文件信号
    %t 产生core文件时间戳
    %h 产生core文件主机名
    %e 产生core文 程序文件名
    %u 产生core文件实际用户ID
    (3)gdb 可执行文件 core文件调试,可定位到段错误位置
二、段错误
  1. 产生原因:产生段错误就是访问了错误的内存段。一般是没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址。
    1)、访问系统数据区,尤其是往 系统保护的内存地址写数据
    最常见就是给一个指针以0地址
    2)、内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域
  2. 存在段错误代码
#include <stdio.h>

void dummy_function(void)
{
	unsigned char*ptr=0x00;
    *ptr =0x00;
}

int main(void)
{
    dummy_function();
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值