C/C++内存和crash分析

2018-11-27  本文已影响0人  NullBugs

C/C++内存和crash分析

标签(空格分隔): C/C++ native内存 段错误 native内存泄露 C++Crash C内存泄露


 export ASAN_OPTIONS=detect_leaks=1:detect_stack_use_after_return=1:handle_segv=1 :fast_unfind_on_fatal=1:fast_unwind_on_check=1:fast_unwind_on_malloc=1

cmake增加address flag:

 CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
 PROJECT(SanitizerTest)
 #this is for memory leaks flags, if -O1, memory check is no effective
 set(CMAKE_CXX_FLAGS "-g -fsanitize=address -fno-omit-frame-pointer") 
 ADD_EXECUTABLE(main src/sanitize_test.cpp src/main.cpp)

示例代码:

 #include "sanitize_test.h"
 #include <string>
 #include <stdio.h>
 #include <stdlib.h>
 using namespace std;
 
 int use_aexport ASAN_OPTIONS=detect_leaks=1:detect_stack_use_after_return=1:handle_segv=1:fast_unfind_on_fatal=1:fast_unwind_on_check=1:fast_unwind_on_malloc=1fter_free(){
     int* array = new int[100];
     delete[] array;
     return array[1]; //boom    
 }
 
 int heap_buffer_overflow(){
     int* array = new int[100];
     array[0] = 0;
     int res = array[1 + 100];
     delete[] array;ad
     return res;
 }
 
 int stack_buffer_overflow(){
     int stack_array[100];
     stack_array[1] = 0;
     return stack_array[1001];//boom
 }
 
 int global_array[100] = {0};
 int global_buffer_overflow(){
     return global_array[10001];
 }
 
 int *ptr;
 __attribute__((noinline))
 int use_after_return_impl(){
     int local[100];
     ptr = &local[0];
     return 0;
 }
 
 int use_after_return(){
     use_after_return_impl();
     return ptr[0];
 }
 
 volatile int *p = 0;
 int use_after_scope(){
     {
         int x = 0;
         p = &x;
     }
     *p = 5;
     return 0;
 }
 
 int init_order_bugs(){
 
 }
 
 void *ptr_leak;
 int memory_leaks(){
     ptr_leak = malloc(10);
     ptr_leak = 0;//memory is leaked here
     return 0;
 }

编译执行:

 jazywang$ cmake..
 jazywang$ make
 jazywang$ ./main

执行结果:
use after free


asan_use_after_free.png

memory-leaks:

asan_memory_leaks.jpg
 #include <pthread.h>
 #include <stdio.h>
 
 int Global;
 
 void *Thread1(void *x){
     Global++;
     return NULL;
 }
 
 void *Thread2(void *x){
     Global--;
     return NULL;
 }
 
 int main(){
     pthread_t t[2];
     pthread_create(&t[0], NULL, Thread1, NULL);
     pthread_create(&t[1], NULL, Thread2, NULL);
     pthread_join(t[0], NULL);
     pthread_join(t[1], NULL);
 }

执行编译脚本:

clang src/thread_sanitize.cpp -fsanitize=thread -fPIE -pie -g 
./a.out

threadsanitize会分析多线程之间可能的同步问题,并提示多线程可能造成的问题:

muti_thread.png png.png
[options]: 常用选项,适用于所有Valgrind工具

-tool=<name> 最常用的选项。运行 valgrind中名为toolname的工具。默认memcheck。

memcheck ------> 这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。

callgrind ------> 它主要用来检查程序中函数调用过程中出现的问题。

cachegrind ------> 它主要用来检查程序中缓存使用出现的问题。

helgrind ------> 它主要用来检查多线程程序中出现的竞争问题。

massif ------> 它主要用来检查程序中堆栈使用中出现的问题。

extension ------> 可以利用core提供的功能,自己编写特定的内存调试工具

常用memcheck如下:

#include <stdlib.h>
void *p;
int main(){
    p = malloc(7);
    p = 0;
    return 0;
}

memcheck命令:

clang -g src/memory_leak.cpp
valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all ./a.out

执行结果:


valgrind_memory_check.png
上一篇 下一篇

猜你喜欢

热点阅读