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