如何使用GDB工具来调试程序

简介: 如何使用GDB工具来调试程序

官方参考文档:http://www.gnu.org/software/gdb/documentation/ 

GDB(GNU 项目调试器)可以让您了解程序在执行时“内部”  究竟在干些什么,以及在程序发生崩溃的瞬间正在做什么。 GDB 做以下  4 件主要的事情来帮助您捕获程序中的  bug:  

◼  在程序启动之前指定一些可以影响程序行为的变量或条件

◼  在某个指定的地方或条件下暂停程序

◼  在程序停止时检查已经发生了什么

◼  在程序执行过程中修改程序中的变量或条件,这样就可以体验修复一个 bug 的成果,并继续了解其他  bug

 

准备

1、编译软件的时候 使用 gcc -g  xxx.c -o xxx   使用-g参数, 表明需要生成有调试信息的可执行程序

gcc -g  xxx.c -o xxx

2、在实际生成调试程序时,一般不仅要加上  -g 选项,也建议关闭编译器的程序优化选项。编译器的程序优化选项一般有五个级别,从  O0 ~ O4 (  注意第一个  O0 ,是字母  O 加上数字  0 ),  O0 表示不优化,从  O1 ~ O4 优化级别越来越高,O4 最高。这

样做的目的是为了调试的时候,符号文件显示的调试变量等能与源代码完全对应起来 , 默认是-O0  不优化

3、第1步骤生成的课执行程序是有调试信息的, 如果不需要调试信息  可以使用 strip + 可执行程序,去掉打印信息

strip xxx

 

启动gdb调试 三种方式

1、直接调试可执行文件,

gdb  xxx

2、调试正在运行的进程,而又不想终止程序, gdb attch 进程id

查看进程的方式  ps  -aux

gdb attch 2367   //例如进程id 为 2367

当调试完程序想结束此次调试时,而且不对当前进程有任何影响,也就是说想让这个程序继续运行,可以在  GDB 的命令行界面输入  detach 命令让程序与  GDB 调试器分离,这样  redis就可以继续运行了

(gdb) detach

 

3、调试core_dump 文件,gdb filename coredumpname

gdb filename core_dump123141231

调试core_dump文件主要是用在:有时候,服务器程序运行一段时间后会突然崩溃,这并不是我们希望看到的,需要解决这个问题。只要程序在崩溃的时候有  core 文件产生,就可以使用这个  core 文件来定位崩溃的原因

第1步: 查看linux是否打开了core的机制,默认linux是不打开的

ulimit -a

如果core file size    是      (blocks, -c) 0 ,则需要自己 重新设置一下 ulimite -c 的值,可以直接设置成 不做限制 ulimit -c unlimited

ulimit -c unlimited

上述操作是临时的,可以将上述命令写入到/etc/profile  中

(1)将ulimit -c unlimited 放入/etc/profile

(2)source /etc/profile

(3)再次查看  ulimit -a

 

第2步:设置生成core_dump文件的位置

(1)在/etc/sysctl.conf写入corefile文件生成的目录,例如

kernel.core_pattern=/home/qb/samba_myshare/seemyself/core_dump/core-%e-%p-%t

(2)创建应对的生成目录

cd  /home/qb/samba_myshare/seemyself/     -- 自己设置的路径

mkdir core_dump

(3)然后执行生效   sudo sysctl -p /etc/sysctl.conf

sudo sysctl -p /etc/sysctl.conf

可以查看自己是否设置成功

第3步: 写一个会core_dump的程序

#include <stdio.h>
int main(void)
{
    printf("hello world! dump core for set value to NULL pointer\n");
    *(char *)0 = 0;
    return 0;
}

编译

gcc -g -o test_core_dump test_core_dump.c

运行

./test_core_dump

在刚才我们设置生成core_dump的位置,会生成一个core_dump文件

运行gdb

gdb test_core_dump ~/samba_myshare/seemyself/core_dump/core-test_core_dump-3583-1598603271

 

退出gdb

q 或者  ctrl +d

 

常用命令

 

 

 

 

 

 

 

 

 

 

 

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
1月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
59 2
|
3月前
|
NoSQL Linux 开发工具
【深入解析git和gdb:版本控制与调试利器的终极指南】(下)
【深入解析git和gdb:版本控制与调试利器的终极指南】
|
3月前
|
NoSQL 小程序 C语言
GDB调试学习(四):段错误
GDB调试学习(四):段错误
39 0
|
3月前
|
NoSQL
GDB调试学习(三):观察点
GDB调试学习(三):观察点
38 0
|
3月前
|
NoSQL
GDB调试学习(二):断点
GDB调试学习(二):断点
37 0
|
2天前
|
NoSQL Ubuntu 测试技术
【GDB自定义指令】core analyzer结合gdb的调试及自定义gdb指令详情
【GDB自定义指令】core analyzer结合gdb的调试及自定义gdb指令详情
7 1
|
1月前
|
NoSQL C++ 开发者
【C/C++ 调试 GDB指南 】GDB中的‘info’命令:一次全面的探索
【C/C++ 调试 GDB指南 】GDB中的‘info’命令:一次全面的探索
40 0
|
1月前
|
NoSQL 算法 Shell
【C/C++ 调试 GDB指南 】详解 gdb 断点的设置方式
【C/C++ 调试 GDB指南 】详解 gdb 断点的设置方式
19 2
|
2月前
|
NoSQL Linux 编译器
【Linux工具篇】调试器gdb
【Linux工具篇】调试器gdb
22 0
|
3月前
|
NoSQL 编译器 Linux
Linux——编译器gcc/g++、调试器gdb以及自动化构建工具makefile&&make详解
Linux——编译器gcc/g++、调试器gdb以及自动化构建工具makefile&&make详解