1. 平台clang编译
1.1. windows vs环境
1.1.1. 安装平台工具集
- 以vs2019为例
- 安装以下组件
- 打开 vs 选择 工具 -> 获取工具和功能 -> 单个组件 搜索以下
- 适用于v142的C++ clang-cl 生成工具
- 适用于 windows 的C++ clang编译器
- 工程中选择 LLVM (clang-cl)工具集
2. 内存问题的排查工具和方法– Clang的AddressSanitizer
2.1. 内存泄漏监测
AddressSanitizer是clang中的一个内存错误检测器,它可以检测到以下问题:
- Out-of-bounds accesses to heap, stack and globals
- Use-after-free
- Use-after-return (to some extent)
- Double-free, invalid free
- Memory leaks (experimental)
使用clang编译代码时用-fsanitize=address就能打开AddressSanitizer工具,为了在检测到内存错误时打印出您的程序调用栈,需要在编译时加上选项 -fno-omit-frame-pointer选项,同时为了得出更清晰的调用栈信息,请用-O1选项编译程序。
注意: gcc4.8+增加对-fsanitize=address, -fsanitize=leak的支持
2.2. 示例代码
- core.c
```cpp
#include
#include
struct elem { int a; double b; char* c; };
int main() { char* p = (char*)malloc(sizeof(char) * 10); if (p == NULL) { return 0; }
struct elem* e = (struct elem*)malloc(sizeof(struct elem));
if (e == NULL) {
free(p);
return 0;
}
e->a = 10;
e->b = 10.10;
e->c = p;
double *xx = &e->b;
printf("%f\n", *xx);
free(e);
printf("%f\n", *xx);
return 0; } ``` 上面的代码中有两处问题,一是p未被释放,导致了内存泄漏;二是xx指向了一块被释放了的内存。
2.3. 编译测试
clang -O1 -g -fsanitize=address -fno-omit-frame-pointer -o core core.c
2.4. 检测编译时间
编译目录出出现一个xxx.json 在chrome中输入chrome://tracing/ 把xxx.json扔进去 即可看到火焰图
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ftime-trace")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftime-trace")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ftime-report")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftime-report")
endif()
g++ -ftime-report -o main main.cpp