CMake_02_如何编译可调试文件

软件开发过程中,调试是必不可少的环节之一,让可执行文件”明牌“执行,不会漏过每一行代码,每一个变量的信息。从而帮助开发者快速定位到问题点。

  • 先看下没有调试信息的可执行文件是什么样子?
root@localhost:~/testWorkSpace/CPP11/vector$ readelf -S ./build/move 
There are 30 section headers, starting at offset 0x32e0:Section Headers:[Nr] Name              Type             Address           OffsetSize              EntSize          Flags  Link  Info  Align[ 0]                   NULL             0000000000000000  000000000000000000000000  0000000000000000           0     0     0[ 1] .interp           PROGBITS         0000000000000238  00000238000000000000001c  0000000000000000   A       0     0     1[ 2] .note.ABI-tag     NOTE             0000000000000254  000002540000000000000020  0000000000000000   A       0     0     4[ 3] .note.gnu.build-i NOTE             0000000000000274  000002740000000000000024  0000000000000000   A       0     0     4[ 4] .gnu.hash         GNU_HASH         0000000000000298  000002980000000000000024  0000000000000000   A       5     0     8[ 5] .dynsym           DYNSYM           00000000000002c0  000002c00000000000000198  0000000000000018   A       6     1     8[ 6] .dynstr           STRTAB           0000000000000458  00000458000000000000019c  0000000000000000   A       0     0     1[ 7] .gnu.version      VERSYM           00000000000005f4  000005f40000000000000022  0000000000000002   A       5     0     2[ 8] .gnu.version_r    VERNEED          0000000000000618  000006180000000000000080  0000000000000000   A       6     3     8[ 9] .rela.dyn         RELA             0000000000000698  000006980000000000000138  0000000000000018   A       5     0     8[10] .rela.plt         RELA             00000000000007d0  000007d000000000000000a8  0000000000000018  AI       5    23     8[11] .init             PROGBITS         0000000000000878  000008780000000000000017  0000000000000000  AX       0     0     4[12] .plt              PROGBITS         0000000000000890  000008900000000000000080  0000000000000010  AX       0     0     16[13] .plt.got          PROGBITS         0000000000000910  000009100000000000000008  0000000000000008  AX       0     0     8[14] .text             PROGBITS         0000000000000920  000009200000000000000512  0000000000000000  AX       0     0     16[15] .fini             PROGBITS         0000000000000e34  00000e340000000000000009  0000000000000000  AX       0     0     4[16] .rodata           PROGBITS         0000000000000e40  00000e400000000000000005  0000000000000000   A       0     0     4[17] .eh_frame_hdr     PROGBITS         0000000000000e48  00000e4800000000000000dc  0000000000000000   A       0     0     4[18] .eh_frame         PROGBITS         0000000000000f28  00000f2800000000000003c0  0000000000000000   A       0     0     8[19] .gcc_except_table PROGBITS         00000000000012e8  000012e80000000000000019  0000000000000000   A       0     0     1[20] .init_array       INIT_ARRAY       0000000000201d50  00001d500000000000000010  0000000000000008  WA       0     0     8[21] .fini_array       FINI_ARRAY       0000000000201d60  00001d600000000000000008  0000000000000008  WA       0     0     8[22] .dynamic          DYNAMIC          0000000000201d68  00001d680000000000000210  0000000000000010  WA       6     0     8[23] .got              PROGBITS         0000000000201f78  00001f780000000000000088  0000000000000008  WA       0     0     8[24] .data             PROGBITS         0000000000202000  000020000000000000000018  0000000000000000  WA       0     0     8[25] .bss              NOBITS           0000000000202020  000020180000000000000118  0000000000000000  WA       0     0     32[26] .comment          PROGBITS         0000000000000000  000020180000000000000029  0000000000000001  MS       0     0     1[27] .symtab           SYMTAB           0000000000000000  000020480000000000000a08  0000000000000018          28    48     8[28] .strtab           STRTAB           0000000000000000  00002a50000000000000077e  0000000000000000           0     0     1[29] .shstrtab         STRTAB           0000000000000000  000031ce0000000000000110  0000000000000000           0     0     1
Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings), I (info),L (link order), O (extra OS processing required), G (group), T (TLS),C (compressed), x (unknown), o (OS specific), E (exclude),l (large), p (processor specific)

