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 文件示例:

cpp 复制代码
#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

cpp 复制代码
#ifndef _DEMO1_H_
#define _DEMO1_H_

int factorial(int n);

#endif   // _DEMO1_H_
~

demo1.cc

cpp 复制代码
#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

cpp 复制代码
#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

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

相关推荐
懒羊羊大王呀几秒前
Ubuntu20.04中MySQL的安装和配置
linux·mysql·ubuntu
浅安的邂逅7 分钟前
Ubuntu apt-get安装-报错:尝试“apt --fix-broken install”有未能满足的依赖关系,几种解决办法
linux·ubuntu·apt install
我命由我123459 分钟前
STM32 开发 - 中断案例(中断概述、STM32 的中断、NVIC 嵌套向量中断控制器、外部中断配置寄存器组、EXTI 外部中断控制器、实例实操)
c语言·开发语言·c++·stm32·单片机·嵌入式硬件·嵌入式
CodeWithMe1 小时前
【软件开发】上位机 & 下位机概念
c++
luofeiju1 小时前
数字图像处理与OpenCV初探
c++·图像处理·python·opencv·计算机视觉
whoarethenext1 小时前
使用 C/C++的OpenCV 将多张图片合成为视频
c语言·c++·opencv
weixin_428498491 小时前
Catch2 开源库介绍与使用指南
c++
爱瑞瑞1 小时前
🐧深入浅出的认识 Linux 指令
linux·shell
金玉满堂@bj1 小时前
《Playwright:微软的自动化测试工具详解》
测试工具·microsoft·自动化
freyazzr1 小时前
TCP/IP 网络编程 | Reactor事件处理模式
开发语言·网络·c++·网络协议·tcp/ip