如何使用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
相关文章
|
6月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
391 2
|
3月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
65 10
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
102 3
|
3月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
108 0
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
45 1
|
5月前
|
NoSQL 编译器 Linux
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
90 0
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
32 0
|
5月前
|
NoSQL Linux C++
Linux C/C++ gdb调试正在运行的程序
Linux C/C++ gdb调试正在运行的程序
|
5月前
|
NoSQL Linux C++
Linux C/C++ gdb调试core文件
Linux C/C++ gdb调试core文件
|
5月前
|
NoSQL Linux C++
Linux C/C++ gdb调试
Linux C/C++ gdb调试
下一篇
无影云桌面