从Windows转到Linux下已经有一段时刻了,每次刷算法题碰到问题需求调试的时分,就分分钟想关机,切换到Windows上调试。所以,花了一点时刻来查找一下Linux下常见的调试东西,这不搜不知道,一搜吓一跳,竟然差点错过了这么好的调试利器GDB。上手非常简略,几分钟就能够开开心心调试你的代码了。
GDB概述
GDB是一个由GNU开源安排发布的、UNIX/LINUX操作系统下的、根据指令行的、功用强壮的程序调试东西。比较于VS里边的图形化调试东西,其功用愈加强壮。
GDB装置
在终端下运转如下代码即可装置GDB调试器:
sudo apt-get install gdb
检查装置是否成功,输入gdb -version,会输出如下代码:
GNU gdb (Ubuntu 7.10-1ubuntu2) 7.10Copyright (C) 2015 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later //gnu.org/licenses/gpl.html>This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law. Type “show copying”and “show warranty” for details.This GDB was configured as “x86_64-linux-gnu”.Type “show configuraTIon” for configuraTIon details.
GDB调试过程
调试用例
写了一个简略完成两个数相加的程序,来演示gdb调试的相关过程:
#include int add(int a , int b){ return a+b;}int main(){ int m,n; scanf(“%d%d”,&m,&n); int sum = add(m , n); return 0;}
编译生成
一般在编译程序的时分都是直接生成release可履行文件,
gcc -o add add.c
假如需求调试的话,应该编译成debug版别,此刻,只用在编译选项中参加 -g,如下:
gcc -g add.c -o add
进入调试状况
进入gdb调试状况有两种,第一种直接在gdb指令后边加上编译好的文件名:
gdb add
另一种方法便是输入gdb,然后经过运用file指令来翻开待调试的文件:
gdbfile add
终端界面会显现如下信息:
GNU gdb (Ubuntu 7.10-1ubuntu2) 7.10Copyright (C) 2015 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later //gnu.org/licenses/gpl.html>This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law. Type “show copying”and “show warranty” for details.This GDB was configured as “x86_64-linux-gnu”.Type “show configuration” for configuration details.For bug reporting instructions, please see://www.gnu.org/software/gdb/bugs/>.Find the GDB manual and other documentation resources online at://www.gnu.org/software/gdb/documentation/>.For help, type “help”.Type “apropos word” to search for commands related to “word”…Reading symbols from add…done.(gdb)
常用调试指令
常用指令简写指令用法说明fileffile filename在gdb中载入某可履行文件listllist [开端,结束]列出文件的代码清单,支撑指定行号printpp 变量名容许出变量的值breakbbreak 行号or函数名在指定行号或函数上设置断点clearclclear 行号or函数名删去指定行号或函数上的断点conTInuecconTInue [开端,结束]从断点处持续运转nextnnext运转到下一行stepsstep单步调试runrrun履行程序
实践调试
列出代码清单
(gdb) l1 #include 2 3 int add(int a , int b){4 return a+b;5 }6 int main(){7 int m,n;8 scanf(“%d%d”,&m,&n);9 int sum = add(m , n);10 return 0;
加断点
在main函数和程序的第4行加两个断点。
(gdb) break mainBreakpoint 1 at 0x4005e2: file add.c, line 6.(gdb) break 4Breakpoint 2 at 0x4005d0: file add.c, line 4.
运转
(gdb) runStarting program: /home/Documents/add Breakpoint 1, main () at add.c:66 int main(){ //这儿显现运转到的方位,停在了第一个断点方位main
next下一行
(gdb) n8 scanf(“%d%d”,&m,&n); //下一行(gdb) n //下一行需求输入两个数字5 49 int sum = add(m , n); //履行到add函数方位
step单步
(gdb) sBreakpoint 2, add (a=5, b=4) at add.c:4 //单步调试刚好抵达第二个断点的方位4 return a+b;
打印变量的值
(gdb) p a // 打印a的值$1 = 5(gdb) p b //打印b的值$2 = 4
铲除断点
清楚指定行的断点,不加表明铲除一切的断点
(gdb) break 9 Breakpoint 5 at 0x40060b: file add.c, line 9. //加一个断点(gdb) cl 9Deleted breakpoint 5 //测验铲除
从断点处持续运转
(gdb) cContinuing.[Inferior 1 (process 8168) exited normally] //程序正常退出,调试结束
高档指令
gdb还有许多高档用法,如检查仓库列表,切割窗口等,这儿就不逐个测验了。
查询运转信息
where/bt:检查当时运转的仓库列表
up/down:改动仓库显现的深度
set args:参数:指定运转时的参数
show args:检查设置好的参数
info program: 来检查程序的是否在运转,进程号,被暂停的原因。
切割窗口
layout:用于切割窗口,能够一边检查代码,一边测验
layout src:显现源代码窗口
layout asm:显现反汇编窗口
layout regs:显现源代码/反汇编和CPU寄存器窗口
layout split:显现源代码和反汇编窗口
Ctrl + L:改写窗口
跋文
学习gdb调试只需求几分钟就能上手,可是用途超级大!!收获颇丰啊!这便是所谓的低投入高回报,还在等什么,赶忙举动吧。