linux 中 C++的环境搭建以及测试工具的简单介绍

文章目录

    • makefle
    • CMake
    • gdb调试 与 coredump
    • Valgrind 内存检测
    • gtest 单元测试

makefile  介绍

安装 :   sudo apt install make

makefile 的规则:   举例说明

包括:目标文件 、 依赖文件 、 生成规则

使用 : make   

make  clean 

CMake :

CMake是一个跨平台的构建工具,用于管理和生成C++项目的构建过程。它可以自动生成Makefile、Visual Studio项目文件、Xcode项目文件等,极大地简化了源代码跨平台构建的过程。

安装 :  sudo apt-get  install  cmake   。

linux 中使用 CMake 生成 Makefile 并编译流程

- 编写CMake 配置文件  CMakeList.txt . 

- 执行命令 cmake PATH 生成 Makefile 其中 PATH 是 CMakeList.txt所在的目录

-使用   cmake   命令进行编译

CMakeLists.txt 文件示例:

#CMakeLists.txt    基础用法#CMake  最低版本要求
cmake_minimum_required(VERSION 3.27.4)#项目信息
project(project.exe)#指定生成的文件
add_executable(CMake project.exe  project.c  speak.c)
执行 cmake .     (会在当前文件下 ,生成一个Makefiles )

gdb调试 与  coredump

gdb 是linux 程序员的一大利器

安装 sudo  apt-get  install  gdb

使用前提: 文件编译的时候 带上 -g 

gcc  -g   project.c  -o  project.exe   

启动:

gdb  project.exe

gdb  常用命令

- 获取帮助   hlep 

break  设置断点 , 命令接收行号 或者函数作为参数

- info break   可以查看断点   

- clear    可以清除断点

- run  运行程序到达中断处    

-next 命令(缩写 n )  单步执行   可以指定数字    n   1(其他的都可以)

-continue 命令(缩写 c )  想要继续执行 , 直到遇到下一个断点

- print (缩写 p )   监视变量

- 临时修改变量    命令  set  var    如set  var   a= 100

- bt 查看堆栈情况

Coredump  调试

在程序运行过程中出现严重错误导致程序崩溃时,操作系统将程序的内存状态保存到一个特殊的文件中,以便进行后续的调试和分析。

当程序发生错误时,操作系统会默认生成一个core文件,其中包含了程序崩溃时的内存状态、寄存器值、堆栈信息等。这个core文件可以被调试器工具(如gdb)加载,用于分析程序崩溃的原因。

前期设置:

- 1 . 设置core 文件的生成的目录 , 其中%e表示程序文件名 , %p 表示进程的ID ,

        如果不设置,那么会在当前目录生成  core 文件

        方法:   echo /data/coredump/core.%e.%p > /proc/sys/kernel/core_pattern

        我们要确保   data  和 coredump存在 ,  mkdir  自己创建一个,你也可以放在其他文件下

         我这里放在了 / 根目录下

 使用cat  查看core的生成目录

-  2 .  将生成的 core 改成不受限制    ulimit  -c  unlimited

什么情况下会导致程序异常退出:

- 非法指针的访问 ,堆栈溢出

如何调试:

1> 编译时添加 -g  选项 ,增加调试信息

2> gdb  project.exe  core  core_file       (core文件的目录)

- bt  或者 where 查看调用栈的信息

-     查看某一层的信息  frame   n     (n  从0开始 , frame  0 表示栈顶)

- up  n      上移n 层

-down  n    下移

- info  frame  查看当前层的信息

- info  args  查看当前函数的参数名及其值

- info  locals   打印当前函数中所有局部变量及其值

内存检测 Valgrind

检测和调试程序的开源工具。

它主要用于发现和分析内存泄漏、访问越界、使用未初始化的变量等常见的程序错误。

使用Valgrind可以帮助开发人员在早期发现和解决潜在的内存错误,提高代码的质量和可靠性。

安装:   sudo  apt-get install valgrind

Memcheck   检查步骤

1.  编译时带上   -g

2. 执行 :   

valgrind  --tool=memcheck  --leak-check   ./you  program 


 

部分结果分析

  1. "All heap blocks were freed -- no leaks are possible": 这表示程序在退出之前已经正确释放了所有的堆内存,并且没有内存泄漏。

  2. "ERROR SUMMARY: n errors from m contexts": 这表示Valgrind检测到n个内存错误,并且这些错误发生在m个上下文中。Valgrind会提供更详细的错误信息,以便你能够定位和修复这些问题。

  3. "Invalid read/write of size n": 这表示程序尝试读取或写入大小为n的内存块,但该内存块的访问是无效的。可能存在越界访问、空指针解引用等问题。

  4. "Conditional jump or move depends on uninitialised value(s)": 这表示程序在条件分支或移动操作中使用了未初始化的值。这可能导致不可预测的行为。

  5. "Invalid free/delete": 这表示程序尝试释放一个无效的内存块。通常是因为重复释放、野指针等问题。

