在kdevelop中运行程序并调试
补充前序知识:
1.CMakeLists.txt文件中,如下图,第一行生成的是静态库文件(我们前一讲所使用的),第二行是动态库文件。

静态库与动态库:
静态库(Static Libraries)
定义: 静态库是在编译链接阶段被链接到目标程序的库。这意味着库中的函数和数据会被直接嵌入到最终的可执行文件中。
何时使用:
- 当你希望你的应用程序是一个独立的、不需要额外依赖的二进制文件时。
- 在需要保证应用程序的稳定性和安全性的情况下,避免外部动态库的版本冲突或缺失。
优点:
- 可执行文件可以在没有额外库文件的情况下运行,提高了部署的便捷性。
- 减少了由于外部库文件缺失或版本不匹配导致的运行时错误。
缺点:
- 生成的可执行文件较大,因为包含了所有库的代码。
- 不利于代码更新,每次修改库代码都需要重新编译链接整个应用程序。
- 资源消耗较大,如果多个程序使用相同的静态库,每个程序都会包含一份库的副本。
动态库(Dynamic Libraries)
定义: 动态库是在程序运行时被加载的库。它们不会被直接嵌入到可执行文件中,而是在运行时通过系统调用加载。
何时使用:
- 当你希望你的应用程序能够利用系统上最新的库版本,或者需要与多个不同版本的库兼容时。
- 在开发大型系统或组件化软件时,动态库可以提供更好的模块化和代码重用。
优点:
- 可执行文件较小,因为不会包含完整的库代码。
- 多个应用程序可以共享同一个动态库,节省了系统资源。
- 动态库可以独立更新,而不影响已经部署的程序。
缺点:
- 需要确保目标系统上有正确的动态库版本,否则程序可能无法运行。
- 加载动态库会增加启动时间和运行时的复杂性。
- 如果动态库的API改变,可能需要更新使用该库的所有应用程序。
两者区别:
静态库: 当使用静态库时,编译器和链接器会在链接阶段将静态库中的对象文件(.o或.obj文件)合并到最终的可执行文件中。这实际上意味着静态库的代码和数据会被包含在最终的可执行文件中,就好像它们是原生代码的一部分一样。因此,当可执行文件运行时,它并不需要外部的库文件,因为所有必要的代码都已经存在于可执行文件内部了。
动态库: 相比之下,动态库(或共享库)在链接阶段仅记录了一个引用,而不是实际的代码和数据。当程序运行时,操作系统会查找并加载这些动态库。程序通过动态链接器(或加载器)间接调用动态库中的函数。这意味着动态库的代码和数据存储在独立的文件中,并且在运行时由操作系统动态地连接到正在运行的程序上。如果多个程序使用同一个动态库,那么这个库只被加载一次,从而节省了内存。
这种区分在概念上与“内联”和“函数调用”有点类似,但实际上是关于代码如何在编译和链接阶段被处理,以及在运行时如何被加载和执行的问题。静态库的行为更像是将函数“内联”到每个调用它的位置,而动态库则保持函数调用的独立性,即调用者和实现者分离,直到运行时才将两者结合在一起。
——————————————————————————————————
IDE,全称为Integrated Development Environment,即集成开发环境。它是一种软件应用,旨在提供一个统一的界面,使程序员能够更方便地编写、测试和调试代码。IDE通常包括代码编辑器、编译器、调试器以及其他工具,如版本控制系统、图形用户界面设计工具等。
流行的IDE包括Visual Studio(针对C++、C#等)、Eclipse(针对Java)、PyCharm(针对Python)、IntelliJ IDEA(针对Java和Kotlin)、Xcode(针对Swift和Objective-C)等。
在这里可以使用kdevelop,并自行安装。它支持CMake和C++。

在kdevelop中运行程序
1.加载程序(按理说只需文件夹里有一个配置文件即可,下图中文件夹里有多余文件)
注意:在KDevelop中,当你选择Project - Open/Import Project路径后,应该选择一个包含CMakeLists.txt文件的文件夹,而无法选择单个的.txt文件。这是因为KDevelop是根据CMakeLists.txt文件来识别和管理项目的。当你选择包含CMakeLists.txt的文件夹时,KDevelop会自动识别出这是一个CMake项目,并根据其中的配置来设置项目环境。



2.注意将功能选项卡切换至project选项,并检查是否成功导入 (如果第一步文件夹里只有配置文件的话应该只显示红框中的部分)

3.Debug:比如我输入如下图的“不合法”语句,依旧可以通过编译(int *p=0;*p=1;)
PS:下面代码问题为:
这段代码的问题在于它试图访问一个未初始化的指针所指向的内存位置,并对其进行写操作。
int *p = 0;
这一行声明了一个整型指针p,并将其初始化为0。在C和C++中,0(或等价的NULL)通常用来表示一个空指针,即这个指针不指向任何有效的内存地址。
*p = 1;
这一行尝试通过指针p去访问某个内存位置,并将1赋值给该位置。然而,由于p被初始化为0,这意味着它实际上并不指向任何合法的内存区域。当你尝试解引用一个空指针或未正确初始化的指针时,程序的行为是未定义的(Undefined Behavior),这意味着程序可能会崩溃,或者表现出其他不可预测的行为,甚至可能看起来正常工作(但这通常是一种误导)。
通俗地说,你可以想象指针就像一把钥匙,它允许你打开并访问内存中的某个“房间”。当你将指针初始化为0时,你实际上没有一把可以打开任何房间的钥匙。然后,当你尝试使用这把“不存在”的钥匙去打开一个房间并放置一些东西(例如1)时,你就闯入了一个未知的空间,这可能导致各种问题,包括但不限于程序崩溃。
为了避免这类问题,你应该始终确保你的指针被正确初始化,并且在解引用之前,它们确实指向一个合法的内存地址。例如,我们可能需要分配内存(使用new或malloc)或让指针指向一个已存在的变量。
int *p = (int*)malloc(sizeof(int)); // 为整数分配内存,并将地址赋给指针p
if (p != NULL) { // 检查内存分配是否成功*p = 1; // 现在可以将值1安全地赋给p所指向的内存位置
}
——————————————————————
如下图所示,存在有问题的语句但是却通过了编译。(编译需要点击Build键)

但是当我们在运行时就会出现问题。

如图程序中的报错就代表了程序已经崩溃了,当出现这种报错时,由于它没有显示哪行出现了何种问题的提示,我们就需要对程序进行debug(如放断点)
这时我们需要在项目的CMakeLists.txt文件中直接设置CMAKE_BUILD_TYPE变量。格式如下:
set(CMAKE_BUILD_TYPE "Debug")
将这行代码放在CMakeLists.txt文件的开始部分,可以确保整个项目以Debug模式构建。
现在的配置文件整体如下:

4.在编辑完配置文件后点击Build编译,随后可以在文件中设置断点。注意要如下图设置,打开边框选项,易添加断点。

随后选择对应行,右键添加断点即可。

5.随后要使程序进入该断点,首先需要告诉它我想执行哪个程序(配置文件中有多个可执行文件)

Configure Launches允许你为你的项目设置不同的运行配置。这些配置定义了如何启动和运行你的程序,包括指定可执行文件、命令行参数以及执行环境等。当想要运行或调试你的程序时,需要告诉KDevelop如何启动它。这就是Configure Launches发挥作用的地方。
随后操作如图所示。

6.点击Debug,随后程序就会停在断点处。点击红框处便会显示step out、step over、step into了
![]()
若显示当前配置不支持debug,需要查看是否选择正确的执行文件,如下图

调试示意图:当从第八行继续step over后,原本p为0,并弹出错误提示(SIGSEGV)。

SIGSEGV错误,全称为Segmentation Fault,是一种在Unix-like操作系统中常见的程序错误信号。它表示程序试图访问其没有权限访问的内存区域,或者访问的内存地址不存在。
引起SIGSEGV错误的原因可能包括:
- 野指针:访问已经释放或未初始化的指针。
- 空指针解引用:试图访问一个值为NULL的指针所指向的内存。
- 数组越界:访问数组时超出了其边界。
- 非法内存访问:试图写入只读内存区域。
- 内存泄漏:程序中存在内存泄漏,导致内存不足或分配错误。
- 指针操作不当:例如指针越界等。
- 使用未映射到进程内存空间的指针:这可能意味着使用了错误的指针值。
- 栈溢出:函数调用层次过深,超过了栈的最大容量。
- 并发问题:在多线程环境中,不当的同步机制可能导致内存访问冲突。
- 硬件问题:极少数情况下,硬件故障也可能导致SIGSEGV错误。
7.点击Frame Stack就可以看到具体哪里出现错误了


8.修复错误后可以点击Build重新编译或点击Execute运行,看看是否正常运行。
相关文章:
在kdevelop中运行程序并调试
补充前序知识: 1.CMakeLists.txt文件中,如下图,第一行生成的是静态库文件(我们前一讲所使用的),第二行是动态库文件。 静态库与动态库: 静态库(Static Libraries) 定义…...
MySQL数据库-SQL编程
一、触发器 1.触发器简介 触发器(trigger)是一个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, u…...
TypeError: Components is not a function
Vue中按需引入Element-plus时,报错TypeError: Components is not a function。 1、参考Element-plus官方文档 安装unplugin-vue-components 和 unplugin-auto-import这两款插件 2、然后需要在vue.config.js中配置webPack打包plugin配置 3、重新启动项目会报错 T…...
GuLi商城-商品服务-API-平台属性-销售属性维护
公用之前的接口,改下入参:...
使用Leaflet GeoMan结合天地图进行自由标绘实战
目录 前言 一、Leaflet GeoMan是什么 1、关于Leaflet GeoMan 2、关于开源版和企业版 3、相关的方法介绍 二、使用Geoman来进行自由标绘实战 1、相关资源准备 2、新建html网页 3、初始化地图及绑定Geoman控件 三、自由标绘的成果 1、整体效果 2、添加空间对象 3、开…...
Flutter自定义通用防抖的实现
在前端项目开发中,点击事件的防抖是一个永远无法错开的点,特别是针对一些复杂的业务场景,如果不做好防抖操作,就会导致页面或功能触发多次,引发异常或闪退。 在Flutter中可以通过扩展函数的特性 对Function增加全局扩…...
C# Unity 面向对象补全计划 之 继承(字段与属性)
本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列旨在通过补全学习之后,给出任意类图都能实现并做到逻辑上严丝合缝 Q:为什么要单讲继承字段与属性,不讲继承方法了吗&#x…...
leetcode202. 快乐数,双指针法巧用
leetcode202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果这个过程…...
基于Cobbler实现多版本系统批量部署
一、实验题目 基于Cobbler实现多版本操作系统的批量部署。 二、实验目的 掌握Cobbler服务器的安装与配置方法。 学会使用Cobbler进行多版本操作系统的批量部署。 理解PXE网络启动原理及其在操作系统部署中的应用。 提高在实际生产环境中快速部署和管理操作系统的能力。 …...
一投就中不是梦,录取率>80%,最快1个月就见刊,计算机沾边就收,认可度还不低
本次模术狮精心整理5本期刊,最快1个月就见刊,计算机沾边就收,认可度还不低! 1 Knowledge-Based Systems ▲ 图片来源:Knowledge-Based Systems官网 期刊简介:《Knowledge-Based Systems》是人工智能领域的…...
【课程系列06】某乎AI大模型全栈工程师-第6期
网盘链接 链接:https://pan.baidu.com/s/1QLkRW_DmIm1q9XvNiOGwtQ --来自百度网盘超级会员v6的分享 课程目标 【知乎大模型课程】学习的四个维度 👉指挥层:学高阶指令工程 AI编程等,指挥大模型完成90%代码任务,包…...
Prompt——3分钟掌握,润色论文的7条经典指令。帮助很大,一定要看!
这是一篇帮助你润色论文的ChatGPT指令合集,整理了润色过程中语法优化、审阅校对、专业风格等7个主要方面。 建议收藏,需要的时候直接CtrlV即可,一定对你科研有所帮助~ 1. 修复语法和句法 第一个提示是修复语法和句法。这是任何写作的关键部…...
ARM学习(31)编译器对overlay方式的支持
ARM学习(31)编译器对overlay方式的支持 1、overlay介绍 overlay:重叠得意思,就是可以重复利用得空间,一般在内存上使用这种空间。比如以Windows操作系统为例,其存储空间(ROM/FLASH)…...
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
问题现象 BeetISQL中间件版本:2.13.8.RELEASE 客户在调用BeetISQL提供的api向yashandb的表中执行batch insert并将返回sequence设置到传入的java bean时,报如下异常: 问题的风险及影响 影响业务流程正常执行,无法获得batch ins…...
软件测试——用例篇(上)
概念 什么是测试⽤例? 测试⽤例(Test Case)是为了实施测试⽽向被测试的系统提供的⼀组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素 设计测试⽤例原则⼀: 测试⽤例中⼀个必需部分是对…...
Flink中三种模式:YARN Session 模式、YARN Per-Job 模式和 YARN Application 模式提交任务命令
在 Apache Flink 中,YARN 提供了多种模式来提交和管理作业,每种模式都有其独特的特点和适用场景。主要有以下三种模式:YARN Session 模式、YARN Per-Job 模式和 YARN Application 模式。 1. YARN Session 模式 在 YARN Session 模式中,一个长时间运行的 Flink 会话(Sess…...
DBMS-1.2 关系运算
本文章的素材与知识均来自于李国良老师的数据库管理系统课程。 关系代数 一.基本关系代数运算 基本关系代数运算包括:选择、投影、并、差、笛卡尔积、重命名。 1.选择(select) 选择运算用于从关系R中获取满足条件的元组。 (1…...
Python——继承
一、继承 1. 什么是继承? 继承是一种面向对象编程的机制,允许一个类(子类)从另一个类(父类)继承属性和方法。子类可以扩展或修改父类的功能。 2. 如何实现继承? 在Python中,实现…...
程序员转型AI大模型好转吗?成功率高吗?
前言 在程序员圈子中,技术转型近年来一直是热门话题。随着AI技术的迅猛发展,优秀人才短缺,程序员向AI大模型转型似乎成为了一条通往职场先机的路径。但是,这条转型之路是否容易走,成功率又如何呢? 一、程…...
关于 Postman 这些你都知道吗?
Postman是接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各种http请求,将请求的数据发送到服务端,获取对应的结果,从而测试接口是否能够满足业务功能要求,很直…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
