小工具知识网

当前位置: 首页 > 行业知识 > Linux的gdb调试

行业知识

Linux的gdb调试

2026-10-19 05:13:17 来源:互联网转载

文章目录

  • 一、编译有调试信息的目标文件
  • 二、启动gdb调试文件
    • 1、查看内容list/l:l 文件名:行号/函数名,l 行号/函数名
    • 2、打断点b:b文件名:行号/函数名,b 行号/函数名 与 查看断点info/i:info b
    • 3、删除断点d:d Num(编号)
    • 4、使能断点disable/enable 断点编号:关闭/打开断点
    • 5、逐过程next/n(F10)与逐语句step/s(F11)
    • 6、跳过断点continue/c:运行至下一个断点处(运行中的F5)
    • 7、查看变量内容或地址print/p
    • 8、显示变量内容或地址:display(长时间显示)与关闭显示变量内容或地址:undisplay
    • 9、运行结束函数并返回:finish(返回之后停下来)
    • 10、跳转至指定行:until 行号
    • 11、显示当前局部的全部变量:info locals (i locals)
    • 12、改变一个变量原有的值:set car 变量=Num
    • 13、查看所在函数:bt(也显示进入函数前的函数)
    • 14、查看所在行与所在函数:f
    • ���结

      一、编译有调试信息的目标文件

      正常情况下gcc或g++编译链接之后都是不带调试信息的目标文件

      这如同VS下的release编译,需要加入选项-g来加入调试信息

      正常编译(release版本):gcc -o 目标文件 源文件 [使用标准]例如:gcc -o mytest.exe test.c -std=c99(使用c99标准)g++ -o 目标文件 源文件 [使用标准]例如:gcc -o mytest.exe test.c -std=c++11(使用c++11标准)加入调试信息(debug版本):gcc -o 目标文件 源文件 [使用标准]例如:gcc -o mytest.exe test.c -g -std=c99(使用c99标准)g++ -o 目标文件 源文件 [使用标准]例如:gcc -o mytest.exe test.c -g -std=c++11(使用c++11标准)与正常的release编译就多了一个选项-g

      这个使用标准可以不带,但如果发现代码没问题又编译不过就加上使用标准试试

      可以从文件大小来对比:

      可以从调试信息对比:

      指令:readelf -S filename | grep -i debug例如:readelf -S test.exe | grep -i debug

      两个文件分别展示含debug的调试信息,可以看到release文件是没有信息展示的

      二、启动gdb调试文件

      指令:gdb filename例如:gdb test.exe如果出现报错信息:bash: gdb: command not found看一下安装gdb能不能再次打开root账号下:yum -y install gdb如果普通账号能提权就:sudo yum -y install gdb

      gdb下常用指令集合:

      有些指令可以简写,以VS对比1、quit/q:退出gdb2、run/r:运行程序(类似F5,没断点直接跑完)3、查看内容 list/l:l 文件名:行号/函数名,l 行号/函数名(.c、.txt的普通文件,不是可执行文件)4、打断点 b:b文件名:行号/函数名,b 行号/函数名(类似F9)5、查看断点 info/i:如info b6、删除断点:d Num(编号)7、使能断点:disable/enable 断点编号(关闭/打开断点)8、逐过程:next/n(F10)9、逐语句:step/s(F11)10、跳过断点continue/c:运行至下一个断点处(运行中的F5)11、查看变量内容或地址:print/p 变量名或取地址(一次性)12、显示变量内容或地址:display 变量名或取地址(长时间显示)13、关闭显示变量内容或地址:undisplay 显示编号14、运行结束函数并返回:finish(运行结束所在函数,就停下来)15、跳转至指定行:until 行号(中间的代码都是运行了的!)16、显示当前局部的全部变量:info locals (i locals)17、改变一个变量原有的值:set car 变量=Num18、查看所在函数:bt(也显示进入函数前的函数)19、查看所在行与所在函数:f

      1、查看内容list/l:l 文件名:行号/函数名,l 行号/函数名

      有两种使用方法:1.查看其他文件的内容2.查看正在调试的内容list简写成l指令是:l filename:line(其他文件) 或者 l line(正在调试的文件)或者显示函数:line 函数名(l filename:函数名)例如:l test.c:0   或者 l 0指令这里的line是说显示第几行,通常是把line的上下文打印,line放中间显示

      以第0行为例:

      l test.c:0(指定的文件,通常是源文件)

      因为调试文件和.c文件一样,展示的也一样

      显示main函数:

      (main函数放中间,它的上下文打印显示,行号的时候也是)

      显示的不是全部,只是一部分而已

      gdb默认记录最近的指令,如果直接按回车则会打印显示接下来没显示的

      2、打断点b:b文件名:行号/函数名,b 行号/函数名 与 查看断点info/i:info b

      打断点指令:b filename:line(通常是编译前的源文件)b line函数名也是一样的:b 函数名(或其他源文件的函数名)查看断点指令:info b(直接查看全部断点)

      对函数和第几行打断点:

      函数名本质也是地址,所以对函数打断点是打函数体内第一行打断点

      而且也看到,对于文件或调试的打断点,打的断点也是源文件上的断点

      3、删除断点d:d Num(编号)

      指令:d Num(断点编号)例如:d 1删除断点操作只能用编号删除,删除后编号不重新整理

      删除存在的断点:

      删除之后使用info查看,删除之后编号不会整理

      4、使能断点disable/enable 断点编号:关闭/打开断点

      指令:关闭断点(断点不起作用):disable Num(断点编号)关闭断点(断点起作用):enable Num(断点编号)如同VS右击断点开启或关闭断点

      如图所示:

      关闭的断点调试时不起作用

      5、逐过程next/n(F10)与逐语句step/s(F11)

      指令:逐过程:next/n(如同VS调试的F10)逐语句:step/s(如同VS调试的F11)

      逐过程(F10):

      逐语句(F11):

      6、跳过断点continue/c:运行至下一个断点处(运行中的F5)

      指令:运行至下一个断点处:continue/c(跳过断点,同VS运行中的F5)

      如图所示:

      如果再重新运行run/r则会询问是否重新开始运行:

      7、查看变量内容或地址print/p

      指令:查看变量内容或地址:print/p例如:p a 或 p &a

      如图:

      这种显示方法是一次性的,需要显示的时候要重新输入指令

      8、显示变量内容或地址:display(长时间显示)与关闭显示变量内容或地址:undisplay

      指令:显示变量内容或地址:display 变量名或取地址关闭显示变量内容或地址:undisplay 编号例如:display a(display &a)undisplay Num

      显示变量内容或地址:

      显示的只能在本作用域显示,跳到别的函数则不会显示

      关闭显示变量内容或地址:

      9、运行结束函数并返回:finish(返回之后停下来)

      指令:运行结束函数并返回:finish

      如图:

      这个方法可以快速的跳出函数并查看返回了什么

      10、跳转至指定行:until 行号

      指令:跳转至指定行:until 行号

      如图:

      通常来讲,无法从一个函数内跳到另外一个函数,但用来没打断点时跳过循环挺好的

      在同一函数内像断点(F9)与F5的配合

      11、显示当前局部的全部变量:info locals (i locals)

      指令:显示当前局部的全部变量:info locals (简写为:i locals)

      可以看到,显示的全部局部变量,还没定义的也显示了,并且是需要时再使用指令显示

      说明是一次性的显示指令,还会预先显示变量

      12、改变一个变量原有的值:set car 变量=Num

      指令:改变一个变量原有的值:set car 变量=Num例如:set var i=50

      如图:

      这种是本质上改变变量的值,让循环运算有种不确定的执行方法

      这种设置方法可以面对特殊情况,比如怀疑变量到了哪个值出现的问题

      13、查看所在函数:bt(也显示进入函数前的函数)

      指令:查看所在函数:bt

      如图:

      可以看到显示了当前所在的函数

      当进入另外一个函数时,能看到当前函数,还能看到调用该函数时的函数

      14、查看所在行与所在函数:f

      指令:查看所在行:f

      如图:

      这个指令可以查看所在第几行,搭配 list/l 来查看就能知道上下文

      这指令是不注意按出来的,不知道不同版本会不会使用不同

      总结

      以当前指令窗口看,使用效率与使用便捷无法与图形化界面比较

      图形化界面能看边调试边查看代表,指令窗口只能用指令来调试

      图形化界面有快捷键,指令窗口只有简写指令

      如果一个偏复杂的程序,图形化界面更好,指令窗口没啥优势

      加油吧少年!

上一篇:宛静之音,正确发音与魅力探索之旅!

下一篇:无线服务器怎么安装驱动?