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程序调试用法 {转}的更多相关文章

  1. Linux下使用GDB进行调试

    Linux下使用GDB进行调试的常用命令记于此. $ sudo su # g++ -g test.cpp -o test -pthread # gdb test         <------- ...

  2. Linux Bash命令关于程序调试详解

    转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...

  3. 针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案

    基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调 ...

  4. linux C(hello world)程序调试

    程序的调试(先得安装gdb工具,以root身份执行命令:sudo apt-get install gdb) 程序的调试是一个很重要的环节,windows IDE下那些强大的调试功能,Linux以什么来 ...

  5. 1、GDB程序调试

    GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具.一般来说GDB主要完成下面四个部分的功能. 1)启动你的程序,可以按照你的自定义的要求运行程序. 2)可让被调试程序在你所指定的调试的 ...

  6. 1-2 编程基础 GDB程序调试

    简介 GDB是GNU发布的一款功能强大的程序调试工具.GDB主要完成下面三个方面的功能: 1.启动被调试程序 2.让被调试的程序在指定的位置停住. 3.当程序被停住时,可以检查程序状态(如变量值). ...

  7. 嵌入式arm linux环境中gdb+gdbserver调试

    一.前言嵌入式Linux系统中,应用开发过程中,很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序.采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采 ...

  8. LINUX上使用GDB单步调试Chromium Android C++代码。

    ###动机###在LINUX使用GDB单步调试Chromium Android C++代码. [1]编译android平台Chromium, 修改GN文件中编译选项:-g -O0 使得编译优化更少,便 ...

  9. Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)

    在写程序的时候,经常会遇到一些问题,比如某些变量计算结果不是我们预期的那样,这时我们需要对程序进行调试.本文主要介绍调试C/C++在Linux操作系统下主要的调试工具. 在Linux下写程序,C/C+ ...

随机推荐

  1. 【日常训练】Hockey(CodeForces-96C)

    题意与分析 对于这题题意的理解比较重要,因为这是一条傻逼题: 大小写保持不变 原串中出现的非法字符串里的每一个字符都要替换 Lucky Letter越多越好 这样一种情况下,算法其实特别简单.我傻逼在 ...

  2. 管理项目中的贴图-Texture overview插件

    Texture overview插件管理项目中的贴图 1. Assetstore地址 2. 总览项目中所有贴图 3. 针对不同平台的贴图压缩设置 在插件的右上角 4. 支持多选批量修改 5. 点击表头 ...

  3. 一个很NB的404页面

    一个带彩蛋的 404 页面 不得不说这个程序猿很有才 前往404页面 触发方法 按住鼠标左键 在页面中心不停的画圈 就可以进入神奇的地方了

  4. ubuntu HackRF One相关环境搭建

    本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 HackRF链接:https://item.taobao.com/item.htm?spm=a1z10.1- ...

  5. Java non-javadoc

    Java注释 non-javadoc 表示该处没有自己的注释, @see javax.servlet.Servlet#init() 参考see后面的链接 /* * (non-javadoc) * @s ...

  6. 【Docker】第二篇 Docker镜像管理

    一.搜索镜像 1.下载一个docker镜像:我们可以通过登陆docker网站搜索自己需要的镜像,可以选择自己所需要的版本,然后通过详情也可以看到:网址:https://hub.docker.com/2 ...

  7. MySQL基础练习(二)

    第一个例子我们编写一个 SQL 查询,列出所有超过或等于5名学生的课. 先建表 CREATE TABLE courses( student ) NOT NULL, class ) NOT NULL ) ...

  8. CentOS 7 Docker基本特性

    Docker是一个开源的应用容器引擎,开发人员可以非常容易地打包已经开发好的应用,同时将应用相关的依赖包也打包到这样一个可移植的容器中,然后发布到任意的Linux主机系统上.Docker是基于Linu ...

  9. final发布视频展示博客

    Part One [探路者]选题展示视频链接: http://v.youku.com/v_show/id_XMzIxMDM2MTQ1Ng==.html?spm=a2h3j.8428770.341605 ...

  10. spring boot开启热部署

    步骤一:添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...