当前位置: 首页 > news >正文

在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)时,你就闯入了一个未知的空间,这可能导致各种问题,包括但不限于程序崩溃。

        为了避免这类问题,你应该始终确保你的指针被正确初始化,并且在解引用之前,它们确实指向一个合法的内存地址。例如,我们可能需要分配内存(使用newmalloc)或让指针指向一个已存在的变量。

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错误的原因可能包括:

  1. 野指针:访问已经释放或未初始化的指针。
  2. 空指针解引用:试图访问一个值为NULL的指针所指向的内存。
  3. 数组越界:访问数组时超出了其边界。
  4. 非法内存访问:试图写入只读内存区域。
  5. 内存泄漏:程序中存在内存泄漏,导致内存不足或分配错误。
  6. 指针操作不当:例如指针越界等。
  7. 使用未映射到进程内存空间的指针:这可能意味着使用了错误的指针值。
  8. 栈溢出:函数调用层次过深,超过了栈的最大容量。
  9. 并发问题:在多线程环境中,不当的同步机制可能导致内存访问冲突。
  10. 硬件问题:极少数情况下,硬件故障也可能导致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请求,将请求的数据发送到服务端,获取对应的结果,从而测试接口是否能够满足业务功能要求,很直…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...