使用gdb工具调试运行上述文件,只能看到一行行指令,是没有代码的。

  • 再看下带有调试信息的可执行文件
root@localhost:~/testWorkSpace/CPP11/vector$ readelf -S ./build/move 
There are 36 section headers, starting at offset 0xb8c8:Section Headers:[Nr] Name              Type             Address           OffsetSize              EntSize          Flags  Link  Info  Align[ 0]                   NULL             0000000000000000  000000000000000000000000  0000000000000000           0     0     0[ 1] .interp           PROGBITS         0000000000000238  00000238000000000000001c  0000000000000000   A       0     0     1[ 2] .note.ABI-tag     NOTE             0000000000000254  000002540000000000000020  0000000000000000   A       0     0     4[ 3] .note.gnu.build-i NOTE             0000000000000274  000002740000000000000024  0000000000000000   A       0     0     4[ 4] .gnu.hash         GNU_HASH         0000000000000298  000002980000000000000024  0000000000000000   A       5     0     8[ 5] .dynsym           DYNSYM           00000000000002c0  000002c00000000000000198  0000000000000018   A       6     1     8[ 6] .dynstr           STRTAB           0000000000000458  00000458000000000000019c  0000000000000000   A       0     0     1[ 7] .gnu.version      VERSYM           00000000000005f4  000005f40000000000000022  0000000000000002   A       5     0     2[ 8] .gnu.version_r    VERNEED          0000000000000618  000006180000000000000080  0000000000000000   A       6     3     8[ 9] .rela.dyn         RELA             0000000000000698  000006980000000000000138  0000000000000018   A       5     0     8[10] .rela.plt         RELA             00000000000007d0  000007d000000000000000a8  0000000000000018  AI       5    23     8[11] .init             PROGBITS         0000000000000878  000008780000000000000017  0000000000000000  AX       0     0     4[12] .plt              PROGBITS         0000000000000890  000008900000000000000080  0000000000000010  AX       0     0     16[13] .plt.got          PROGBITS         0000000000000910  000009100000000000000008  0000000000000008  AX       0     0     8[14] .text             PROGBITS         0000000000000920  000009200000000000000512  0000000000000000  AX       0     0     16[15] .fini             PROGBITS         0000000000000e34  00000e340000000000000009  0000000000000000  AX       0     0     4[16] .rodata           PROGBITS         0000000000000e40  00000e400000000000000005  0000000000000000   A       0     0     4[17] .eh_frame_hdr     PROGBITS         0000000000000e48  00000e4800000000000000dc  0000000000000000   A       0     0     4[18] .eh_frame         PROGBITS         0000000000000f28  00000f2800000000000003c0  0000000000000000   A       0     0     8[19] .gcc_except_table PROGBITS         00000000000012e8  000012e80000000000000019  0000000000000000   A       0     0     1[20] .init_array       INIT_ARRAY       0000000000201d50  00001d500000000000000010  0000000000000008  WA       0     0     8[21] .fini_array       FINI_ARRAY       0000000000201d60  00001d600000000000000008  0000000000000008  WA       0     0     8[22] .dynamic          DYNAMIC          0000000000201d68  00001d680000000000000210  0000000000000010  WA       6     0     8[23] .got              PROGBITS         0000000000201f78  00001f780000000000000088  0000000000000008  WA       0     0     8[24] .data             PROGBITS         0000000000202000  000020000000000000000018  0000000000000000  WA       0     0     8[25] .bss              NOBITS           0000000000202020  000020180000000000000118  0000000000000000  WA       0     0     32[26] .comment          PROGBITS         0000000000000000  000020180000000000000029  0000000000000001  MS       0     0     1[27] .debug_aranges    PROGBITS         0000000000000000  000020410000000000000150  0000000000000000           0     0     1[28] .debug_info       PROGBITS         0000000000000000  000021910000000000003fe5  0000000000000000           0     0     1[29] .debug_abbrev     PROGBITS         0000000000000000  000061760000000000000755  0000000000000000           0     0     1[30] .debug_line       PROGBITS         0000000000000000  000068cb0000000000000623  0000000000000000           0     0     1[31] .debug_str        PROGBITS         0000000000000000  00006eee000000000000351d  0000000000000001  MS       0     0     1[32] .debug_ranges     PROGBITS         0000000000000000  0000a40b0000000000000140  0000000000000000           0     0     1[33] .symtab           SYMTAB           0000000000000000  0000a5500000000000000a98  0000000000000018          34    54     8[34] .strtab           STRTAB           0000000000000000  0000afe8000000000000077e  0000000000000000           0     0     1[35] .shstrtab         STRTAB           0000000000000000  0000b766000000000000015e  0000000000000000           0     0     1
Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings), I (info),L (link order), O (extra OS processing required), G (group), T (TLS),C (compressed), x (unknown), o (OS specific), E (exclude),l (large), p (processor specific)

