linux gdb基本概念
GDB是一个功能强大的调试器,它是一个自由软件,能够用在许多UNIX平台上。它同时也是Linux系统中的默认调试器。GDB已被移植到许多其他的计算机平台上,并且能够用于调试嵌入式实时系统。一般来说,GDB主要可以帮助我们完成以下四个方面的功能: 1, 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2,可以让被调试的程序在你所指定的断点处停住。 3, 当程序被停住时,可以检查此时你的程序中所发生的事情。 4, 动态的改变你程序的执行环境。 与图形化的调试工具相比,GDB具有如下优点: GDB的启动速度比GUI快很多,当只需要快速检查代码中的某项内容时,这就是一 个很重要的优点。在与Eclipse比较时,这种启动时间上的差距很大。
下面我在自己虚拟机上的一个进程拷贝的代码进行的实验
gcc main.c -g -o app
gdb app
之后我们就可以使用gdb进行调试了
run全速执行,start开始执行,这两个命令如果有命令行参数的话最好加上(建议)
启动界面
start直接执行到了67行
list:可以查看代码
list+num可以指明查看哪一行代码
听过break可以打断点,info breakpoints可以查看我们用了哪些断点,delete breakpoints可以取消断点,这里我们需要注意一个问题就是,在virtual studio中的断点,如果关闭了下次打开仍然存在,但是这里如果关闭了下次就不会存在了
相对应的,vs中有监禁的功能,就是监视变量,display就有这个功能,info display可以查看我们监视了哪些变量,之后我们每次next和step的时候,都会在最后几行显示监视的变量,delete就是删除了
step就是按语句调式,next就是按照过程调式
set var 变量名=值 可以中途改变变量的值,
printf可以中间输出变量的值
backtrace( bt )显示程序的层次关闭,与函数调用栈帧,下面75行到26行跳到了另外一个函数,这样可以使用backtrace就可以看层次关系,两个函数使用不同的栈,所以我们使用print argc的时候不好使,我们可以通过frame临时跳到main中,
在一盒函数中我们使用finish可以挑战到调用的开始位置
x(x/20wx)可一查看内存,20表示查看20字节,w表示word,x表示十六进制
continue 如果使用断点的话我们使用continue可以按照断电进行
set follow-fork-mode (child or parent) 调用父进程子进程
core启用core文件,帮助调试
在编译运行app的时候,如果有问题,会生成一个core文件通过gdb core会直接发现错误,这种方法非常方便,但是core的文件特别大
quit退出调试