Linux gcc和gdb程序调试用法 {转}
gcc一般调试格式:
gcc -Wall -o test test.c // -wall 显示程序错误详细信息
gcc -v // 显示gcc的版本
gcc -o{1,2,3} test test.c // 1,2,3三个级别的优化,优化级别越高编译的时间越长
gcc -ggdb3 -Wall -o test test.c // 运用gdb可以跟踪调试程序,运行这命令gdb告诉gcc,使用gdb扩展产生调试,其中3表示使用的第三级调试信息,程序员可以获得更多的信息。
如果程序有多个模块构成可以分别编译,然后再整体生成一个可执行的文件
gcc -c test1.c //产生test1.o
gcc -c test2.c //生成test2.o
gcc -c test3.c //生成test3.o
gcc -o program test1.o test2.o test3.o //生成program 最终可执行文件
关于gcc先这么多,以后用到,再补充。
gdb 符号调试器
gdb主要提供以下功能:
1. 监视程序中变量的值得变化
2. 设置断点,使程序在指定的代码行上暂停执行,便于观察
3. 单步执行代码
4. 分析崩溃程序产生core文件
是首先 gcc -ggdb3 -Wall -o test test.c 调试程序
./test 就是正常的执行程序
如果出现了不正确的结果,再用gdb调试
gdb test
出现(gdb)接口提示符
run //开始运行程序,设置断点在开始运行之前,其他的命令都在运行程序下执行
step | s //单步执行,遇见函数就进入函数
next | n //单步执行,但不进入函数
quit | q //退出gdb
break LineNumber| functionName
continue | cont N // 表示跳过的断点数
tbreak LineNumber| functionName // 这只一个临时的断电,执行一次就自动删除
enable / disable 断点编号 // 回复失效的断点| 使有效的断点失效(如果操作多个断点,中间用空格分开)
clear 断点的行号
delete 断点的编号 clear/delete 都是清楚断点的,变量不一样啊
watch 逻辑表达式 // 此命令在程序run中运用,必须把main函数设置为断点,然后continue,程序停止在满足逻辑表达式地方。
查看栈的信息
bt number //如果number>0 表示显示栈顶上number数栈的信息
//若果number<0 表示显示栈底上number数栈的信息
//省略则显示栈的全部信息
frame | f n // 显示第n层栈的信息 栈顶是0,一次类推
up <n> // 栈向上移n层 省略默认一层
down <n> // 栈向下移nceng 省略默认一层
select-frame <n> == frame //只是不输出栈的信息
up-silently <n> == up //只是不输出栈的信息
down-silently <n> == down //只是不输出栈的信息
info args //显示当前函数参数名及值
info locals //显示函数中所有局部变量
info catch //显示当先函数的异常处理信息
显示源代码
list <function> //显示function函数的源程序
list // 显示当前行前后各显示listsize/2 行代码
list - // 显示当前行 前面的代码
list + // 显示当前行 后面的代码
set listsize <number> // 设置一次显示源代码的行数
show listsize //查看listsize的数值
list <first>,<last> //显示全部的源代码
list ,<last> // 显示从当前行到last的源代码
list <linenum> // 显示linenum行前后各显示listsize/2 行代码
list <+ ffset> // 显示当前行的正偏移量
list <- ffset> //显示当前行的负偏移量
搜索源代码
forward-search <regexp> = search <regexp> // 向下搜索
reverse-search <regexp> // 向上搜索
directory <dirname:...> // 增加自定义文件搜索路径,多个路径用:隔开
directory // 清除所有自定义源文件搜索路径信息
show directories //显示自定义源文件的搜索路径
源代码的内存
info line 查看源代码在内存中的地址。info line 后面可以跟“行号”、“函数名”、“文件名:行号”、“文件名:函数名”
disassemble <> // 后面的参数加的和上面的一样,显示汇编代码
查看运行时的数据
print variable
print file::variable | function::variable // 如果查看的是全局变量的,为了防止和局部变量重名,可以加上通过这个形式说明
print *array@len //显示动态数组
print *array // 显示静态数组
print /<f> <expr> // 格式输出数据
输出格式如下:
x 十六进制显示
d 十进制显示
u 十六进制显示无符号整数
o 八进制显示
t 二进制显示
a 十六进制显示
c 字符格式显示
f 浮点数格式显示
查看内存
x/<n/f/u> <addr> // 其中n表示显示的第三个参数的个数,f格式见上面,u从当前地址往后请求的字节数,默认为4,b代表单字节,h代表双字节,w代表4字节,g表示8字节
自动显示
display <expr> //只要变量有效的范围内都会显示
undisplay | delete display <dnums...> // 删除编号为dnums的自动显示,同时删除好几个用空格隔开
disable display <dnums...> // 使编号为dnums的自动显示失效,多个的也是空格隔开
enable display <dnums...> //使编号为dnum的自动显示回复,多个也是用空格隔开
info display // 显示全部自动显示的信息
设置显示选项
set print address on //gdb一般会显示参数的地址信息 ,默认认为打开
set print address off //gdb一般不显示参数的地址信息
show print address //查看是否未打开
set print array on // 打开数组的每个元素占一行
set print array off // 关闭数组的每个元素以逗号隔开
show print array //查看是否打开
set print element <number-of-elements> // 显示数组最大的长度
show print element
set print null-stop <on/off> // 是否遇到结束符停止显示,默认是关闭的
set print pretyy on // 结构体显示比较漂亮
show print pretyy // 查看如何显示结构体
set print sevenbit-strings // 字符显示是否打开
set print union <on/off> //是指显示结构体时候是否显示其内的联合体数据
show print union
set print object <on/off> //在c++,当一个对象指向派生类,打开这个选项,gdb会自动按虚方法调用的规则显示
set print static-members <on/off> // C++对象中,是否显示其中静态数据成员,默认on
show print static-members
set print vtbl <on/off> // gdb会比较规整格式显示虚函数,默认关闭
show pritn vtbl
查看寄存器
info registers // 查看寄存器的情况(除了浮点寄存器)
info all-registers //查看所有寄存器的情况(包括浮点寄存器)
info registers <regname...> //查看制定寄存器的情况
gdb环境变量
//你可以环境调试中定义自己的变量,用来保存调试程序中的运行数据。
set $var = expr
show convenience // 查看当前设置的所有环境变量
ex > set $i=0
print bar[$i++] -> contents // 输入这样的命令后,只需按Enter,重复上一条语句,环境变量会自动累加
修改变量值
print s = expr | set var s = expr // 最好使用后者
跳转执行
jump <linenumber> //跳转到linenumber行
jump <address> // 跳转到地址为address处
jump <+offse> // 向下跳offse行
//使用jump命令最好在当前的函数的跳转,跨越函数跳转会发生错误
signal <singal> // 信号量在1到15
return
return <expr>
//强制返回,返回可以带返回值
call <func> // 强制调用函数
不同的语言使用gdb
show language // 查看当前的语言环境
info frame // 查看当前函数的程序语言
info source // 查看当前文件的程序语言
set language +语言名字 // 手动设置语言 // c/c++/asm/fortran/java/modula-2/pascal/scheme
core dump 分析
ulimit -c unlimited // 是自己拥有使用core dump 的权限
gdb test core+xxx // 系统防止本次生成core覆盖上次的,所有core后面加上pid号加以区分
Linux gcc和gdb程序调试用法 {转}的更多相关文章
- Linux下使用GDB进行调试
Linux下使用GDB进行调试的常用命令记于此. $ sudo su # g++ -g test.cpp -o test -pthread # gdb test <------- ...
- Linux Bash命令关于程序调试详解
转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...
- 针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案
基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调 ...
- linux C(hello world)程序调试
程序的调试(先得安装gdb工具,以root身份执行命令:sudo apt-get install gdb) 程序的调试是一个很重要的环节,windows IDE下那些强大的调试功能,Linux以什么来 ...
- 1、GDB程序调试
GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具.一般来说GDB主要完成下面四个部分的功能. 1)启动你的程序,可以按照你的自定义的要求运行程序. 2)可让被调试程序在你所指定的调试的 ...
- 1-2 编程基础 GDB程序调试
简介 GDB是GNU发布的一款功能强大的程序调试工具.GDB主要完成下面三个方面的功能: 1.启动被调试程序 2.让被调试的程序在指定的位置停住. 3.当程序被停住时,可以检查程序状态(如变量值). ...
- 嵌入式arm linux环境中gdb+gdbserver调试
一.前言嵌入式Linux系统中,应用开发过程中,很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序.采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采 ...
- LINUX上使用GDB单步调试Chromium Android C++代码。
###动机###在LINUX使用GDB单步调试Chromium Android C++代码. [1]编译android平台Chromium, 修改GN文件中编译选项:-g -O0 使得编译优化更少,便 ...
- Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)
在写程序的时候,经常会遇到一些问题,比如某些变量计算结果不是我们预期的那样,这时我们需要对程序进行调试.本文主要介绍调试C/C++在Linux操作系统下主要的调试工具. 在Linux下写程序,C/C+ ...
随机推荐
- Bitcoin区块链攻击方式
目录 重放攻击-- 非人为攻击 其他攻击 重放攻击-- 非人为攻击 重放攻击 Replay Attach 攻击者重复发送相同的数据库包到目的主机,用以欺骗系统 用支付宝付款信息重复项商家索取商品 比特 ...
- jmeter功能按钮介绍
Jmeter本来是做性能测试的,所以有很多监听器都是针对性能的,随后边的不断发展,可以应用到接口自动化等测试工作上. 面板的文件菜单中一般都是打开.保存.新建测试的,如下图: 保存时可以直接ctrl+ ...
- 我的第一个上线小程序,案例实战篇二——LayaAir游戏开始界面开发
不知不觉我的第一个小程序已经上线一周了,uv也稳定的上升着. 很多人说我的小程序没啥用,我默默一笑,心里说:“它一直敦促我学习,敦促我进步”.我的以一个小程序初衷是经验分享,目前先把经验分享到博客园, ...
- Controller组件- 集合点的功能-loadrunner
1.添加集合点功能的做法 ,注意在开始事务前加,不然就会把等待时间也加进去. 2.Controller 中也要开启集合点的功能,才能使用
- zabbix切换中文,监控图下方显示乱码,监控图X轴不显示时间问题解决(适用于所有版本)
一.现象: abbix3.4安装好后添加zabbix图形,发现有好多方块 这是因为zabbix web程序缺少中文字体 二.解决方案1: 1.在windows系统找一个中文字体上传到服务器中,我这里找 ...
- docker 从本地拷贝文件
1.找到docker的ID全称 docker inspect -f '{{.Id}}' docker_name 2.执行拷贝命令 docker cp 本地文件路径 ID全称:docker路径 3.如果 ...
- LAXCUS大数据操作系统3.03版本发布,欢迎使用试用
LAXCUS大数据操作系统3.03正式发布,欢迎下载使用试用.LAXCUS大数据操作系统,集成虚拟化.大数据.数据库.容器.中间件的多集群多用户多任务全栈通用系统软件,运行.开发.维护管理为一体的平台 ...
- 微信JS-SDK实现上传图片功能
最近在项目开发中,有一个在微信WEB项目中上传图片的需求,一开始使用了传统的<input type="file">的方式去实现,但是后面发现在使用这种传统模式时会由于手 ...
- XSS构造技巧
利用字符编码: 百度曾经出过一个XSS漏洞,在一个<script>标签中输出一个变量,其中转义了双引号: var redirectUrl="\";alert(/XSS/ ...
- shell之arp命令
arp: 显示所有的表项. arp -d address: 删除一个arp表项. arp -s address hw_addr: 设置一个arp表项. 常用参数: -a 使用bsd形式输出.(没有 ...