好像没啥区别,过滤下看看

root@localhost:~/testWorkSpace/CPP11/vector$ readelf -S ./build/move | grep debug[27] .debug_aranges    PROGBITS         0000000000000000  00002041[28] .debug_info       PROGBITS         0000000000000000  00002191[29] .debug_abbrev     PROGBITS         0000000000000000  00006176[30] .debug_line       PROGBITS         0000000000000000  000068cb[31] .debug_str        PROGBITS         0000000000000000  00006eee[32] .debug_ranges     PROGBITS         0000000000000000  0000a40b

可执行文件中,正是多加了这些字段信息,才让GDB工具可以“明牌”运行。

  • 看到了目标效果,绕回本文主题,CMake工具如何生成带有调试信息的执行文件呢?

在CMake.txt文件中,设置如下编译参数就可以了(适用于CMake 3.14.7 版本)

add_definitions("-Wall -g")
set(CMAKE_BUILD_TYPE "Debug")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试宝典】图解ARP协议、TCP协议、UDP协议

一、ARP协议 二、TCP协议 三、UDP协议 四、TCP和UDP的区别

Linux Git打包部署JAVA项目 shell脚本

my-test-8080.jar.sh 脚本 #!/bin/bashBASE_PATH"/root/local"GIT_BASE_PATH"/root/local/publish/my-java-study"SCRIPT_NAME$(basename "$0")JAR_NAME"${SCRIPT_NAME%.sh}"BRANCH_NAME"dev"GIT_URL"gitgitee.com:xx…

LeetCode 36. 有效的数独

有效的数独 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 一次遍历法 有效数独的三个…

如何有效使用360评估

导语:360度评估是绩效考核方法之一,被评估者不仅可以从自己、上司、部属、甚至顾客处获得多种角度的反馈,也可从这些不同的反馈清楚地认识到自己的不足、长处与发展需求。但360度评估也有其适用的范围和条件,华为总裁任正非给出了…

抽丝剥茧设计模式-目录

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 01 设计模式前言-设计模式源码02 Singleton单例03 Strategy策略04 FactoryMethod工厂方法-AbstractFactory抽象工厂05 Facade门面-Mediator调停者06 Decorator装饰器…

impala元数据自动刷新

一.操作步骤 进入CM界面 > Hive > 配置 > 搜索 启用数据库中的存储通知(英文界面搜索:Enable Stored Notifications in Database),并且勾选,注意一定要勾选,配置后面的配置不生效。数据库通知的保留时间默认为2天&#…

Nacos下载与安装【windows】

🥚今日鸡汤🥚 我不知将去何方,但我已经在路上。 ——宫崎骏《千与千寻》 目录 🥞1.Nacosdi地址 🌭2.GitHub下载 🍿3.目录结构 🥓4.启动nacos 🧂5.客户端登陆 &#x1f9c8…

GitHub 一周热点汇总第5期(2024/01/07-01/13)

GitHub一周热点汇总第5期 (2024/01/07-01/13),梳理每周热门的GitHub项目,这一周的热门项目都普遍比较年轻,有几个更是刚刚发布就火热起来了,一起来看看都有哪些项目吧。 #1 llm-course 项目名称:llm-course - 大语言…

华为路由器OSPF动态链路路由协议配置

R1配置 interface GigabitEthernet0/0/0ip address 10.1.12.1 255.255.255.252 interface LoopBack0ip address 1.1.1.1 255.255.255.255 ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 1.1.1.1 0.0.0.0 network 10.1.12.0 0.0.0.3 R2配置 interface GigabitEthernet0/0/0i…

