嵌入式LINUX调试器GDB

来源:互联网 发布:知耻而后勇 编辑:程序博客网 时间:2024/03/29 18:55


一.调试器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 (不出现调试信息)


0 0
原创粉丝点击