Linux下使用GDB调试C程序
目录
在Windows上利用vs code等IDE(虽然是vs code不能算得上IDE)是很方便进行程序的调试,但是在没有图形界面的Linux环境下如何进行调试?答案就是借助GDB
类似的调试器。
GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。
对于一名Linux下工作的c++程序员,gdb是必不可少的工具;
有些系统没有默认安装,需要自己安装:
yum install gdb
例如,有一个c程序:
#include<stdio.h>
int main(){
printf("hello\n");
printf("world");
return 0;
}
对C/C++程序的调试,需要在编译前就加上-g选项:
$gcc -g hello.c -o hello # C++程序使用g++
调试可执行文件:
$gdb hello
然后进入交互界面,通过下面的命令进行调试:
运行类命令:
命令 | 说明 |
---|---|
run,简写r | 运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。 |
continue 简写c | 继续执行,到下一个断点处(或运行结束) |
step 简写s | 单步调试如果有函数调用,则进入函数; |
next 简写n | 单步跟踪程序,当遇到函数调用时,也不进入此函数体;此命令同 step 的主要区别是,step 遇到用户自定义的函数,将步进到函数中去运行,而 next 则直接调用函数,不会进入到函数体内 |
until | 当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体 |
until+行号 | 运行至某行,不仅仅用来跳出循环 |
finish | 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。 |
call 函数(参数) | 调用程序中可见的函数,并传递“参数”,如:call gdb_test(55) |
quit简写q | 推出gdb交互界面 |
设置断点类:
命令 | 说明 |
---|---|
break n 简写 b n | 在程序的第n行设置断点 |
b n if conditions | 满足conditions条件时候在第n行设置断点 |
b functionName | 在函数functionName()的入口处设置断点 |
delete n | 删除第n个断点 |
clear n | 清除第n行的断点 注意和delete的区别,删除函数的入口断点也是使用该命令 |
disable n | 暂停第n个断点 |
enable n | 开启第n个断点 |
info b | 显示当前程序的断点设置情况 |
delete breakpoints | 清除所有断点 |
查看源代码类:
命令 | 说明 |
---|---|
list 简写l | 列出程序的源代码,默认每次显示10行。 再次输入则将从上次输出的位置开始输出 **注意:**生成可执行程序的时候如果没有加上 -g 选项的话,该命令是不能够执行的 |
list n | 将显示当前文件以第n行为中心的前后10行代码,如:list 5 |
list functionName | 将显示“函数名”所在函数的源代码,如:list main 或者 list test |
打印表达式类:
命令 | 说明 |
---|---|
print 表达式 | 表达式可以是程序中的变量,也可以是自己定义的表达式,如print 2 * 2 ,类似于C语言的printf 函数 |
print func_name(p1,p1,...) | 例如,调用求和函数并且打印结果print sum(1,2,3) |
display 表达式 | 单步运行时每执行一步都打印表示式的内容。 |
info locals | 显示当前堆栈页的所有变量 |
查询运行信息
命令 | 说明 |
---|---|
where/bt | 当前运行的堆栈列表 |
bt backtrace | 显示当前调用堆栈 |
up/down | 改变堆栈显示的深度 |
set args 参数 | 指定运行时的参数 |
show args | 查看设置好的参数 |
info program | 来查看程序的是否在运行,进程号,被暂停的原因。 |
分割窗口
命令 | 说明 |
---|---|
layout | 用于分割窗口,可以一边查看代码,一边测试 |
layout src | 显示源代码窗口 |
layout asm | 显示反汇编窗口 |
layout regs | 显示源代码/反汇编和CPU寄存器窗口 |
layout split | 显示源代码和反汇编窗口 |
Ctrl + L | 刷新窗口 |
**交互模式下直接回车的作用是重复上一指令,对于单步调试非常方便; **
本文由「黄阿信」创作,创作不易,请多支持。
如果您觉得本文写得不错,那就点一下「赞赏」请我喝杯咖啡~
商业转载请联系作者获得授权,非商业转载请附上原文出处及本链接。
关注公众号,获取最新动态!
历史评论
开始评论