首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么gdb找不到任何调试符号,即使我在Makefile中的每个编译和链接阶段都有-g?

gdb找不到任何调试符号的原因可能有以下几个方面:

  1. 编译器未添加调试信息:在编译代码时,需要使用-g选项告诉编译器生成调试信息。如果在Makefile中的每个编译和链接阶段都添加了-g选项,但仍然找不到调试符号,可能是编译器没有正确地生成调试信息。可以尝试检查编译器的版本,或者尝试使用其他编译器。
  2. 编译器优化选项导致调试信息丢失:某些编译器优化选项可能会导致调试信息被丢弃,从而导致gdb无法找到调试符号。可以尝试在编译时禁用优化选项,例如使用-O0选项来关闭优化。
  3. 编译和链接的文件不匹配:如果在编译和链接过程中使用了不同的编译器或链接器,可能会导致调试符号无法正确匹配。确保在编译和链接过程中使用相同的工具链。
  4. 调试符号文件路径问题:gdb需要找到对应的调试符号文件才能正确解析调试信息。如果调试符号文件的路径不正确或无法访问,gdb就无法找到调试符号。可以尝试检查调试符号文件的路径是否正确,并确保gdb可以访问到这些文件。

总结起来,如果gdb找不到任何调试符号,可以检查编译器是否正确生成调试信息,编译选项是否正确设置,编译和链接的工具链是否一致,以及调试符号文件路径是否正确。如果问题仍然存在,可以尝试查阅相关文档或寻求其他开发者的帮助来解决。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Linux】--- Linux编译器-gccg++、调试器-gdb、项目自动化构建工具-makeMakefile 使用

链接(生成可执行文件或库文件): 实例: gcc hello.o –o hello。在成功编译之后,就进入了链接阶段,最后形成可执行程序。 那么为什么会有这些过程呢? 这就要说到编程语言的历史了。...二、Linux调试器-gdb 2.1 背景 程序的发布方式有两种,debug模式和release模式。Linux gcc/g++出来的二进制程序,默认是release模式。...要使用gdb调试,必须在源代码生成二进制程序的时候,加上 -g选项,此时编译器形成可执行程序的时候,会给可执行程序添加调试信息。 我们也可以发现可调式的可执行程序比普通的程序占用内存大。...在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。...makefile / make会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有的相关的依赖方法。 makefile文件中,保存了编译器和链接器的参数选项,并且描述了所有源文件之间的关系。

43320

后台开发:核心技术与应用实践 -- 编译与调试

代码生成和目标代码优化 链接 把每个源代码模块独立地编译,然后按照要将它们“组装”起来,这个组装模块的过程就是链接。...链接过程主要包括了地址和空间分配、符号决议和重定位等这些步骤。 静态链接过程如图所示,每个模块的源代码文件经过编译器编译成目标文件,目标文件和库一起链接形成最终可执行文件。 ?...每个目标文件除了拥有自己的数据和二进制代码外,还提供了3个表:未解决符号表、导出符号表、地址重定向表,具体如下所述: 未解决符号表提供了所有在该编译单元里引用但是定义并不是在本编译单元的符号以及其出现的地址...缺点是效率低,可能输入大量无关的数据,发现错误具有偶然性 借助调试工具,目前大多数程序设计语言都有专门的调试工具,比如 C++ 的调试工具有 GDB ,可以用这些工具来分析程序的动态行为 strace...并且 program 应该在 PATH 环境变量中搜索得到 综上,一个简单的使用gdb来进行调试的demo为: gcc -g hello.c -o hello gdb hello 进入gdb调试模式后

