<Linux> gdb调试器的使用

发布于:2024-08-15 ⋅ 阅读:(137) ⋅ 点赞:(0)

1. debug && release

        正常gcc编译出的可执行程序是release版本,不能调试,所以我们需要在makefile文件中的make依赖方法处添加 -g 命令,使生成的可执行程序为debug版本,可以被我们调试

        gcc默认编译时release方式发布的,无法直接调试,所以如果要被gdb调试,必须debug方式发布,必须再编译时加-g选项

        gcc mycode.c -o mycode_debug -g

        再使用gdb指令开始调试

        使用以下指令可以查看对应文件的二进制信息,release版本没有以下信息,即debug版本比release版本多了可调试信息

        可以使用下面的指令来查看该文件是否含有debug信息

readelf -S mycode-debug | grep -i debug

2. 显示代码 list

        VS有图形化界面,可以在调试的时候看到代码,而Linux中没有,那么我们要看到可执行程序中的代码就需要用指令来查看,list就是这个功能

        list可简写为l

lsit(l) 数字        //表示从第几行开始显示,默认显示10行
或 list 函数名   //找到函数所在位置,并列举附近代码

       

        注意:gdb会自动记录历史命令,所以list之后可以多次回车,默认跟着上一句指令继续往下查看代码 

3. 退出调试

        如果要退出gdb调试模式,使用quit指令,简写为q 

4. 设置断点 break

4.1. 添加断点 break

        相对应的VS的F5可以设置断点,那么linux也有设置断点指令

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

        设置断点后,我们还可以使用指令来查看我们设置的断点信息

info break
简写info b

b 函数名

b 函数名:行号
//这里的函数名可以是文件名,可以进行多文件调试

        可以直接 b 函数名 ,更方便的添加断点,会直接打到函数第一个语句处

4.2. 删除断点 delete

        如果断点设置错了,或者想要删除断点,使用delete指令,可简写为d

        但是需要注意的是,不能直接在delete后跟断点所在的行号,而是要跟上断点的编号

        注意:如果在调试过程,退出调试,那么之前设置的断点等信息都会消失,所以,如果你还要进行调试,那么不要使用q命令退出gdb调试,继续使用r指令,此时断点等信息都还存在,运行程序即可。

 4.3 禁用断点 disable

        如果不想让该断点生效,又不想删除该断点,那么可以使用disable指令禁用该断点,disable后跟的是断点编号

4.4 启用断点 enable 

4.5. 逐过程调试 next

        在到达断点后的VS中,我们应该进行的是F10逐过程或F11逐语句进行调试,相应的,在Linux中,next指令表示逐过程调试,可简写为n

        在每次执行后,都会显示:断点信息、在哪个函数内、在第几行代码的信息,

        调试时,空行直接跳过调试 ,所以调试的行号可能不连续

        gdb会自动记录历史命令,所以不用多次n,直接多次回车即可

 4.6. 逐语句调试 step

        想进入函数内部调试,使用step指令,简写为s

4.7 until 

        如果进入到了循环里,但是想跳出循环,继续调试,那么使用until指令

4.8 finish

         如果想快速结束函数,回到函数调用处,就是用finish指令。例如,程序出现错误,我们要判断错误来自哪一个函数,我们就可以finish来逐步查找哪一个函数出现问题

4.9 continue

         如果想从一个断点直接到达下一个断点,那么使用continue指令,可简写为c

4.10 breaktrace 

        查看堆栈调用情况,可简写为bt

4.11 info

info b    //查看断点信息
info locals    //类似VS中的自动窗口,查看局部的变量值

5. 查看变量信息 print

        使用print指令,可简写为p,后边跟变量名,如果要查看地址,带上&符号

5.1 display         

        在VS中,我们监控的变量值会随着调试改变,一直被可视化监视。如果Linux只能使用上面的形式查看变量的值,那就显得太不方便了,所以Linux中还有一个可以常显示变量信息的指令——display

        display后跟上变量名,或&变量名即可对这些被监视的变量进行编号,每次逐过程或逐语句调试后,都会显示它们的值

5.2 undisplay        

        如果不想再监视常显示的变量,需要使用undisplay指令,同取消断点一样,后面需要跟编号信息,不能直接跟变量名

 

6. set var 

        在调试时,可以使用 set var 指令进行修改变量的值,以达到快速观察函数以该变量值运行的效果

set var 变量名 = xx


网站公告

今日签到

点亮在社区的每一天
去签到