【Linux学习】日积月累——调试器gdb的使用教程
创始人
2024-05-30 05:37:34
0

一、背景

  gdb是一款强大的命令行调试工具,可以形成执行程序、脚本。只需要几个简单的命令,就能够实现Windows环境下VC等IDE的图形化调式工具的功能。

调试的相关常识:

  • 程序的发布方式有两种,debug模式和release模式;
  • Linux gcc/g++出来的二进制程序,默认是release模式;
  • 要使用gdb调试,必须在源代码生成二进制程序的时候,加上-g选项。

gdb的功能:

  • 启动程序时,能够按照开发者自定义的要求随心所欲的运行程序;
  • 可以让调试程序在开发者指定的位置的断点处停止;
  • 当程序停止时,可以检查此时程序中发生的事;
  • 动态改变程序的执行环境。

二、gdb的参数

2.1 案例分析

  为了更好地说明gdb的调试,使用c++源程序test.cpp进行案例分析,详见下列代码。

  1 #include2 using namespace std;3 4 int addToTop(int top)5 {6     cout<<"enter addToTop"<

  创建建文件Makefile,生成自动化构建工具。在调试C/C++程序,首先在编译时,我们必须要把调试信息加到可执行文件中,使用编译器(gcc/g++)的-g参数可以做到这点:

  1 mytest:test.cpp2     g++ -o mytest test.cpp -g -std=c++11                                               //如果没有-g,将看不见程序的函数名、变量名                                                                      3 .PHONY:clean4 clean:5     rm -f mytest

**g++**编译生成可执行文件mytest

image-20230307200142488

使用gdb调试的启动方法:

//启动gdb方法1
gdb 
//表示可执行程序,一般在当前目录下//启动gdb方法2
gdb core
//用gdb同时调试一个运行程序和core文件,core文件是程序非法执行后core dump产生的文件//启动gdb方法3
gdb  
//若启动的程序是一个服务程序,那么可以指定这个程序运行时的进程PID。

这里我么使用方法1进行案例分析。
image-20230305155425447

readlf命令常用于对可执行程序的分析,具体语法如下:

readelf -S

image-20230305161031537

readlf这里不作说明,后续会详解。使用命令list或l随机列出10行代码:

image-20230305161217090

l命令后接数字,则规定了从哪一行开始展示接下来的10行代码:

image-20230305161252378

此外,gdb会记住最近的位置,直接回车表示即可。

image-20230305161359569

run或r命令表示运行程序:

image-20230305161459268

break或b命令设置断点,下图在源程序第19行处设置断点;info b 查看断点信息。

image-20230305162230365

当前断点的编号,不能接行号

image-20230305162402770

断点的编号依次递增

image-20230305162549757

image-20230305162818831

image-20230305162912202

下图中,r运行程序后在源程序第20行处停住,next或n命令执行但语句

image-20230307201139574

print或p命令。打印局部变量sum的值:

image-20230307201831293

continu命令则继续运行程序

image-20230305204157990

2.2 gdb常用参数

gdb退出使用 ctrl+d或quit调试命令;

list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行;

list/l 函数名:列出某个函数的源代码;

r或run:运行程序(开始调试);

n或next:单条执行;

s或step:进入函数调用;

break(b)行号:在某一行设置断点;

enable:开启断点;

disable:关闭断点;

delete breakpoint:删除所有断点;

delete breakpoint n:删除序号为n的断点;

info break(b):查看断点信息;

print§:打印表达式的值,通过表达式可以修改变量的值或调用函数;

p 变量:打印变量值;

set var:修改变量的值;

display:常显示(内置类型、结构体等自定义类型,stl),追踪查看一个变量,每次停下来都显示它的值;

undisplay:取消常显示(取消对先前设置的哪些变量的追踪);

until 行号:在函数内,进行指定位置跳转,执行完区间代码;

finish:进入一个函数,只执行完该函数,就停下来;

c或continue:从一个断点处,直接运行到下一个断点处;

