valgrind

欢迎访问我的博客首页


1. 测试程序


  我们使用下面的代码测试内存。

void f5() {
    int *p = new int(7);
    delete p;
    *p = 20;
}

int main(int argc, char **argv) {
    f5();
    cout << "All tests passed" << endl;
}

2. 使用编译选项测试


2.1 配置文件


  配置文件 CMakeLists.txt 内容如下。

cmake_minimum_required(VERSION 3.5.1)
project(cc)

SET(CMAKE_BUILD_TYPE Debug)
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -Wno-attributes -Wno-unused")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -Wno-attributes")

find_program(MEMORYCHECK_COMMAND valgrind)
set(MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full")
include(CTest)
enable_testing()

add_executable(${PROJECT_NAME}
    main.cc
)
add_test(NAME test1
    COMMAND ${PROJECT_NAME}
)
set_tests_properties(test1 PROPERTIES
    PASS_REGULAR_EXPRESSION "All tests passed"
    FAIL_REGULAR_EXPRESSION "Some tests failed"
)
include(Dart)

  第 4 行指定编译类型。第 5 行指定编译选项,参数 -Wno-attributes 可以让 valgrind 告诉我们内存泄漏的行号。

  第 8 至 11 行启用 valgrind 测试。

  第 16 至第 18 行测试可执行程序 ${PROJECT_NAME}。第 19 至 22 行在该测试中检查程序输出。

2.2 执行测试


  先使用 cmake 和 make 命令编译,再使用 ctest -T memcheck 命令测试。命令行会输出对程序输出内容的检查结果和对内存泄漏的检测结果的简要内容。详细的内存泄漏情况在编译输出目录下的 Testing/Temporary/MemoryChecker.*.log 中。

3. 直接测试


  直接测试时只需在配置文件 CMakeLists.txt 中指定编译和优化方式。

cmake_minimum_required(VERSION 3.5.1)
project(cc)

SET(CMAKE_BUILD_TYPE Debug)
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -Wno-attributes -Wno-unused")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -Wno-attributes")

add_executable(${PROJECT_NAME}
    main.cc
)

  先使用 cmake 和 make 命令编译,再使用下面的任意一个命令测试。

valgrind --leak-check=full ./cc
valgrind --tool=memcheck ./cc

4. 参考


  1. 内存检查工具 valgrind,优快云,2024。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值