gtest 单元测试

用于C++的流行单元测试框架,可以帮助你编写和运行自动化的单元测试代码

搭建测试框架:

下载方法 : git clone https://github.com/google/googletest.git

1  cd   googletest

2  cmake   ./

3  make

最后 sudo make install  大功告成 

测试demo:

demo1.h

#ifndef _DEMO1_H_
#define _DEMO1_H_int factorial(int n);#endif   // _DEMO1_H_
~

demo1.cc

#include "demo1.h"int factorial( int n){int result = 1;for( int i=1 ;i<=n; i++){result *=i;}return result;
}
~

接下来,我们测试factorial 函数是否正确 ,编写一个测试用例   demo1_main.cc


#include <limits.h>
#include "demo1.h"
#include "gtest/gtest.h"namespace{TEST( factorialTest ,Negative ){//负数EXPECT_EQ(1 , factorial(-5));EXPECT_EQ( 1 , factorial(-1));EXPECT_GT( factorial(-10) , 0);}TEST(factorialTest , Zero){EXPECT_EQ( 1 , factorial(0));
}TEST( factorialTest , Positive){EXPECT_EQ(1 , factorial(1));EXPECT_EQ(2 , factorial(2));EXPECT_EQ(6 , factorial(3));EXPECT_EQ(40320 , factorial(8));
}}   //namespace
~

说明:

- 1、 TEST 是 gtest 的测试宏 ,我们的测试用例必须这样写

- 2、factorialTest  是测试套的名字 ,一个测试套可以包含多个测试用例

- 3、 EXPECT_EQ 、EXPECT_GT  等等都是 gtest  提供的测试断言

- 4、EXPECT_EQ 会返回成功,或者失败 ,既我们测试用例的成功或者失败

- 5编译: 

g++  demo1.cc demo1_main.cc  -lgtest  -std = c++11  -lgtest_main  -lpthread  -o  demo   

- 6 、 执行 ./demo

如果全部是绿色的· , 那么恭喜你,写的方法可能没有问题。

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

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

相关文章

046.Python包和模块_导入相关

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

『番外篇五』SwiftUI 进阶之如何动态获取任意视图的 tag 和 id 值

概览 在某些场景下,我们需要用代码动态去探查 SwiftUI 视图的信息。比如任意视图的 id 或 tag 值: 如上图所示:我们通过动态探查技术在运行时将 SwiftUI 特定视图的 tag 和 id 值显示在了屏幕上。 这是如何做到的呢? 在本篇博文,您将学到如下内容: 概览1. “如意如意,…

手敲MyBatis(十三章)-返回Insert操作自增索引值

1.目的 这一章的目的主要是插入语句以后返回插入记录的id&#xff0c;因为插入语句可分为要返回记录id&#xff0c;不要返回记录id的以及不同数据源类型执行的时机也不同&#xff08;如&#xff1a;oracle不支持主键&#xff0c;需要先插入序列再增加&#xff0c;Mysql支持主键…

SQL指南:掌握日期函数来查询和管理数据

文章目录 1. 引言2. 建立数据库表2.1 建表语句2.2 数据插入 查询案例3.1 查询当前日期的订单3.2 查询过去一周内的订单3.3 查询明天的日期3.4 查询今年的订单3.5 查询特定月份的订单 总结 1. 引言 在数据库管理中&#xff0c;处理日期和时间是一项基本但重要的任务。本指南将通…

数智金融技术峰会|数新网络受邀分享《金融信创湖仓一体数据平台架构实践》,敬请期待

12月23日&#xff0c;数新网络参加DataFunSummit 2023&#xff1a;数智金融技术峰会。会上&#xff0c;数新CTO原攀峰将为大家带来《金融信创湖仓一体数据平台架构实践》 主题分享。 本次峰会由DataFun联合火山引擎、蓝驰等知名企业举办&#xff0c;将共同为大家带来一场数智金…

玩转Instagram Shop只需要学会这些功能

Instagram Shop作为Instagram下属的电商购物平台。用户可以通过浏览Instagram上的推荐产品和品牌&#xff0c;在无需离开应用的情况下了解并购买新的商品。对于经常使用Instagram的用户来说是个很便捷的购物渠道。面对这个新渠道&#xff0c;我们又该如何玩转它呢。这篇文章就会…

【沐风老师】3dMax篮球建模方法详解

3dMax足球、排球和篮球建模系列之&#xff1a;篮球建模。对于足球和排球建模&#xff0c;思路是从一个基础模型开始&#xff0c;利用这个基础模型与最终的足球&#xff08;或排球&#xff09;模型的某些相似之处&#xff0c;经过修改编辑&#xff0c;最终完成目标模型的建模。但…

ansible的playbook