breaktrace(或bt):查看各级函数调用及参数;

info (i) locals:查看当前栈帧局部变量的值。

  不积跬步,无以至千里;不积小流,无以成江海。

相关内容

热门资讯

杨字的含义 杨字的含义 扬:张扬,自得的意思【解释】:趾高:走路时脚抬得很高;气扬:意气扬扬。走路时脚抬得很...
有梦子的四字成语? 有梦子的四字成语?白日做梦、魂牵梦萦、如梦初醒、梦寐以求、酣然入梦、半梦半醒、重温旧梦、夜长梦多、同...
恶人自有恶人磨 恶人自有恶人磨恶人自有恶人磨 (è rén zì yǒu è rén mó)解释:凶恶成性的人自然...
相对论中,火车断桥问题的答案是... 相对论中,火车断桥问题的答案是什么?这个假设唯一只有一个问题。败伏什么叫做“同时”?“只有两个发射器...
虎什么熊的成语 虎什么熊的成语这不是闹经急转弯虎背熊腰hǔ bèi xióng yāo成语解释如虎般宽厚的背;似熊样...
《亡念之扎姆德》男主角最后跟谁... 《亡念之扎姆德》男主角最后跟谁在一起?男主石化了九年,女主每天都来和他说话,然后九年后的第二天男主解...
火影忍者动画和漫画貌似不一样,... 火影忍者动画和漫画貌似不一样,海贼王动画和漫画一样吗?总是有些偏差的吧。。个人比较忠实原作。海贼王没...
让人非我弱,得志莫离群 让人非我弱,得志莫离群像投鼠忌器一样的意思吧,我躲,不是我怕你,而是我心有顾忌.不是因为势力差距而起...
《北宋小厨师》这本书更到现在男... 《北宋小厨师》这本书更到现在男猪脚泡到李师师和李清照了吗没有0.0....还没有啊因为还没结局
路边油炸的小摊上的酱是怎么做的... 路边油炸的小摊上的酱是怎么做的!要是家用,那可以选择用芝麻浆来做主配料.芝麻浆和水要1:1(水最好是...
《超禁忌游戏-五十分之一》应该... 《超禁忌游戏-五十分之一》应该完结了吧你要的是完整版的,但负责任地告诉你,现在不可能有,有也是骗你的...
公共经济学 答案 公共经济学 答案这个真不知道~!~谢谢~!~1.D2.D3.C4.B5.C6.D7.C8.B9.B1...
证券投资学 跟投资学有什么区别 证券投资学 跟投资学有什么区别投资学包括证券投资学。投资学包括各方面的投资学,比如黄金投资,期货投资...
忘记名字了,就是男主得到系统打... 忘记名字了,就是男主得到系统打英雄联盟,在联盟里边开挂可以变身眼可以变成野怪可以身穿求这部小说名字你...
个性签名为了你我愿意变成魔于全... 个性签名为了你我愿意变成魔于全世界为敌不爱那么多,只爱一点点,别人眉来又眼去,我只偷看你一眼。不要走...
野钓实用技巧 黑坑钓鱼技巧? 野钓实用技巧 黑坑钓鱼技巧?钓什么鱼要了解鱼的习性,了解对象鱼生活在哪个水层,喜欢吃什么食物,然后根...
江哲是那本书的? 江哲是那本书的?字随云的是《随波逐流之一代军师》字守义的是《三国之宅行天下》呵呵……这两本小说的江哲...
满满的生活经历是啥意思? 满满的生活经历是啥意思?满满的生活经历,说明的是这个人的生活阅历很深。
哪部国产青春剧比较贴近现实? 哪部国产青春剧比较贴近现实?《最好的我们》比较贴近现实,讲述的就是校园爱情故事,说的就是真实的高中生...
天涯海角与君共度 出自哪首歌呢... 天涯海角与君共度 出自哪首歌呢。云中歌主题曲丝罗李宇春的丝罗你好。楼主。李宇春《丝罗》伊本丝萝愿托乔...