要么改变世界,要么适应世界

Linux下使用GDB调试C程序

2020-04-15 12:57:00
355
目录

在Windows上利用vs code等IDE(虽然是vs code不能算得上IDE)是很方便进行程序的调试,但是在没有图形界面的Linux环境下如何进行调试?答案就是借助GDB类似的调试器。

文章摘录自linux tools quick tutoril中的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 刷新窗口

**交互模式下直接回车的作用是重复上一指令,对于单步调试非常方便; **

历史评论
开始评论