C++编程 (二)--- GDB使用指南
来源:互联网 发布:初音未来mmd动作数据 编辑:程序博客网 时间:2024/06/05 15:23
GDB是linux下命令行程序调试的工具,这也为程序开发和调试带来了极大的便利。使用命令行的优势在于,它们可以很方便的集成在一起,使用几个简单的已有工具,就可以做出强大的功能。图形化界面和命令行可谓是尺有所短寸有所长吧,如果你习惯命令行操作,并且对命令熟知的话,使用GDB调试是十分高效的。
一般来说GDB主要帮你完成如下四个方面的功能:
1. 启动你的程序,可以按照你的自定义要求随心所欲的运行程序。
2. 让被调试的程序在断点处挺住。(断点可以是表达式)
3. 程序被停住的时候,可以检查此时程序发生的事情。
4. 动态改变你的 程序的执行环境。
本文主要介绍了GDB调试文件时的:
一、 执行程序,启动GDB
二、显示数据、数据操作
三、断点---断点的创建和断点的管理。
四、执行控制
五、对多线程程序进行调试
六、命令接口
七、信号
八、
一、执行程序,启动GDB:
1. 启动GDB:
(1) 先启动gdb:
file filaname #制定调试程序的源代码和符号表
attach <进程PID> #关联gdb到正在运行的进程。操作系统必须支持,而且你需要有向进程发送信号的权力。
detach #取消关联进程
set args <命令行参数> #设置GDB执行参数
(2) 动态调试:
gdb <可执行文件名> <core文件> # gdb调试core文件
gdb <可执行文件> <进程POID> # 调试制定进程。这条命令会把进程ID为1234的进程地址空间附着在gdb的地址空间中,然后这个进程在gdb的环境下执行,这样的话gdb就可以了解进程的执行情况、堆栈和内存使用情况等等。
ulimit -c unlimited/ ulimit -c 0 # 打开/关闭core文件开关。 /etc/profile有设置
二、显示数据:
1. 显示数据:
(1) print:
print p #显示变量p的值
print find_entry(1,0) #制定参数调用fine_entry函数。
print $1 #$1为记录历史记录变量,以后可以直接使用$1的值。
print h@10 #例如base @length为调用动态数据 ,而print h@10为要显示h后面的10个元素的数值。
(2)变量类型查看
whatis p #显示变量p的类型
ptype #比whatis更强,可以提供一个结构的定义。
(3) 变量的检查和赋值
set variable #修改变量的数值
ptype #比whatis更强,可以提供一个结构的定义。
(4) 显示被调用程序的执行信息
info files #显示被调用程序的详细信息。
info func #显示所有函数名称。
info prog #显示被调用程序的执行状态。
info var #显示所有全局变量和静态变量名称。
display #程序执行停止时,变量和表达式的值。
info stack #显示所有全局变量和静态变量名称。
info frame #显示帧摘要信息。
info breakpoints #显示所有断点信息。
(5) 显示程序代码信息
list/1 line_num #显示程序上下文代码。显示从line_num开始的后面几行源代码
reverse-search #源文件中反向正则表达式。
bt/backtrace #显示程序中当前位置和如何到达当前位置的栈跟踪。
info var #显示所有全局变量和静态变量名称。
三、断点:
1. 设置普通断点:
break FUNCTION #在函数function处设置断点。当使用允许函数重载的语言(如:C++)时,有可能同时在几个重载的函数上设置了断点;
break +OFFSET或break -OFFSET #运行时结束到文件前几行或者文件后几行。
break LINENUM #在行号为LINENUM的行上增加断点。
break FILENAME:LINENUM #在FILANAME的源文件中名为FUNCTION的函数上设置断点。
break *address #在地址ADDRESS上设置断点,这允许你在没有调试信息的程序里设置断点。
break #在当前程序的运行栈中的下一条指令上设置一个断点。栈底除外。和finish类是,但是finish不设置断点。
2. 条件断点:
break if condition #在条件满足时,触发断点。
break ARGS #只有效一次。
break LINENUM #在行号为LINENUM的行上增加断点。
3. 删除断点:
clear #清除当前所选择的栈上下一个所有执行到的断点。
clear FUNCTION/ FILANAME:LINENUM #只有效一次。
clear LINENUM/ clear FILENUM:LINENUM #清除固定行的断点。
4. 设置断点生效/失效:
(1) break:
enable breakpoints [BNUMS] #使断点生效。
disable breakpoints [BNUMS] #使断点失效。
enable breakpoints once [BNUMS] #使断点仅生效一次。
enable breakpoints [BNUMS] #使断点生效一次后,自动被删除。
5. 设置观察点:
可以使用一个观察点来停止一个程序的执行,当某个表达式的值发生改变的时候,观察点将会停止程序。而不需要事先在某个地方设置一个断点。特别在程序不知道什么时候出问题,定位的时候很有用的。
watch EXPR #使断点生效。
rwatch EXPR #当EXPR被程序读取的时候,程序被gdb暂停
awatch EXPR #当EXPR被读出,然后被写入时,gdb会暂停这个程序,这个命令常和rwatch合用的。
info watchpoints #显示所有设置的观察点列表。
四、gdb执行控制:
continue/c #继续运行被中断的程序。
next/n #继续执行下一行代码。
step/s #继续单步调试,它可以进入函数内部,跟踪函数内部执行情况。
frame/f <STACK_FRAME_NO/ADDRESS> #选择一个帧,并打印栈帧内容的摘要信息。
run #在gdb中启动并运行程序
help <command> #显示command的详细用法
help #在gdb提示符处输入,help将列出命令的分类。主要有: aliases:命令别名。 breakpoint: 断点定义 data:数据查看:files: 指定并查看文件;internals: 维护命令;running: 程序执行;statu: 状态查看;tracepoints: 跟踪程序执行。
五、对多线程程序的调试:
thread THREAD_NO #该命令在线程间切换,把THREAD_NO线程设置为当前线程
info threads #显示当前进程所有线程状态摘要信息。gdb按顺序显示 a. 线程号 b. 目标系统的线程标识
thread apply [THREAD_NO][ALL] ARGS #该命令用于向线程提供命令。
set scheduler-locking on/off #打开/关闭线程锁
show scheduler-locking #查看线程调度锁的状态 on只有调度线程会执行,off所有线程都会执行。
另外,无论gdb何时中断了你的程序(因为一个断点或者信号),gdb都会自动选择信号或断点发生的线程作为当前线程。info threads显示时,当前线程的前面带有一个星号'*'。
六、命令接口
show paths #显示当前路径变量的设置情况。
show environment/env #显示程序环境变量的值。
set/unset environment/env VARNAME=VALUE #设置/删除某个环境变量的值
七、信号
gdb通常可以捕获到发送给它的大多数信号,通过捕获信号它可以决定对于正在运行的进程要做什么工作。
handle命令可以控制信号的处理,它有两个参数,一个是信号名,另外一个是接收信号时该做什么。几个可能的参数是:
a. nostop 接收信号时,不要发送给程序,也不要停止程序。
b. stop 接收信号时,不要将它发送给程序,也不要停止程序。
c. print 接收信号时,显示一条信息。
d. noprint 接收信号时,不要显示信息。(而且隐含着不要停止程序执行)
e. pass 将信号发送给程序,从而允许你的程序控制它、停止运行或采取别的动作。
f. nopass 停止程序的运行,但不要将信号发送给程序
例如:
handle SIGPIPE stop print #截获SIGPIPE信号,防止正在调试的程序接受到该信号
signal 2 #假定你的程序把Ctrl+c或者信号2,当作某个清理动作,可以发送如下处理程序。该程序继续执行,但会传出该信号。
另外还可以使用dmesg查看内核调用缓冲区的情况
参考文献:
1. GDB使用指南 http://www.cnblogs.com/whiteyun/archive/2009/11/27/1611808.html
2. GDB使用指南2: http://www.cnblogs.com/whiteyun/archive/2011/10/17/2215532.html
- C++编程 (二)--- GDB使用指南
- linux C编程之二[GDB调试]
- gdb的使用指南(上)
- gdb的使用指南(下)
- GDB使用指南
- gdb使用指南
- gdb使用指南
- GDB使用指南
- gdb使用指南
- GDB使用指南
- gdb使用指南
- Linux C编程----3(gdb调试)
- Junit使用指南(二)
- Shiro使用指南(二)
- Vue使用指南(二)
- Sqlmap使用指南(二)
- Gson使用指南(二)
- GDB(二):启动GDB
- LeetCode-The Skyline Problem-解题报告
- 在Hbase Endpoint Coprocessor中使用coprocessorProxy操作例子与问题解析
- 《Java程序设计》第16周周五:数据库连接 与 随机数的使用&&《Java课程实习》日志(周一)
- 【读书笔记:C++ primer plus 第六版 中文版】第12章 类和动态内存分配
- Qt之QTextCodec乱谈
- C++编程 (二)--- GDB使用指南
- java通信socket实现
- 2015062902 - 为何盗墓等会火呢?
- [深入Python]__new__和__init__
- 工作效率提升也是一种提升。......
- Android一些关键函数和类的分析-startActivity
- [Python] Python 之 __new__() 方法与实例化
- sql 面试题目
- BZOJ2763 [JLOI2011]飞行路线(分层图最短路)