C/C++调试工具 - gdb详解

C/C++调试工具 -gdb详解

  • 1 简介
  • 2 常用的命令
  • 3 使用的条件
  • 4 程序调试
    •   4.1 直接运行程序
    •   4.2 断点调试(在某一行)
    •   4.3 断点调试(在函数入口处打断点)
  • 5 调试core文件
    •   5.1 生成core文件的方法
    •   5.2 调试core文件

 


1 简介

 

GDB是Linux下非常好用且强大的调试工具。GDB可以调试C、C++、Go、java、 objective-c、PHP等语言,是做后端软件开发必备的工具

可以完成如下的功能 :

  • 1 按照自定义的方式启动运行需要调试的程序
  • 2 程序暂停时的值的监视
  • 动态改变程序的执行环境

 


 

2 常用的命令

 

命令详解
file filename加载被调试的可执行文件
run重新开始运行文件
start单步执行 运行程序 停在第一执行语句
list查看源代码
set设置变量的值
start单步执行 运行程序 停在第一执行语句
next单步跳过(直接执行函数)
step单步执行 进入函数内部执行
backtrace查看函数的调用栈帧和层级关系(简写bt)
frame切换的函数的栈帧
info查看函数内部局部变量的值
finish结束当前函数 回到函数的调用点
continue继续执行 简写c
print打印值及地址 简写p
quit退出gdb

 

 


 

3 使用的条件

 

在编译时使用 g++/gcc -g选项

 

查看是否带有编译信息

 

在这里插入图片描述
 

如上所示则表示带有调试信息

 

在这里插入图片描述

如上所示,则表示编译时没有带 -g选项 因此无法是gdb进行调试

 


 

4 程序调试

 

  4.1 直接运行程序

 

使用gdb工具运行的代码如下

#include <stdio.h>
int main()
{int index = 0;for (;index < 10;++index){printf("index = %d ",index);}printf("\n");return 0;
}

 

编译

gcc -g test.c -o test

 

gdb 运行

 

[root@chao_1 /home/vagrant/clan/test]$ gdb test
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/vagrant/clan/test/test...done.
## run 运行
(gdb) run
Starting program: /home/vagrant/clan/test/test
index = 0 index = 1 index = 2 index = 3 index = 4 index = 5 index = 6 index = 7 index = 8 index = 9
[Inferior 1 (process 12553) exited normally]
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64

 

  4.2 断点调试(在某一行)

 

1 在某一行打断点
 

格式:

## 简写 b filename:rownum
break filename:rownum

 
2 继续运行
 

## 简写 c
continue

 
输出变量的值
 

print varname
[root@chao_1 /home/vagrant/clan/test]$ gdb test
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/vagrant/clan/test/test...done.## 1 加载可执行文件
(gdb) file test
Load new symbol table from "/home/vagrant/clan/test/test"? (y or n) y
Reading symbols from /home/vagrant/clan/test/test...done.## 2 在test.c文件的第7行打断点
(gdb) b test.c:7
Breakpoint 1 at 0x40058e: file test.c, line 7.## 3 运行程序
(gdb) r
Starting program: /home/vagrant/clan/test/testBreakpoint 1, main () at test.c:7
7                        printf("index = %d ",index);
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64##4 输出变量的值
(gdb) print index
$1 = 0##5 继续允许程序 
(gdb) c
Continuing.Breakpoint 1, main () at test.c:7
7                        printf("index = %d ",index);
(gdb) print index
$2 = 1
(gdb) c
Continuing.Breakpoint 1, main () at test.c:7
7                        printf("index = %d ",index);
(gdb) print index
$3 = 2

 

  4.3 断点调试(在函数入口处打断点)

 

格式

breakpoint file_name:function_name  

调试样例
 

代码

#include <iostream>
#include <string>
using namespace std;static int  get_index(const string &s1, const string &s2)
{if (&s1 == NULL || &s2 == NULL || s2.length() < 1 && s1.length() < s2.length()){return -1;}int L1 = s1.length();int L2 = s2.length();int i1 = 0;int i2 = 0;int retIndex = 0; // 匹配s1开始的位置while (i1 < L1 && i2 < L2){if (s1[i1] == s2[i2]){++i1;++i2;}else // 以retIndex开头是匹配不出来的 要从 retIndex的下一个开始{i1 = ++retIndex;i2 = 0;}}return i2 == L2 ? retIndex : -1;
}int main()
{std::string s1 = "abcgdb";std::string s2 = "gdb";int index = get_index(s1,s2);std::cout << "index = " << index << std::endl;return 0;
}

 

编译

g++ -g test.cpp -o test

 

函数断点调试
 

[vagrant@chao_1 /home/vagrant/clan/test]$ gdb test
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/vagrant/clan/test/test...done.
## 1 . 在函数入口处打断点(gdb) b test.cpp:get_index
Breakpoint 1 at 0x400afe: file test.cpp, line 7.## 2 运行程序
(gdb) r
Starting program: /home/vagrant/clan/test/testBreakpoint 1, get_index (s1="abcgdb", s2="gdb") at test.cpp:7
7           if (&s1 == NULL || &s2 == NULL || s2.length() < 1 && s1.length() < s2.length())
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-44.el7.x86_64## 3 继续运行 直接跳过函数
(gdb) c
Continuing.
index = 3
[Inferior 1 (process 16728) exited normally]

 

查看断点

 

info breakpoints
(gdb) info breakpoints
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400afe in get_index(std::string const&, std::string const&) at test.cpp:7breakpoint already hit 1 time
(gdb)

 


 

5 调试core文件

 

  5.1 生成core文件的方法

 

