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,一经查实,立即删除!

相关文章

qt 中sqlite的性能优化与使用问题

SQLite 只支持一个并发的写入操作&#xff0c;但是多个进程可以同时连接和查询相同的数据库。 通过一些简单的配置和操作&#xff0c;我们完全可以使用 SQLite 创建 GB 级别的数据库并且支持高达每秒 10 万次的并发查询。 优化 SQLite 性能的配置如下&#xff1a; pragma jo…

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

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

2.Redis10大数据类型

文章目录 Redis Key&#xff08;键&#xff09;操作命令1.redis字符串 (String)案例&#xff1a;最常用&#xff1a;同时设置/获取多个键值&#xff1a;获取指定区间范围内的值&#xff1a;数值增减&#xff1a;获取字符串长度和内容追加&#xff1a;分布式锁&#xff1a;getse…

『番外篇五』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;处理日期和时间是一项基本但重要的任务。本指南将通…

设计模式之模板方法模式,通俗易懂快速理解,以及模板方法模式的使用场景

文章目录 前言一、使用场景通常二、通过一个故事来更好地理解它当谈到模板方法模式时&#xff0c;我们可以通过一个故事来更好地理解它。以下是对应于故事的代码示例&#xff1a; 前言 当谈到模板方法模式时&#xff0c;在面向对象的编程中&#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;变量可以自定义&…

Nginx conf文件配置

正常地址配置&#xff08;vue打包dist项目&#xff09; server {listen 端口号;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / {root 绝对路径地址;index index.html index.htm;}#error_page 404 /404.h…

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将txt转16进制】

python将txt转16进制 直接上代码 import time print("begin")#读取的txt文件 infile open("xxx.txt","r"); # outfile open("xxx.hex","wb");#开始读文件 a infile.read(1); _combine ""; i0; while a ! \n:i…

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

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

GO设计模式——17、解释器模式(行为型)

目录 解释器模式&#xff08;Interpreter Pattern&#xff09; 解释器模式的核心角色&#xff1a; 优缺点 代码实现 解释器模式&#xff08;Interpreter Pattern&#xff09; 解释器模式&#xff08;Interpreter Pattern&#xff09;提供了评估语言的语法或表达式的方式&am…

SQL server 数据库 SQL语句高级用法

1、表的高级查询 use student select * from stuinfo1 -- 使用 in 的子查询 select * from stuinfo where stu_age in ( select stu_age from stuinfo where cla_id 12345 ) select * from stuinfo where stu_age in ( 19 , 20 , 21 , 25 , 23 , 1…