clang环境设置

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