大家好,欢迎来到IT知识分享网。
参考文献:
[1]《嵌入式Linux教程(上册)》
[2] Linux下gdb的安装及使用入门
1、GDB介绍
GBD(the GNU Project Debugger)是GNU发布的一个功能强大的UNIX程序调试工具,可以调试C、C++、Pascal等多种语言程序,可以在大多数UNIX和Microsoft windows变种上运行。GDB既可以本地调试也可以远程调试。
通过GDB能够对程序进行如下调试:
- 运行程序,还可以给程序,还可以给程序加上某些参数,执行程序的行为;
- 使程序在特定的条件下运行;
- 检查程序停止时的运行状态;
- 改变程序的参数,以纠正程序中的错误。
2、GDB基本命令
如果要使用GDB调试,在编译时候需要加上-g参数(在末尾加),例如:
gcc -o gdbtest gdbtest.c -g
编译成功后,使用gdb进行调试,开启命令:
gdb gdbtest
在GDB的命令提示符之后,输入help,可以查看GDB的命令分类。
(gdb) help List of classes of commands: aliases -- Aliases of other commands breakpoints -- Making program stop at certain points data -- Examining data files -- Specifying and examining files internals -- Maintenance commands obscure -- Obscure features running -- Running the program stack -- Examining the stack status -- Status inquiries support -- Support facilities tracepoints -- Tracing of program execution without stopping the program user-defined -- User-defined commands
下表列出来GDB的一些基本命令:
命令 | 描述 |
break | 设置断点:break 要设置断点的行数 |
clear |
清除断点:clear 要清除断点的行数 |
delete | 用于清除断点和自动显示的表达式的命令 |
disable | 让所设断点暂时失效,如果要让多个编号处的断点失效,可将编号之间用空格隔开 |
enable | 与disable相对应 |
run |
运行调试程序 |
kill | 终止正在调试的程序 |
list | 列出产生执行文件源代码的一部分 |
next |
执行一行源代码但不进入函数内部 |
step | 执行一行源代码并进入行数内部 |
quit | 终止gdb调试 |
make |
在gdb中重新产生可执行文件 |
shell | 在gdb中执行UNIX Shell命令 |
watch | 监控一个变量而不管它的值何时改变 |
info break |
查看所有断点信息 |
info break n | 查看第n个断点的信息(n是第几个断点,而不是行数) |
print 变量名 | 查看变量的值 |
3、GDB调试范例
孰能生巧。略
4、GDB远程调试
关于如何远程调试,参考:嵌入式远程调试工具gdbserver
关于如何安装gdbserver,参考:linux应用调试技术之GDB和GDBServer
5、GDB图形前端DDD
DDD是一个简洁的GBD图形前端,可以在图形界面下进行GDB调试。如果系统没有DDD,可以输入一下命令进行安装
sudo apt-get install ddd
安装后,在终端输入ddd即可以启动DDD程序,其界面如下所示。
以一下代码为例 dbgtest.c:
#include <stdio.h> int main(){ int a,b; printf("please input two number:"); scanf("%d %d",&a,&b); int sum = a + b; printf("the sum is %d\n",sum); a = 10; }
step1:将需要调试的代码编译为可执行文件
gcc -o gdbtest gdbtest.c -g
step2:ddd gdbtest 装在可执行文件,进行调试
使用较为简单,略去….
断点命令:
break <source_file_name:line_num> 文件名:行号
break <function_name> 函数名
删除断点命令:
delete <break_point>,缩写d
delete 1 删除1号断点
查看堆栈命令:
backtrace,缩写bt(打印最内n层:bt n;最外n层:bt -n)
查看变量命令:p
p <para_name> 变量名 (可使用p直接修改变量值:p <para_name> ==xx)
查看所有的局部变量:info local
转到线程命令:thread <thread_number>
转到帧命令:frame <frame_number>
执行下一步命令:next,缩写n
继续运行直到下一个断点:continue,缩写c
进入子函数命令:step,缩写s
结束子函数返回到调用函数命令:finish,缩写f
结束循环命令:until,缩写u
监控变量:watch
watch expr:GDB在expr被程序写及其值改变停止;
rwatch expr:在expr被程序读时停止;
awatch expr:GDB在expr被程序读和写时停止;
查看所有断点信息:
info break
查看第n个断点的信息:
info break n
查看变量的值:print/f exp exp 是表达式
print 变量名
printf可以指定打印时候的表达式
查看内存地址:examine,缩写x
x/<n/f/u> <addr>
举例:x/10wx addr 查看10个4字节按16进制输出
x/10i addr 查看该地值的10条指令
显示所有thread线程(*号代表当前线程)
info thread
gdb现场切换到对应线程
thread thread_num
让一个或者多个线程执行gdb命令command
thread apply ID1 ID2 command
让所有被调试线程执行GDB命令command
thread apply all command
只给thread_num这个线程的xxx函数打断点
b xxx thread thread_num
set scheduler-locking off|on|step
off不锁定任何线程,也就是所有线程都执行,这是默认值
on只有当前被调试的程序会执行
step:其他线程不会执行,但是用其他命令(比如“next”)调试线程的时候,其他线程也许会执行‘
查看所有线程的调用栈(常用)
thread apply all bt
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/153133.html