我们首先来学习下几个我们接下来学习的几个重要的工具
gdb:
UNIX及UNIX-like下的调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。
一个小例子:
/************************************************************************* > File Name: test_gdb.c > Author: > Mail: > Created Time: 2016年06月04日 星期六 20时26分58秒 ************************************************************************/ #include<stdio.h> #include<stdlib.h> static char buf[256]; static char *string; int main(){ printf("please enter something\n"); gets(string); printf("the string is %s\n",string); }
我们以这个例子来复习小结下GDB 的使用 首先编译: 我的编译以及调试环境: 开始编译:
gcc test_gdb.c -o test_gdb -g
几个简单命令: start : 开始单步调试 break : 断点设置 info break : 断点信息 run :运行调试程序 step : 单步执行程序,不会直接执行函数 next : 单步执行函数 backtrace/bt : 显示函数调用栈帧 continue/c : 继续执行调试程序 display : 显示表达式的结果,表达式由程序中的变量组成。 info files : 显示被调试文件的信息 info func : 显示被调用的程序的所有函数信息 info prog : 显示被调用程序的执行状态 info var : 显示被调试程序的所有全局和静态变量 kill : 结束被调试程序的程序 list : 显示被调用程序的源代码 quit : 退出GDB where : 程序出错的地方 layout 显示调试模式: layout src :进入调试模式,就像这样: info win :显示大小 layout next:切换下一个布局模式 layout src/asm/split :显示源代码/汇编代码/一起显示 layout regs :增加寄存器显示 focus cmd /src/asm/regs/next/prev : 切换当前窗口 refresh : 刷新当前窗口 tui reg next :显示下一组寄存器 tui reg system: 显示系统寄存器 update : 更新源代码窗口和当前执行点 winheight name +/- line :调整高度 建议先在传统模式下使用start 开始调试再进入layout 模式 marco : 查看宏定义 需要加- g3参数 set print pretty : 打印结构体 gdb -p <pid> : 调试进程号 shell 命令行:执行shell命令行 set args 参数:指定运行时的参数 show args:查看设置好的参数 info program: 来查看程序的是否在运行,进程号,被暂停的原因。 // 打印寄存器数组, info reg, 简写 i reg clear 行号n:清除第n行的断点 delete 断点号n:删除第n个断点 disable 断点号n:暂停第n个断点 enable 断点号n:开启第n个断点 cgdb: cgdb 是gdb 的终端界面增强版本。看到了吗?这个是彩色的。 cgdb分为上下两栏,上面类似于vi窗口(就称之为vi窗口吧)显示对应的代码,下面gdb窗口进行调试操作,上下窗口连动,也就是说vi窗口里显示的代码会跟随gdb窗口里调试的位置同步进退。 按esc键可让输入焦点进入到vi窗口,再按i键回到gdb窗口。按其它键也可以进入到vi窗口,比如小键盘上的按键(如果此时Num Lock处于打开状态)。 vi窗口可进行的操作包括,上下左右翻动,按冒号(:)开始进行设置(具体设置命令可以参考这里),比如设置上面窗口全屏显示(即下面的gdb窗口被隐藏),按斜干(/)为在当前文件内搜索,按o键可以显示当前程序关联的文件列表,按空格则在当前位置设置/取消断点 ESC:切换焦点到源码模式,在该界面中可以使用vi的常用命令 i:切换焦点到gdb模式 o:打开文件对话框,选择要显示的代码文件,按ESC取消 空格:在当前行设置一个断点