1、playbook的组成部分 &#xff08;1&#xff09;task任务&#xff1a;在目标主机上执行的操作&#xff0c;使用模块定义这些操作&#xff0c;每个任务都是一个模块的调用 &#xff08;2&#xff09;variables变量&#xff1a;存储和传递数据&#xff08;变量可以自定义&…

Java可变参数(学习推荐版,通俗易懂)

定义 可变参数本质还是一个数组 示例代码 注意事项 1.形参列表中&#xff0c;可变参数只能有一个 2.可变参数必须放在形参列表的最后面 注意是最后面。 name也可以为int类型

【C#】TimeSpan

文章目录 概述属性时间计算拓展来源 概述 TimeSpan结构&#xff1a;表示一个时间间隔。 它含有以下四个构造函数&#xff1a; TimeSpan(Int64)将 TimeSpan结构的新实例初始化为指定的刻度数。&#xff08;DateTime.Tick:是计算机的一个计时周期&#xff0c;单位是一百纳秒&…

3. 行为模式 - 迭代器模式

亦称&#xff1a; Iterator 意图 迭代器模式是一种行为设计模式&#xff0c; 让你能在不暴露集合底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合中所有的元素。 问题 集合是编程中最常使用的数据类型之一。 尽管如此&#xff0c; 集合只是一组对象的…

数据结构(八):图介绍及面试常考算法

一、图介绍 1、定义 图由结点的有穷集合V和边的集合E组成。其中&#xff0c;结点也称为顶点。一对结点&#xff08;x&#xff0c; y&#xff09;称为边&#xff08;edge&#xff09;&#xff0c;表示顶点x连接到顶点y。边可以包含权重/成本&#xff0c;显示从顶点x到y所需的成…

深入解析Python装饰器及*args, **kwargs的妙用

深入解析Python装饰器及*args, **kwargs的妙用 简介&#xff1a; ​ 装饰器&#xff08;Decorator&#xff09;是 Python 中一种强大的语法特性&#xff0c;它允许在不修改原始函数代码的情况下&#xff0c;动态地扩展函数的功能。装饰器是函数或类&#xff0c;用于包装其他函…

云上荆楚丨云轴科技ZStack成功实践精选(湖北)

湖北自古以来有九省通衢的美称&#xff0c;地处长江中游&#xff0c;富有荆楚之美誉&#xff0c;灵秀之蕴意。2022年湖北数字经济强省三年行动计划正式印发&#xff0c;计划到“十四五”末&#xff0c;数字经济核心产业增加值力争达到7000亿元&#xff0c;占GDP的比重超过12%。…

《每天一分钟学习C语言·七》指针、字节对齐等

1、 对于二维数组如a[3][4]可以当做有三个元素的一维数组&#xff0c;每个元素包含四个小元素。 2、 printf(“%-5d”, i); //负号表示左对齐&#xff0c;5d表示空五个光标的位置 3、 栈&#xff1a;先进后出&#xff0c;堆&#xff1a;先进先出 4、 &#xff08;1&#xff…

位运算:Leetcode137.只出现一次的数字(2)

题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 示例 1&#xff1a; 输入&#xff1a;nums [2,2,3,2] 输出&#xff1a;3示例 2&#xff1a; 输入&…

《工具箱-SVN》SVN安装、备份、迁移教程

文章目录 一、服务器搭建SVN1.检查SVN是否存在2.安装SVN3.创建版本库4.创建版本库存放文件地址5.修改配置文件5.1 vim authz5.2 vim passwd5.3 vim svnserve.conf 6.启动并查看SVN7.SVN Checkout8.SVN Update9.SVN Commit 二、SVN-无法连接主机&#xff0c;目标计算机积极拒绝&…

案例 | 电源自动检测测试系统为某电子科技公司定制电源测试解决方案

一、测试背景 陕西某电子科技公司是一家专业生产设计军品电源、集成电路以及电子元器件的高新技术企业&#xff0c;公司虽有一套半自动ATE测试系统&#xff0c;但使用过程繁琐复杂且无法满足日益增长的测试需求&#xff0c;因此公司现需要一套更加优秀的全自动电源测试系统来应…

工具系列:PyCaret介绍_多分类代码示例

&#x1f44b; 工具系列&#xff1a;PyCaret介绍_多分类代码示例 PyCaret 介绍 PyCaret是一个开源的、低代码的Python机器学习库&#xff0c;可以自动化机器学习工作流程。它是一个端到端的机器学习和模型管理工具&#xff0c;可以大大加快实验周期并提高生产效率。 与其他开…

HDFS NFS Gateway(环境配置,超级详细!!)

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f618;《CTF专栏》超级详细的解析&#xff0c;宝宝级教学让你从蹒跚学步到健步如飞&#x1f648; &#x1f60e;《大数据专栏》大数据从0到秃头&#x1f47d;&…