首页
学习
活动
专区
工具
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文件,保存了编译链接参数选项,并且描述了所有源文件之间关系。

16720

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

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

73910

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_addarray_fill两个函数里面都涉及到段错误,数组越界,length被取等号,但为什么没有发生报错或者错误终止程序是因为最后print函数里面只涉及到了正常

5.2K50

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

【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只管文件依赖性

6510

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

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

7.4K31

【Linux】Linux 编译器与调试器 -- gccg++gdb 使用

动态库与静态库 3、gcc/g++ 使用 二、Linux调试器 - gdb 使用 1、debug release 2、gdb 使用 一、Linux编译器 - gcc/g++ 使用 1、程序运行四个阶段...符号合并和重定位:符号合并是指编译器会把汇编阶段生成多个符号表合并为一个符号表;重定位则是指当同一个符号出现在两个符号时,编译器会选取其中和有效地址相关那一个,舍弃另外一个。...,库代码是别人给我们写好供我们直接使用,即我们只有该函数调用,而没有函数实现; 同时,程序预处理、编译汇编阶段处理都是我们自己编写代码,只有链接时候,库函数实现才会和我们代码关联起来...; -O3 O2基础上进行更多优化; -w 不生成任何警告信息; -Wall 生成所有警告信息; ---- 二、Linux调试器 - gdb 使用 1、debug release Windows...行号:某一行打一个断点,相当于VSF9 (b – breakpoint); info b:查看断点; d 断点编号:删除断点 (d – delete);(注:每个断点都有自己编号,我们删除断点时需要指明对应断点编号

1.5K00

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

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

21810

gdbmakefile讲解

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根本不理。

7710

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.5K10

Linux环境基础开发工具

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

1.8K50

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

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

7410

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

3.4K31

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)命令 作用

10610

Linux后台开发必看(给进军bat你)

ETLT模式 介绍下滑动窗口 指针与引用区别 Accept发生在三次握手哪个阶段 Udp接收缓冲区发送缓冲区tcp区别 http长连接与短连接区别 udp包长度 一次url访问会经历哪些过程...自旋锁与普通锁区别 虚拟内存 进程内存分布 栈内存为什么由系统自动分配释放 守护进程如何创建 进程间通信方式及其区别,应用场景 死锁条件和解除 进程调度方式 对编译连接理解 共享内存实现原理...tcpdump top makefile介绍下(cmake介绍下) gdb查看堆栈中所有遍历 gdb查看shared_ptr指向内容 gdb如何调试多进程多线程 g++gcc编译出来有什么区别...死锁怎么调试 core文件是什么,gdb调试core文件 如何读取一个10G文件,cat一个10g文件会发生什么 Linux基础命令推荐书籍:《Linux就该这么学》 Linux应用编程推荐书籍《...100G文本,每行80k还是80字符,提示用多个机器,多进程,多线程,求出重复最多行。一个机器内存8G,计算每个机器大概分多少?能读取100G文本吗?

1.6K20

【Linux】常用工具(下)

windows 操作系统,比如 vs2019 这款编译器,有了图形化界面,我们可以直接一键生成解决方案,即编译;但在 Linux 系统,需要我们使用 gcc 或 g++ 手动进行编译工作,当我们需要编译文件多起来时...依赖关系依赖方法 我们先简单看一看 make Makefile 使用;我们先 touch 一个 Makefile 文件一个普通文件: 我们 test.c 文件随便写一些代码: 随后我们进入...三、Linux 调试器 - gdb 程序发布方式有两种,debug 模式 release 模式;Linux gcc/g++ 编译出来二进制程序,默认是 release 模式;要使用 gdb 调试,...:info b,如下: 删除断点指令是d + 序号,其中序号是查看断点中前面的那个 Num,例如我们先多打几个断点: 如上,每个断点前都有对应序号,假设我们需要删除某一个断点: 3.... vs ,我们可以使用 F10 F11 进行逐过程逐语句调试gdb 我们也可以使用这样操作,其中逐过程是 n,即 vs F10;逐语句是 s,即 vs F11.

17610

linux编译openjdk8

** 编译 ** 系统:centOs 7.5 64位(刚开始用腾讯云1核1g编译时候说内存不够,好在腾讯云5天免费退,改成1核2g) 1、下载openjdk8:https://pan.baidu.com...ZIP_DEBUGINFO_FILES=0:生成调试符号信息,并且不压缩; make成功之后会出现如下截图:但是没有出现网上说编译1个多小时情况 ?...https://blog.csdn.net/hxm_Code/article/details/77417709 运行调试 因为linux是云服务器,不太方便调试,想着能不能把编译代码放到我本地...20180920更新 可能是执行方法不对或者怎么样,总之在windows下执行不起来,其次网上运行调试文章有些语焉不详,netbeans失败了,还是学着使用gdb吧。...然后为什么main.c上打断点,看过一些文章是openjdk/hotspot/src/share/tools/launcher/java.c上打断点,但是openjdk8之后虚拟机入口改变了。

1.8K10

Linux之基础开发工具

前言 Linux基础开发工具及其使用,包括yum(软件包管理器)、vim(编辑器)、gcc/g++(编译器)、makefile(项目自动化构建工具)、gdb调试器)等。...三、gcc/g++(编译器) 1.编译链接过程 正式介绍编译器之前,我们先回顾一下编译链接过程。 2.gcc/g++使用 1.预处理 头文件展开、宏替换、条件编译、去掉注释。...,我们自己写程序没有定义printf等函数具体实现,且编译包含stdio.h也只有这些函数声明,只有链接时候该函数实现才与我们代码关联起来,那么这类函数是在哪里实现呢?...4.makefile推导规则 如果要将上面例子每个步骤都进行执行的话,则需要如下图代码: make缺省情况下(不指定目标文件),会只执行第一个目标文件代码。...2.回车换行 一般而言: \r换行是指换到下一行 \n回车指回到当前行最开始 但是语言层面 \n就是回车换行 3.显示器为什么能显示各种符号

22620
领券