准备工作
开启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

本文详细介绍了GDB的使用,包括开启core文件调试、基本调试命令如r n p、设置断点、查看内存堆栈、条件断点、删除断点、调试回退等功能。此外,还探讨了GDB在darknet框架中的实际应用,以及多线程和多进程调试。通过实例和步骤说明,帮助读者掌握GDB调试技巧。
6728

被折叠的 条评论
为什么被折叠?



