当前位置: 首页 > 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请求,将请求的数据发送到服务端,获取对应的结果,从而测试接口是否能够满足业务功能要求,很直…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...

深度学习水论文:mamba+图像增强

🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据,随后读取数据,通过ReportLab生成横向PDF表格,包含格式化(两位小数)及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...

python可视化:俄乌战争时间线关键节点与深层原因

俄乌战争时间线可视化分析:关键节点与深层原因 俄乌战争是21世纪欧洲最具影响力的地缘政治冲突之一,自2022年2月爆发以来已持续超过3年。 本文将通过Python可视化工具,系统分析这场战争的时间线、关键节点及其背后的深层原因,全面…...