浅析gdb的-g选项


 

准备

  gdb是Linux下学习C/C++最常用的debug工具。要使用这一强大工具,必须在编译时加上-g选项,生成的目标文件才可以用gdb进行调试。 
如,先创建一个test.c文件,内容为:

 #include <stdio.h>

 int main(void){
int a[];
a[] = ;
a[] = ;
return ;
}

  使用编译语句,进行编译:

gcc -g test.c -o test.out

浅析-g选项

  -g选项的作用就是在编译生成的目标文件中加入源码信息。例如,把目标文件中的机器指令与源代码的行数对应起来。注意,这里并不是将整个源码都添嵌入到目标文件中,而是只是添加对应的行数信息,因此,在进行debug的时候,必须保证gdb可以找到源文件。 
  下面做一个小测试进行验证: 
(1)先针对上面的文件调试:

 gdb test.out
(gdb) start

如下:

  可以看到,第一个breakpoint是第5行,且源码为: 
      a[0] = 1;

  这个时候,如果在源文件中的第一和第三行间添加1行,然后再运行gdb(注意,不要在运行gcc编译)

 gdb test.out
(gdb) start

此时,发现gdb中第一个breakpoint仍为第5行,但是,源码却为原来的上一行。


由此,验证了我们的说法:“gdb只是添加对应的行数信息,而非嵌入源代码”。

 

扩展

-g 选项具有三个等级。即:

-g1 
  不包含局部变量和与行号有关的调试信息,因此只能够用于回溯跟踪和堆栈存储和函数的调用等等。 
-g2 
  默认的级别,此时产生的调试信息包括扩展的符号表、行号、局部或外部变量信息 
-g3 
  包含级别2中的所有调试信息,以及源代码中定义的宏

再学C/C++ 之 浅析gdb的-g选项的更多相关文章

  1. 【C】 01 - 再学C语言

    “C语言还用再学吗?嵌入式工程师可是每天都在用它,大家早就烂熟于心,脱离语言这个层面了”.这样说不无道理,这门古老的语言以其简单的语法.自由的形式的而著称.使用C完成工作并不会造成太大困扰,所以很少有 ...

  2. [Python]再学 socket 之非阻塞 Server

    再学 socket 之非阻塞 Server 本文是基于 python2.7 实现,运行于 Mac 系统下 本篇文章是上一篇初探 socket 的续集, 上一篇文章介绍了:如何建立起一个基本的 sock ...

  3. 再学Java 之 interface的成员变量

    前言:最近在学多线程,写“哲学家就餐问题(Dining Philosophers)”的时候,需要定义一个全局的变量,即哲学家的人数.常用的做法是在其中一个类中定义一个static final的变量,然 ...

  4. GDB如何调试没有符号表(未加-g选项的编译)的程序

    /********************************************************************* * Author  : Samson * Date    ...

  5. 再学ajax--第一天

    今天写这个帖子就是是前几天在学ES6在学到Promise实现AJAX操作时,发现对ajax的一些知识点有些遗忘,所以就回头重新复习了一遍ajax,温故而知新. 主要有从4个方面去复习ajax,分析不透 ...

  6. 再学python类(终结篇)

    续写 初学python类,这几天吃坏东西了,拖着虚弱的身躯写的.有些乱请各位看官海涵. 声明:本人编程新手,还在学习中.所表述的东西都是基础语法之类的,分享我的学习笔记.还望多多指点,我一定虚心接受. ...

  7. 他学习一年Python找不到工作,大佬都说你别再学Python了!

    引言: 都说,滴水穿石非一日之功.然而有些人即使奋斗一辈子也比不上别人一年,别人学习一年比不得你学习一个月.其中缘由,有些人看了大半辈子还没看明白. 即使Python这么火,为何你学习一年的Pytho ...

  8. Java编码方式再学

    一直以来对编码方式对了解不是很深入.建议读下这几篇博文 学点编码知识又不会死:Unicode的流言终结者和编码大揭秘 编码研究笔记 这几篇博文上回答了内心存在的一些问题,这些问题可能也是大家经常遇到的 ...

  9. 不要再学 JSP 了,学 SpringBoot + Thymeleaf + Vue吧

    老读者就请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题. 读 ...

随机推荐

  1. 解决UITableView上的cell的重用

    1.通过为每个cell指定不同的重用标识符(reuseIdentifier)来解决 //        static NSString *rankCellIndefier = @"rankC ...

  2. C(m,n)算法

    排列组合:C(m,n),m为给定数列,n为要从数列m中取元素的数量,GetResult()获取所有不重复的组合. public class MathCombination<T> { Lis ...

  3. 数据库中表的位置,在sysdatabases中

    name dbid sid mode status status2 crdate reserved category cmptlevel filename version master :: :: C ...

  4. 实现输入框不可输入、解决Enable,Disable等不能更新值问题

    当在前台JS中更新不可用输入框(TextBox.Enable ="false"  or Input box ReadOnly ="True")的值时, 后台可能 ...

  5. Stm32ADC-内部温度传感器的使用

    搞完了ADC的基本配置步骤,下面就是ADC配合一些外设的应用了,首先就是stm32f1内部的温度传感器通过adc采集获得温度; 内部温度传感器在ADC1的通道16上,所以只需要初始化以下ADC1就好了 ...

  6. 【转】Windows IIS注册asp 此操作系统版本不支持此选项 错误解决方法

    原文:https://blog.csdn.net/sweety820/article/details/79538973 更新Win10,原来的IIS站点访问不了,原因是因为IIS 没有.net 4.5 ...

  7. 《PHP, MySQL, Javascript和CSS》读书随手记----MySQL篇

    一 基础 要求结尾分号 如果在命令输入期间想要终止其运行,不要Ctrl-C. 要输入\c,并按回车键. sql命令和关键字不区分大小写. 表名在windows中不区分大小写,但是在linux和os x ...

  8. Python 脚本利用adb 进行手机控制

    相关参考:https://www.cnblogs.com/bravesnail/articles/5850335.html 一.  adb 相关命令: 1. 关闭adb服务:adb kill-serv ...

  9. SQL注入之PHP-MySQL实现手工注入-字符型

    SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎 ...

  10. 28_网络编程-TCP/UDP

    一.传输层       1.定义       IP首部有一个协议字段,用来标识网络层(IP)的上一层所采用的是哪一种传输层协议.根据这个字段的协议号,就可以识别IP传输的数据部分究竟是TCP的内容还是 ...