77010
  • Linux环境下通过GDB调试C项目实战

    前情回顾: 编译过程可分为四个阶段: 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking) 调试选项 gcc−ggcc-ggcc−...g 默认情况下,gcc在编译时不会建个调试符号插入到生成的二进制代码中,如果需要生成调试符号信息,可以使用gcc -g选项,一般不加调试选项,否则会使代码增大。...这个Makefile中的几条命令大致为: make clean:清除已经存在的result可执行文件 make/make result:将已经得到的可执行文件main.o与array.o链接成可执行文件...,初步排查断定是在代码实现上出了问题 在确定了Makefile没有大问题之后,我们采用gdb调试器来调试,首先gdb ....查看完毕,果真和之前初步调试的一样,在array_add和array_fill两个函数里面都涉及到段错误,数组越界,length被取等号,但为什么没有发生报错或者错误终止程序是因为在最后的print函数里面只涉及到了正常的

    5.3K50

    Linux学习-开发工具的使用

    编译 3)汇编 4)链接 2、函数库 四、Linux调试器-gdb 1、背景及概念 2、调试命令 五、Linux项目自动化构建工具-make/Makefile 1、背景及概念 2、使用及原理 零、前言...,该选项只进行编,生成汇编代码 3)汇编 功能主要包括: 汇编阶段对全局变量生成符号表;把编译阶段生成的“.s”文件转成目标文件(由汇编指令转成二进制指令) 示例: gcc –c hello.s...–o hello.o 示图: 注: 使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了 4)链接 功能主要包括: 合并段表,合并符号表以及符号表的重定位;每个目标文件由链接器捆绑在一起...,-O3优化级别最高 -w 不生成任何警告信息 -Wall 生成所有警告信息(默认生成) 四、Linux调试器-gdb 1、背景及概念 相关概念: 程序的发布方式有debug模式和release模式...Linux gcc/g++编译链接出来的可执行程序默认是release模式 gdb 是 Linux 里的调试器,想调试必须在源代码生成可执行程序的时候加上 -g 选项 为什么要有debug

    3.4K20

    【嵌入式】嵌入式项目手动与自动化构建流程详解

    本文详细介绍了8个嵌入式项目处理流程:源代码编写、预处理、编译、汇编、链接、生成二进制和 HEX 文件、烧录以及清理。每个流程都有其独立的操作命令,并对不同的开发工具链进行详细讲解。 1....st-flash write build/main.bin 0x8000000 2.8 调试阶段 在调试过程中,可以使用 GDB 等工具进行调试,加载 .elf 文件进行符号调试。...示例 5:仅显示命令不执行 在调试 Makefile 时,你可能只想查看 make 会执行哪些命令,而不实际执行它们: make -n 这会列出所有的命令,但不会执行任何操作。...如果你在使用 make 命令时遇到问题,查看 Makefile 里的规则和目标,确保你正在执行正确的目标,并理解每个目标的操作。 4....嵌入式项目处理流程摘要 在嵌入式开发中,项目从源代码编写到最终烧录的过程涉及多个步骤,可以分为手动和自动两种方式。以下是8个主要的处理流程,概述了每个流程如何操作及其在整个开发过程中的角色。

    12010

    深入浅出GCC编译器

    之所以要经过预处理、编译、汇编这么一系列步骤才生成目标文件,是因为在每一阶段都有相应的优化技术,只有在每个阶段分别优化并生成最为高效的机器指令才能达到最大的优化效果,如果一步到位直接从源程序生成目标文件...无论采用静态链接还是动态链接,都会生成一个可以在计算机上执行的可执行程序。 2. GCC编译流程 GCC的编译流程也一样四个阶段,和上节所讲的一致。这里主要讲每个环节所使用的参数以及使用的工具。...指定包含头文件的路径(绝对、相对路径都可) -l (小写L) 指定库名,libxxx.a或libxxx.so -L 包含的库路径 -g 生成调试信息,用于gdb调试,如果不加这个选项无法进行gdb调试...(6)-g 生成调试信息 这个选项用于gdb调试的时候,只有在编译的时候加 -g 选项,才能进行gdb调试。...可以看到,加了 -g 选项后,文件变大了,这是因为里面包含了调试所用的信息,关于 -g 选项的更多知识和 gdb 调试相关讲解,将在Linux专栏的另一篇文章《GDB调试器》中详细介绍。

    53710

    【Linux】Linux开发工具-vim 编译器-gccg++ 调试器-gdb git操作 项目自动化构建工具-makeMakefile

    Linux不关心文件后缀不代表编译器不关心文件后缀) 3.5 程序的翻译过程 程序的翻译过程分为:预处理、编译、汇编、链接 在Linux中,我们可以用gcc命令的各种选项看到翻译的各过程,可以在每个阶段停下来...链接的过程是我们的程序和库结合的过程 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf...同样运行也能通过 静态链接的应用场景 由于静态链接不依赖于任何的动态库,所以在移植到其他环境中时就不需要做过多的环境检测,可以直接运行,方便部署 4.Linux调试器-gdb 4.1 背景 程序的发布方式有两种...,debug模式和release模式 Linux gcc/g++出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项 4.2 开始使用 gdb...,直到最终编译出第一个目标文件 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理 make只管文件的依赖性

    10410

    Linux下使用VSCode配置C++调试环境

    虽然 Makefile 有写明编译的目标和其对应的依赖,但对于大项目来说,错综复杂的依赖关系即使去认真阅读 Makefile 文件也不是那么容易理清,更何况大项目的 Makefile 文件往往为了书写方便进行了大量封装...而这时,调试的作用就体现出来了。调试不仅仅可以用来 Debug,我觉得更重要的是它能帮你理清一个程序它是从何而始、至何而终以及它整个执行路线是什么。这便是我这篇文章为什么要介绍配置调试环境的原因。...安装完后,需要进一步进行配置才能使用: 首先用 VSCode 打开你要调试的项目目录,然后可以看到左侧栏出现一个调试按键,点击一下会弹出如下提示: 图片 这是告诉你目前没有任何的配置文件来供编译调试,...文件后再 make 编译,在项目中的 README 中一般也会说明如何编译。...不过编译时需要注意的是,确保 Makefile 文件中的 CFLAGS 和 CXXFLAGS 变量包含 -g 参数,如果没有则加上,-g 参数是为了保证编译出来的二进制文件包含调试信息(也即俗称的 Debug

    7.9K31

    【Linux系统编程】Linux调试器——gdb 的基本使用

    1.1 源文件和Makefile 所以,我先来写一个代码,写一下Makefile 先写一个源文件test.c 然后写一下Makefile 然后我们来编译运行一下: 我们发现报错了 说的是...也很简单,在Makefile里面加一点东西 -std=c99 然后 就可以正常编译运行了 1.2 安装gdb并解决没有调式信息的问题 然后如何调式呢?...然后我们输入相应的指令去调式的话,会发现调不成,有一个报错说的是找不到调试符号 其实就是生成的可执行程序中没有调式信息,怎么回事?...在 Debug 模式下,编译器会生成带有调试符号信息的可执行文件,这些符号信息包含了变量名、函数名和源代码行号等,以便在调试过程中能够准确地追踪错误。...很简单 gcc/g++编译的时候加一个-g就行了 那为了以示区分,我把release版本的重命名一下 然后我们生成debug版本的,也重命名一下 那这里我们其实就能看到debug和release

    50110

    gdb和makefile的讲解

    Linux调试器-gdb使用 gdb可以用于Linux环境下的程序的调试,就例如vs环境下的打断点,然后逐步分析语句等 1 gdb的背景 程序的发布方式有两种,debug模式和release模式 我们在使用...Linux gcc/g++出来的二进制程序,默认是release模式 所以我们在使用gdb对程序进行调试就需要将release版本转化为debug模式,我们就可以在程序后加上-g的选项 有些系统需要自己安装...gdb: yum install -y gdb 例如: 我想要gdb调试我的test2这个文件,但是调试不了,文件不符合它的格式要求 那么我们就可以用-g选项: gcc test -o test-debug...-g 将test编译后的debug版本命名为test-debug 然后你就可以看到一个debug的文件,你就用gdb 对他进行调试即可: 下图对第五行进行打一个断点 2 gdb的使用 2.1...在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

    15010

    6_Makefile与GCC

    在连接阶段中,所有对应于源程序的.o文件,“-l”选项指定的库文件,无法识别的文件名(包括指定的“.o”目标文件和“.a”库文件)按命令行中的顺序传递给连接器。...6.2.2.5 调试选项 ​ 代码目录在**git仓库(6_Makefile与GCC/001_gcc_02)**文件夹下 ​ gcc支持数种调试选项: ​ -g 产生能被GDB调试器使用的调试信息。 ​...调试例子如下,首先需要编译,操作步骤如下: $ gcc main.c -g -o main ​ GDB调试示例: ​ (1)run命令 ​ 调试运行,使用run命令开始执行被调试的程序,run命令的格式...6.3.1 动态链接库和静态链接库使用例程 ​ 静态库和动态库,是根据链接时期的不同来划分。 ​ 静态库:在链接阶段被链接的,所以生成的可执行文件就不受库的影响,即使库被删除,程序依然可以成功运行。...为什么clean下的命令没有被执行?这是因为Makefile中定义的只执行命令的目标与工作目录下的实际文件出现名字冲突。

    3.6K10

    Linux环境基础开发工具

    链接(生成可执行文件或库文件) (生成可执行文件,在 Linux中为 .out) 在成功编译之后,就进入了链接阶段。...-o: 文件输出到 文件 -D: 宏的命令行定义,多用于条件编译中的调试 -static: 此选项对生成的文件采用静态链接 -g: 生成debug程序。...、背景 程序的发布方式有两种,debug模式和 release模式 Linux gcc/g++出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上...: makefile文件中,保存了编译器和链接器的参数选项,并且描述了所有源文件之间的关系。...make程序会读取makefile文件中的数据,然后根据规则调用编译器,汇编器,链接器产生最后的输出,即 makefile文件保存了编译器和连接器的参数选项。

    1.9K50

    Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试

    这篇文章旨在为读者提供一站式的 Linux 工具指南,从软件包管理 (apt) 到编译器 (gcc/g++)、自动化构建工具 (make),再到调试器 (gdb),我们将以清晰、系统化的方式为您逐步解析这些工具的功能和使用方法...二、Linux编译器-gcc/g++使用 在 Linux 系统中,gcc 和 g++ 是常用的编译器,用于编译 C 和 C++ 程序。...-c 只编译,不链接生成目标文件(.o 文件)。 -g 生成调试信息,用于调试器(如 gdb)。 -Wall 启用所有常见的编译警告,帮助发现潜在错误。...2.7 调试 编译时添加 -g 选项,生成包含调试信息的二进制文件: gcc -g -o debug_program program.c 使用 gdb 调试: gdb ....%.o: %.c:通配规则,表示所有 .c 文件生成对应的 .o 文件。 3.5 Makefile 中的特殊符号和自动变量 符号/变量 作用 $@ 当前目标的名字。 $^ 所有依赖项的名字(去重)。

    20510

    【Linux】《how linux work》第十五章 开发工具

    因此,开发人员将源代码的组件分组在一起,每个组件都有自己的文件。...当动态运行时链接器遇到这个变量时,它通常需要多次搜索每个指定目录的全部内容,这会导致性能大幅下降,更重要的是,由于运行时链接器会在这些目录中搜索每个程序,可能会出现冲突和不匹配的库。...在没有Makefile的情况下运行make实际上在处理Fortran、Lex或Yacc等情况时最有用,因为你可能不知道编译器或实用程序的工作原理。 为什么不让make试着为你找出来呢?...例如,假设你有一个创建名为boring和trite的可执行文件的包。 每个可执行文件都有自己的.c源文件,并且需要util.c中的代码。...为了在程序中启用完整的调试功能,可以使用-g选项运行编译器,将符号表和其他调试信息写入可执行文件中。

    11110

    Linux从入门到精通(九)——Linux编程

    Linux编程 1. vi的工作方式 三种方式:命令方式、插入方式、末行方式 命令方式:用户一进入vi就进入命令方式,在该模式中任何键入的字符都被看成vi的命令,键入后立即执行。...其中,第一行指令用于安装编译 C 和 C++ 代码所需的静态链接库;第二行指令用于安装编译 C 和 C++ 代码的 gcc 和 g++ 指令。...只编译汇编不链接,生成目标文件.o-S只编译不链接,生成汇编代码-E只进行预处理,不做其他处理-g在可执行程序中包含标准调试信息,加了这个才可以gdb调试该文件。...6.1 gdb 基本用法 ​ 需要调试的程序,在编译时要使用调试选项。在默认的情况下,调试符号不会编译到程序中。调试之后,不需要重新编译程序。...gdb [可执行文件名] 出现 (gdb)#这里可以输入调试命令 注意:可执行文件编译的时候,必须加入参数-g,才可以使用gdb 6.2 gdb 常用命令 进入gdb调试界面后,可以输入以下命令:

    2K30

    linux 编译汇编,linux下的汇编教程

    这些段都有缺省的标志(flags),连接器可以识别这些标志。(与armasm中的AREA相同)。...GNU ARM汇编特殊字符和语法 代码行中的注释符号: ‘@’ 整行注释符号: ‘#’ 语句分离符号: ‘;’ 直接操作数前缀: ‘#’ 或 ‘$’ 第二部分 GNU的编译器和调试工具 一....编译工具 1.编辑工具介绍 GNU提供的编译工具包括汇编器as、C编译器gcc、C++编译器g++、连接器ld和二进制转换工具objcopy。...如果项目包含很多文件,则需要编写makefile文件。关于makefile的内容,请感兴趣的读者参考相关资料。 (3)编写连接脚本文件 gcc等编译器内置有缺省的连接脚本。...调试工具 Linux下的GNU调试工具主要是gdb、gdbserver和kgdb。其中gdb和gdbserver可完成对目标板上Linux下应用程序的远程调试。

    3.5K31

    【Linux】Linux开发六大必备工具之安装、自动化构建、调试工具

    test.i,test.i依赖于test.c,clean不依赖任何文件,然后在依赖关系的下一行table然后写明为什么依赖,也就是后面生成前面所需要的指令 当我们写好makefile文件后,直接输入...,将其定义为伪目标符合其操作的性质,使 makefile 的逻辑更加清晰 (5)符号代替 上面两份代码意义相同 符号 意义 $@ 表示规则中的目标文件 $^ 表示规则中的所有依赖文件 $中的第一个依赖文件...六、调试工具–gdb 1、背景 我们在初始学习C语言的时候,如果不是在学校中学的,一般我们用的第一个编译器是VS或者VScode,以VS为例,在学习过程中我们会学到一个能力叫做调试,调试成立的条件是建立在程序是以...debug方式发布的 我们都知道程序的发布方式有两种,一种叫做debug,另一种叫做release,在Linux中通过gcc和g++编译出的程序默认是release版本的,如果我们要对代码进行调试...,就需要debug版本,就要在源代码生成二进制程序的时候加上-g选项,而在Linux中进行调试的调试工具就是gdb 2、使用 创建一个我们开始学习C语言调试时候的简单例子,加法程序 test是通过

    4100

    【Linux入门】2w字详解yum、vim、gccg++、gdb、makefile以及进度条小程序

    (注意这里的库名称要去掉前缀和后缀) -D: 宏的命令行定义,多用于 条件编译中的调试 -static: 此选项对生成的文件采用静态链接 -g: 生成 调试程序 -std=c99 或 -std=gnu99...因此,我们需要根据具体情况选择适当的优化级别 gdb调试器 一、背景 程序的发布方式有两种,debug 模式和 release 模式 Linux gcc/g++ 生成的二进制程序,默认是 release...模式 要使用 gdb 调试,必须在编译指令中加上 -g 选项 二、怎么查看文件是否可以 debug ​ 用下面的命令即可,如果可以 debug,则会显示 debug 相关的一些信息,否则没有相关信息:...makefile 文件中,保存了编译器和链接器的参数选项,并且描述了所有源文件之间的关系。...make 程序会读取 makefile 文件中的数据,然后根据规则调用编译器,汇编器,链接器产生最后的输出,即 makefile文件保存了编译器和连接器的参数选项。

    13510

    Linux开发工具——gdb篇

    ✈️ gdb背景  我们知道,程序的发布方式有两种:dubug模式 和 release模式。  Linux gcc/g++编译出来的 二进制程序,默认是release模式。  ...为了能够控制在源码生成二进制程序的时候加上-g选项,我们可以在makefile文件中进行操作:   我们在windows写代码时,调试工具大家多多少少也都用过,但是为什么还分为debug版本和release...gcc/g++的 默认行为: 默认是动态链接 默认是release版本发布   我们将makefile文件更改之后,再次使用make命令所生成的可执行程序就是 带有调试信息的可执行程序,这个时候就可以对程序进行调试了...开始使用   我们有了带调试信息的可执行程序之后,使用 gdb mybin,进入到调试页面:   当我们看到这样的页面,就说明你已经开始调试了,下面我来一一介绍在gdb中对应指令的功能。...如果运行时经过断点,那么在info b的时候,就会显示命中次数:   在vs中,我们有单步调试逐语句和逐过程的快捷键:   那么在Linux下gdb调试工具的单步调试就是: next(或n)命令 作用

    23510

    Linux 环境基础开发工具详解

    编译器将源代码转换为计算机可以执行的二进制代码,整个编译过程包括预处理、编译、汇编和链接四个步骤。 gcc 具有强大的功能,可以通过各种编译选项实现不同的优化和功能,如生成调试信息、启用优化等。...为了使用 gdb 进行调试,编译时需要加上 -g 选项,生成包含调试信息的可执行文件。...使用 gdb 可以有效地排查代码中的问题,尤其是对于大型项目,通过设置断点和逐行调试,能够发现代码中的逻辑错误和异常。 4.2 常用调试命令 启动调试:启动 gdb 并加载可执行文件: gdb ....在大型项目中,源码文件往往分布在多个目录下,手动编译这些文件既繁琐又容易出错。通过编写 Makefile,可以自动化完成整个项目的编译、链接等工作。...通过学习这些内容,读者可以在 Linux 系统中独立搭建开发环境,编写、编译和调试代码,并进行版本管理。 这些工具是每个 Linux 开发者的必备基础,熟练掌握它们将极大地提高开发效率和代码质量。

    13110
    领券