嵌入式LINUX调试器GDB

2019-07-12 19:43发布


一.调试器gdb简介(功能) gdb是GNU发布的一款功能强大的程序调试工具。 功能:启动被调试程序;       让被调试的程序在指定的位置停住(设置断点);       当程序被停住时,可以检查程序状态。 二.调试器gdb的使用 1. gcc –gdemo.c –o demo gdb demo 2. run  启动被调试程序 list 显示程序内容 gdb中通过list命令查看源码。list每次显示的函数可以指定,下文中假定指定显示的行数为10行。 1)  listlinenum: 以linenum指定的行号为中心,显示10行 2)  listfunction: 以指定的函数为中心,显示10行 3)  list: 重复上一次的list指令,也可以直接按回车键,重复上次指令。 4)  setlistsize count: 设置每次显示的行数。 show listsize: 显示已设置的显示行数。 5)  listlinespec: 设定显示的文件,list指令都是以指定的文件为域来显示源文件,这个指令可以指定要显示的原文件。     例:list_test.c     以后的list指令都是显示,list_test.c 的源文件。 6)  listfirst,last: 显示指定起始行到结束结束行的源文件。 例:list10,100 7)  list,last: 显示以指定的last为结束行,显示10行。      例:list ,30  显示21~30行,共显示10行 8)  listfirst: 以first为第一行,显示10行。 9)  list +:以上次显示的结束行为起始行显示后10行 10) list –:以上次显示的起始行为结束行,显示前10行
3. break20  在20行设置断点 break 20 if i=10  在i=10时停住 break add_sum  在调用函数时停住 info break 查看断点信息 delete 1 删除断点(1为断点编号Num Type) 4. print  i  检查程序状态 5. next  不会进入子函数 step 可进入子函数 6. continue  在下一个断点处停住 finish   当前函数结束时停住 7. quit  退出 break 20 run next 三.调试器gdb调试段错误 段错误:内存错误 产生段错误的原因: 程序运行过程中能访问到的内存空间主要有栈和堆。栈存放函数的本地变量,堆是程序运行过程中能自由分配和使用的内存空间。产生段错误和栈、堆的访问密切相关。  产生段错误的原因主要有: · 解引用空指针 · 访问不可访问的内存空间(如内核空间) · 访问不存在的内存地址 · 试图写一个只读内存空间(如代码段) · 栈溢出(函数递归调用) · 使用未初始化的指针(定义时没有初始化或者已经回收) 避免段错误: · 定义指针后初始化 · 数组下标是否越界 · 在堆上分配空间是否足够(内存限制) · 变量处理时格式控制是否合理 调试段错误: 在代码的每一行下加printf检查段错误发生的位置 gcc –g demo.c gdb a.out run //停在段错误处
测试代码模板:     测试版release:gcc demo.c–D__DEBUG__ (出现调试信息)       发行版debug:gcc demo.c (不出现调试信息)