特征工程-特征处理(一)

特征处理-(离散型特征处理) 完成特征理解和特征清洗之后,我们要进行特征工程中最为重要和复杂的一步了——特征处理 离散型特征处理 离散型特征通常为非连续值或以字符串形式存在的特征,离散型特征通常来讲是不能直接喂入模型中…

四川云汇优想教育咨询有限公司引领电商未来

四川云汇优想教育咨询有限公司,一家在电商服务领域崭露头角的领军企业,致力于为广大客户提供最优质、最全面的电商服务。作为业界翘楚,云汇优想凭借其卓越的服务品质和强大的技术实力,在激烈的市场竞争中独树一帜,赢得…

营业厅神秘顾客调查内容

本文由群狼调研(长沙神秘顾客调研公司)出品,欢迎转载,请注明出处。营业厅神秘顾客调查的内容可以包括以下方面: 1.服务质量评估:评估员工的服务态度、专业知识和沟通能力。观察员工对顾客的响应时间、礼貌程…

Nginx 配置一级和二级证书以及作为静态资源服务器

Nginx 配置一级和二级证书以及作为静态资源服务器 Docker 启动 nginx 容器 version: 3 services:root-nginx:restart: alwayscontainer_name: root-nginximage: nginx:latestports:- 443:443volumes:- /path/ssl:/etc/nginx/conf.d/ssl- ./conf.d/default.conf:/etc/nginx/co…

将WAP网站封装成App体验的全新策略

一、传统的App封装方式 传统的App封装技术通常依赖于WebView组件,将WAP内容嵌入到一个原生App框架中。这种方法虽然可以快速实现WAP到App的转换,但存在着明显的缺陷:首先,WebView的性能和用户体验都无法与原生组件相提并论&#x…

金蝶云星空与金蝶云星空对接集成逐个单据查询连通员工新增(3009-销售退货清理卡片)

金蝶云星空与金蝶云星空对接集成逐个单据查询连通员工新增(3009-销售退货清理卡片) 来源系统:金蝶云星空 金蝶K/3Cloud(金蝶云星空)是移动互联网时代的新型ERP,是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人…

【TC3xx芯片】TC3xx芯片电源管理系统PMS详解

目录 前言 正文 1.供电模式选择(Supply Mode Selection) 1.1 供电域 1.2 供电模式 1.3 供电阈值 1.4 供电上升和下降行为Supply Ramp-up and Ramp-down Behavior 1.5 EVRC产生供电 2. 电源监控 2.1 电源监控原理 2.2 Primary低电压监控 2.3 …

C++六大组件之一:仿函数

场景一&#xff1a; 与其过多叙述定义&#xff0c;不如在下面一个场景中来理解仿函数&#xff1a; #include<iostream> using namespace std; template<class T> void bubbles_sort(T* arr,int size) //冒泡排序 {for (int i 0; i < size - 1; i){for (int j…

Android系统启动-Zygote详解(Android 14)

一、什么是Zygote 在上一篇文章Android系统启动-init进程详解&#xff08;Android 14&#xff09;中&#xff0c;分析了init进程&#xff0c;在init进程启动的第二阶段会解析init.*.rc文件&#xff0c;启动多个进程&#xff0c;其中包括Zygote。 Zygote又叫孵化器&#xff0c…

SSM框架整合:掌握Spring+Spring MVC+MyBatis的完美结合!

SSM整合 1.1 流程分析1.2 整合配置步骤1&#xff1a;创建Maven的web项目步骤2:添加依赖步骤3:创建项目包结构步骤4:创建SpringConfig配置类步骤5:创建JdbcConfig配置类步骤6:创建MybatisConfig配置类步骤7:创建jdbc.properties步骤8:创建SpringMVC配置类步骤9:创建Web项目入口配…

关于@KafkaListener动态订阅消费topic的调研

KafkaListener注解监听和消费kafka的代码通常如下&#xff1a; KafkaListener(topics "#{${topics}.split(,)}") public void onMessage(List<ConsumerRecord<String, String>> records) {try {final List<String> msgs records.stream().map(C…