tool站长工具,项目代理,wordpress的数据库,规划管理部门的网站建设文章目录 makefleCMakegdb调试 与 coredumpValgrind 内存检测gtest 单元测试 makefile 介绍
安装 : sudo apt install make
makefile 的规则: 举例说明
包括#xff1a;目标文件 、 依赖文件 、 生成规则 使用 #xff1a; make make clean CMake :
CMake是一个…文章目录 makefleCMakegdb调试 与 coredumpValgrind 内存检测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 --toolmemcheck --leak-check ./you program 部分结果分析 All heap blocks were freed -- no leaks are possible 这表示程序在退出之前已经正确释放了所有的堆内存并且没有内存泄漏。 ERROR SUMMARY: n errors from m contexts 这表示Valgrind检测到n个内存错误并且这些错误发生在m个上下文中。Valgrind会提供更详细的错误信息以便你能够定位和修复这些问题。 Invalid read/write of size n 这表示程序尝试读取或写入大小为n的内存块但该内存块的访问是无效的。可能存在越界访问、空指针解引用等问题。 Conditional jump or move depends on uninitialised value(s) 这表示程序在条件分支或移动操作中使用了未初始化的值。这可能导致不可预测的行为。 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.hint factorial( int n){int result 1;for( int i1 ;in; i){result *i;}return result;
}
~接下来我们测试factorial 函数是否正确 编写一个测试用例 demo1_main.cc #include limits.h
#include demo1.h
#include gtest/gtest.hnamespace{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 c11 -lgtest_main -lpthread -o demo
- 6 、 执行 ./demo 如果全部是绿色的· 那么恭喜你写的方法可能没有问题。