准备工作
开启core, 采集程序崩溃的状态
首先你跟着我做开启core崩溃状态采集. 可以通过ulimit -c
查看,如果是0
表示没有开启. 开启按照下面操作:
sudo gedit /etc/profile
在/etc/profile
最后一行添加下面几句话设置全局开启 core文件调试,大小不限.
# No core files by default 0, unlimited is oo
ulimit -S -c unlimited > /dev/null 2>&1
最后立即生效.
source /etc/profile
再跟着我做, 因为生成的core
文件同名会覆盖. 这里为其加上一个core
命名规则, 让其变成[core.pid]
格式.
sudo gedit /etc/sysctl.conf
在该文件的最后的加上如下几句话,并保存
# open, add core.pid
kernel.core_pattern = ./core_%t_%p_%e
kernel.core_uses_pid = 1
立即启用
sudo sysctl -p /etc/sysctl.conf
最后是ulimit -c
与cat /proc/sys/kernel/core_uses_pid
查看,下面状态表示core启用都搞好了.
如果显示没有开启成功,可以试试注销系统或者重启
简单接触 GDB , 开始调试 r n p
第一个演示代码heoo.c
#include <stdio.h>
int g_var = 0;
static int _add(int a, int b) {
printf("_add callad, a:%d, b:%d\n", a, b);
return a+b;
}
int main(void) {
int n = 1;
printf("one n=%d, g_var=%d\n", n, g_var);
++n;
--n;
g_var += 20;
g_var -= 10;
n = _add(1, g_var);
printf("two n=%d, g_var=%d\n", n, g_var);
return 0;
}
我们从下图说起,
使用命令
gcc -g -Wall -o heoo.out heoo.c
gdb heoo.out
gdb heoo.out
表示gdb
加载heoo.out
开始调试. 如果需要使用gdb
调试的话编译的时候gcc
需要加上-g
命令.
其中l
命令表示 查看加载源码内容. .
下面将演示如何加断点,使用命令b 函数名
或者b 行数
,r
表示调试的程序开始运行.
p
命令表示 打印值. n
表示过程调试, 到下一步. 不管子过程如何都不进入. 直接一次跳过.
下面的s 表示单步调试, 遇到子函数,会进入函数内部调试.
总结一下 . l
查看源码 ,b
加断点, r
开始运行调试, n
下一步, s
下一步但是会进入子函数. p
输出数据. c
跳过直到下一个断点处,watch 变量名
给变量添加监视点,whatis 变量名
打印变量名的类型, finish
跳出当前代码(之前跳入调试),q
表示程序退出.
到这里gdb 基本会用了. 是不是也很容易. 直白. 小代码可以随便调试了.
看到这里基础知识普及完毕了. 后面可以不看了. 有机会再看. 好那我们接着扯.
gdb其它开发中用的命令
开始扯一点, linux总是敲命令操作, 也很不安全. 有时候晕了. 写这样编译命令.
gcc -g -Wall -o heoo.c heoo.out
非常恐怖, heoo.c
代码删除了. heoo.out => heoo.c
先创建后生成失败退出. 原先的内容被抹掉了. 哈哈. 服务器开发, 经验不足, 熟练度不够.自己都怕自己.
gdb 其它常用命令用法 c q b info
首先看 用到的调试文件houge.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*
* arr 只能是数组
* 返回当前数组长度
*