一、调试-使用gdb调试linuxC程序
2018-08-13 本文已影响0人
zhile_doing
- gdb是linux操作系统特有的调试工具,可以完成一般IDE提供的所有调试功能。使用gdb调试程序之前,必须使用gcc的-g选项编译程序,使生成的可执行文件中附带有源代码文件的信息。
- 编写例程如下,随后使用gdb调试该程序
#include<stdio.h> int add_range(int min, int max){ int sum ; for(int i = min; i < max + 1 ; i++){ sum = sum + i; } return sum; } int main(){ int range[5]; range[0] = add_range(1, 10); range[1] = add_range(1, 100); printf("range[0]=%d\n", range[0]); printf("range[1]=%d\n", range[1]); return 0; }
gdb exec_name进入调试界面,使用help查看当前可用的命令种类
使用l(list)查看源代码,一次10行,当我们在gdb中直接回车,默认执行上次命令
使用start命令开始执行程序,程序停留在main函数第一行
n(next)可以单步执行程序,s(step)命令可以跳入函数中查看函数执行的细节
使用bt(backtrace)命令查看程序栈帧,可以在不同栈帧中切换来查看不同环境的变量值。使用i(info)查看变量值
切换至main堆栈,查看main函数中本地变量的值
p(print)打印某变量的值
display可以现实每步程序运行之后某变量的值
如果不再需要display的结果,可以使用undisplay取消显示
finish使当前函数运行至return返回
在程序中,如果发现某变量赋值不当,可以直接在调试中更改该变量的值,查看程序运行结果set var name=value
初步调试指令如下
backtrace\finish\frame\info\list\next\print\set var\start\step - 断点
编写例程如下#include<stdio.h> #include<string.h> int main(){ char num[10]; int sum = 0; while(1){ scanf("%s", num); long sum = 0; if(strcmp(num, "q") == 0){ break; } for( int i = 0; i< strlen(num); i++ ){ sum = sum*10 + num[i] - '0'; } printf("sum=%d\n", sum); } return 0; }
使用gdb调试程序,break命令在某行设置一个断点
break后不仅可以跟行号,还可以跟函数名称,使用continue命令继续执行程序,遇到断点自动停止。使用disable breakpoints num可以暂时禁用某个断点
可以使用delete breakpoints num删除断点,使用break(b)查看当前断点分布
断点调试常用指令
break n\break function_name\break ... if ...\continue\ delete breakpoints num\disable breakpoints num\enable num\run\ -
观察点
观察点可以让我们监视某个内存单元,当单元的内容改变时,提示我们它发生了那些变化,常用在程序某个变量发生改变,但我们又不知道它何时发生了改变的情况
使用watch设置观察点,查看某个变量的变化情况
使用info watchpoints查看当前观察点
x命令用来打印内存空间的值,b表示按字节,5表示打印5组
-
使用gdb的backtrace指令可以让我们容易发现段错误由何引起