产生coredump的条件,首先需要确认当前会话的ulimit –c,若为0,则不会产生对应的coredump,需要进行修改和设置

ulimit -c
ulimit -c unlimited

更改core dump生成路径

## %e表示程序名, %p表示进程id
echo "/home/vagrant/core/core.%e.%p" > /proc/sys/kernel/core_pattern

 

  5.2 调试core文件

 

测试代码

int main()
{char* str = "gdbcoretest";str[0] = 'G';return 0;
}

 

编译

g++ -g test.c  -o test

 

运行

[vagrant@chao_1 /home/vagrant/clan/test]$ ./test
Segmentation fault (core dumped)

查看结果,出现了段错误

 

查看生成的core文件

[vagrant@chao_1 /home/vagrant/core]$ ll
total 300
-rw-------. 1 vagrant vagrant 245760 Nov 12 06:12 core.test.19727
-rw-------. 1 vagrant vagrant 245760 Nov 12 06:15 core.test.20012

 

调试core文件

## gdb 可执行文件名  core文件名
gdb test core.test.19727
/home/vagrant/clan/test]$ gdb test core.test.20379
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/vagrant/clan/test/test...done.
[New LWP 20379]
Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
#0  0x00000000004004fd in main () at testCore.c:5
5               str[0] = 'G';
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64
## 查看函数的栈帧 testCore.c 第5行出现了段错误
## 使用 where 也可以
(gdb) bt
#0  0x00000000004004fd in main () at testCore.c:5(gdb) where
#0  0x00000000004004fd in main () at testCore.c:5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/176440.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提升代码复用性:探讨Mixin类在面向对象语言中的独特作用和优势

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、m…

Spring 只用一招,就摆脱被垃圾回收的命运,拯救了自己

SpringBoot ApplicationContext 会被 JVM 当成垃圾对象&#xff0c;然后回收掉吗&#xff1f; 最近五阳哥在复习JVM 垃圾回收的知识&#xff0c;被别人问到这个问题&#xff0c;我心里感到一惊&#xff0c;如果Spring 被回收掉&#xff0c;Spring管理的bean全部会被回收&#…

Linux系统简介与开源精神

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Linux系统理论 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言&#x1f324;️Linux系统背景☁️UNIX发展史☁️Linux发展史☁️Linux系统企业应用现…

TDengine 与煤科院五大系统实现兼容性互认,助力煤矿智能化安全体系搭建

近日&#xff0c;涛思数据与煤炭科学技术研究院&#xff08;以下简称煤科院&#xff09;已完成数个产品兼容互认证工作&#xff0c;经双方共同严格测试&#xff0c;涛思数据旗下物联网、工业大数据平台 TDengine V3.X 与煤炭科学技术研究院旗下煤矿复合灾害监测监控预警系统、煤…

LeetCode算法心得——高级访客(模拟枚举+小窗口)

大家好&#xff0c;我是晴天学长&#xff0c;今天的周赛第二题&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .高级访客 给你一个长度为 n 、下标从 0 开始的二维字符串数组 access_times 。对于每个 …

μC/OS-II---计时器管理1(os_tmr.c)

目录 创建一个计时器重新启动一个计时器停止一个计时器删除一个计时器 计时器是倒计时器&#xff0c;当计数器达到零时执行某个动作。用户通过回调函数提供这个动作。回调函数是用户声明的函数&#xff0c;在计时器到期时被调用。在回调函数中绝对不能进行阻塞调用&#xff08;…

Ansible playbook详解

playbook是ansible用于配置&#xff0c;部署&#xff0c;和被管理被控节点的剧本 playbook常用的YMAL格式&#xff1a;&#xff08;文件名称以 .yml结尾&#xff09; 1、文件的第一行应该以 "---" (三个连字符)开始&#xff0c;表明YMAL文件的开始。    2、在同一…

原型制作神器ProtoPie的使用Unity与网页跨端交互

什么是ProtoPie&#xff1f; ProtoPie是一款面向设计师的软件原型设计工具&#xff0c;例如制作App界面交互展示&#xff0c;制作好的原型可以一键发布到Web服务器&#xff0c;就可以浏览器访问。由于其内置了大量常用交互类型&#xff0c;以及"程序化"模块&#xf…

hash算法

一、Hash散列算法介绍 1.引言 每个人在这个社会上生存&#xff0c;都会有一个属于自己的标记&#xff0c;用于区分不同的个体。通常使用名字就可以了。但是一个名字也并不能完全表示一个人&#xff0c;因为重名的人很多。所以我们可以使用一个身份证号或者指纹来表示独一无二…

力扣每日一道系列 --- LeetCode 160. 相交链表

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构探索 ✅LeetCode每日一道 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 LeetCode 160. 相交链表 思路&#xff1a; 首先计算两个链表的长度&#xff0c;然后判断两个链…

Open X-Embodiment 超大规模开源真实机器人数据集分享

近期&#xff0c;Google旗下的前沿人工智能企业DeepMind汇集了来自 22 种不同机器人类型的数据&#xff0c;创建了 Open X-Embodiment 数据集并开源了出来。该数据集让他们研发的RT-2 机器人在制造和编程方式上有了重大飞跃。 有分析称&#xff0c;在上述数据集上训练的 RT-2-…

gpt-4-turbo、gpt-4v、dall-e-3 api实测!

上周GPT大更新&#xff0c;不仅开放了GPT-4-Turbo、GPT-4-Vision等模型api&#xff0c;还发布了GPTs&#xff0c;使得用户能够根据需要定义自己的GPT应用&#xff0c;OpenAI在这波AI革命上又一次震撼世人。 笔者也在上周拿到了几个新模型的api资格&#xff0c;一直盼着可以测试…