使用GDB调试程序,代码与实例

  • GCC与Makefile
  • gdb调试

GCC与Makefile

gcc方面的资料网上一大堆, 一般情况下,常用的参数有:

-S 编译为汇编代码
-c 编译为目标文件,不连接库
-E 只进行预处理
-o 指定输出文件的文件名
还有一个-g的命令:指示编译程序在目标代码中加入供调试程序gdb使用的附加信息。在使用gdb调试的时候加上这个选项。


有很多工具可以用来帮助我们生成Makefile。最出名的就是GNU的autoconf,GNU程序的编写,需要autoscan, aclocal, autoconf, automake这四个工具。GNU软件安装的三步曲是:./configure, make, make install。其中./configure就是根据autoconf, alocal等工具生成一个makefile文件。make指令就是调用make指令来根据makefile文件的规则来编译源程序。而make install就是执行makefile中的install规则指出的操作(一般是copy操作)。而make clean就是执行makefile中的clean规则指出的操作(一般是rm操作)。如果想编译出跨平台的C++程序,那么makefile是一种最方便的机制。

gdb调试

Windows下有多种IDE可以用来调试程序,Linux开发工具是多个独立的小工具,各自处理不同的问题,但是功能依然强大,常用gdb、cgdb、ddd等。

gdb调试时常用到的几个选项:

list 显示源文件:

list 没有参数,显示当前行之后或周围的10多行
list start,end 显示从行号start到end之间的代码行。

print 查看运行时的数据

print i 显示当前变量i的值
print &i 显示变量i的存放地址
print array@5 显示从array(数组名)开始的5个值
print array[2]@3 显示从array第二个元素开始的3个数组元素的值
whatis i 显示变量i的数据类型

设置断点 break

break linenum 在当前文件指定行linenum处设置断点
break function 在当前文件函数function的入口处设置断点

显示断点 info

info breakpoints/break/watchpoints [num]

单步跟踪

step [N] 如果遇到函数调用,并且该函数编译时有调试信息,则会进入该函数内执行。
next [N] 遇到函数调用时,执行整个函数。
连续执行 continue 从当前行开始,连续执行到下一个断点处,或者到达该程序结束。命令中可以给出一个数字N,忽略其后N-1次断点

运行程序 run

此外还有,clear(清除所有已定义的断点),delete(删除所有断点,后面可给出断点号码,多个断点用空格分开),disable(停用指定断点,停用多个则用空格分开),enable(激活被停用的断点,各断点号码用空格分开).
一个简单的例子:

#include   
  int main()  
  {  
      int a=0;  
      int i=0;
          for(i=0; i<10; i++)  {
              a+=i; 
          }
    return 0;
   } 

编译:

gcc -g -o main main.c

调试:gdb main
使用GDB调试程序,代码与实例_第1张图片

使用GDB调试程序,代码与实例_第2张图片

设置断点:
这里写图片描述
单步运行:
这里写图片描述

watch a

使用观察点后,每次被观察的变量发生变化,程序都会暂停。
这里写图片描述

此外,还可以设置捕捉点,信号,线程停止。


对于STL中的List、Vector的观察需要设置gdb,例如对于D*路径规划的简单例子的调试,变量mypath是list(state)类型,对它的观察要用:

plist mypath

提供一个设置文件(来自网络)gdbinit.txt
下载该文件到用户目录下,执行:

> mv gdbinit.txt .gdbinit

然后可以调试D*测试程序:
使用GDB调试程序,代码与实例_第3张图片
使用GDB调试程序,代码与实例_第4张图片

你可能感兴趣的:(程序设计,robotics,linux)