valgrind

asan(AddressSanitizer)内存诊断(越界,非法访问等)工具使用---一款比valgrind更好用的工具

痞子三分冷 提交于 2020-11-04 16:37:58
操作系统:centos8 gcc:8.3.1 asan是gcc原生的内存诊断工具,可以诊断内存越界,非法访问,内存泄漏,内存double free等常见内存问题,并且效率比valgrind高好几倍,可以克服valgrind的一些问题,比如占用内存高的问题,是一款比valgrind更好用的内存问题分析工具! 1.准备工作: 1.在编译环境上安装asan的开发库 yum install libasan.x86_64 2.在运行环境上安装asan的开发库,如果运行环境无法联网,可以先用yum download下来,再放到运行环境上安装 2.编译 CFLAGS+=-fsanitize=address -fno-omit-frame-pointer -fsanitize-recover=address //需要与环境变量ASAN_OPTIONS=halt_on_error=0配合使用 SYSLIB+=-lasan //如果找不到库,还需要加上-L加上库的路径 3.运行 export ASAN_OPTIONS=halt_on_error=0 //使进程检测出内存错误的时候别退出 export ASAN_OPTIONS=alloc_dealloc_mismatch=0 //不检测内存不匹配的情况,例如 new [] 与delete point 不匹配 asan的选项很多,可以根据需要设置ASAN

SRS源码—— Thread笔记

拟墨画扇 提交于 2020-11-02 15:46:24
SRS源码中的Thread是一层套一层,最终的Thread类是在 srs_app_thread.cpp 的 SrsThread 类 这里我们暂且先放下协程的概念,把它当线程来看,其逻辑如下: 1. 在start() 方法中创建线程: int SrsThread::start() { int ret = ERROR_SUCCESS; if (tid) { srs_info( " thread %s already running. " , _name); return ret; } if ((tid = st_thread_create(thread_fun, this , (_joinable? 1 : 0 ), 0 )) == NULL){ ret = ERROR_ST_CREATE_CYCLE_THREAD; srs_error( " st_thread_create failed. ret=%d " , ret); return ret; } disposed = false ; // we set to loop to true for thread to run. loop = true ; // wait for cid to ready, for parent thread to get the cid. while (_cid < 0 ) { st_usleep(

valgrind

北战南征 提交于 2020-11-01 18:20:52
介绍地址 使用简介 来源: oschina 链接: https://my.oschina.net/u/3732258/blog/3052284

C++

一笑奈何 提交于 2020-10-27 09:17:40
一.变量 1)全局变量与static变量?(作用域、生存周期) 2) static函数与普通函数的区别? 3)两个文件中声明两个同名变量?(使用了与未使用extern?) 4)全局数组和局部数组的初始化? 5) 指针和引用的区别 ?(代表意义、内存占用、初始化、指向是否可改、能否为空) 6) C/C++中的强制转换 7) 如何修改const变量、const与volatile 8)静态类型获取与动态类型获取( typeid 、dynamic_cast:转换目标类型必须是引用类型) 9) 如何比较浮点数大小? ( 直接使用==比较出现错误的例子 ) 二.函数 1)重载( 参数必须不同(const修饰形参) 、重载与作用域、继承中的重载(using)、重载与const成员函数) 三.类 1)面向对象的三大特性(封装、继承、多态) 2) struct和class的区别? 3) 访问权限说明符 ?(目的是加强类的封装性) 4)类的静态成员(所属?静态成员函数不能声明成const、类类型的成员、定义时不能重复使用static、具有类内初始值的静态成员定义时不可再设初值) 5)构造函数相关 有哪些构造函数(默认、委托、拷贝、移动) 合成的默认拷贝构造函数(默认行为?什么情况下不会合成?怎么解决?如果成员包含类内初始值,合成默认构造函数会使用该成员的类内初始值初始化该成员) 拷贝构造函数(调用时机

Linux centos7 c++ 内存泄漏定位

烈酒焚心 提交于 2020-10-27 04:15:12
最近被公司一个新产品的内存泄漏搞得焦头烂额,该产品属于主线代码的一个分支,代码大致相同,只是硬件很不一样,但是主线却没有内存泄漏,分支每天都会有400M的泄漏,临近过点,亚历山大。 内存泄漏这次在操作系统层面总结下来分为四类:堆泄漏,栈堆积,系统资源泄漏,内存碎片 从出现概率来说逐渐降低,所以定位顺序也依次展开 1.堆泄漏   也就是new/malloc没有对应释放,这个一般来说直接用valgrind直接跑就完事,这里看到安装valgrind网上大部分都是官网下载源码到服务器编译安装,由于该产品glibc版本较低且没有安装gcc,也找不到配套的低版本的gcc,于是直接下载了valgrind的rpm包,直接拷到服务器安装,一顿猛操作后发现,有打印一些明确泄漏的,但是最多几个字节,剩余的可能泄漏点都是程序初始化申请的固定内存,不太可能造成每天几百兆的泄漏。   防止工具不给力,还在代码里在几个频繁申请内存的地方加了引用计数,观察到内存增长时引用计数也没有增长,大概不是这个原因。 2.栈堆积   可能时某个队列积攒了大量数据导致的内存增长,但是增加打印观察队列数也没有增长 3.系统资源泄漏   有可能是线程句柄、套接字句柄、文件句柄没有正常关闭,比较分支和主线代码,发现有一处pthread_create后,线程结束后没有回收资源,需要调用下pthread_deatch,

Valgrind移植

强颜欢笑 提交于 2020-10-19 13:33:55
Valgrind移植与使用教程 源码版本:valgrind-3.16.1.tar.bz2 ubutun版本:20.04 交叉编译链:arm-none-linux-gnueabi- 交叉编译命令介绍: configure配置说明 说明 –build 执行代码编译的主机 –host 程序最终要运行的主机 –target 用build主机上的编译器,编译一个新的编译器( 如gcc),这个新的编译器将来编译出来的其他程序将运行在target指定的系统上 –prefix 指定编译出来的版本存放路径,默认放在“/usr /local/bin” CC CXX CPP 交叉编译器配置CC=arm-none-linux-gnueabi-cc CPP=arm-none-linux-gnueabi-cpp CXX=arm-none-linux-gnueabi-g++ 安装步骤: 编译linux版本 1.解压并运行valgrind自动make脚本 vmuser@vmuser-virtual-machine:tar jxvf valgrind-3.16.1.tar.bz2 vmuser@vmuser-virtual-machine:~/valgrind-3.16.1$ sudo apt-get install automake vmuser@vmuser-virtual-machine:~/valgrind

c/c++常用工具使用(linux下)

我怕爱的太早我们不能终老 提交于 2020-10-03 18:50:25
格式化工具: astyle libevent工具: doxygen :(创建文档 从注释里面提取对应的文档) 安装: sudo apt-get install -y doxygen 步骤:1.在*.h文件写注释 并将文档提取出出来 eg: 2. xx -doxygen -g 自动生成Doxyfile文件 3.vim DoxyFile 进行参数的修改 eg: DROJECINAME=" " DROJECTBRIEF=" " OUTPUT_LANGUAGE=" " 等相关参数的修改 4.doxygen 生成 html文件进行访问查看 cppcheck : 1.安装: sudo apt-get install -y cppcheck 2.文档:cppcheck 3.使用: cppcheck --enable=all ./ cppcheck --enable=all --check-config xx.cpp valgrind :用于检查内存泄漏 使用 valgrind ./a.out cpptest :c++用于做单元测试的库 1.安装: sudo apt-get install -y libcpptest-dev 2.编写测试用例: 文件gcov(系统自带) lcov自己安装 来源: oschina 链接: https://my.oschina.net/u/4406698/blog

C++移动构造函数以及move语句简单介绍

£可爱£侵袭症+ 提交于 2020-09-28 18:47:41
首先看一个小例子: #include <iostream> #include <cstring> #include <cstdlib> #include <vector> using namespace std; int main() { string st = " I love xing " ; vector < string > vc ; vc.push_back(move(st)); cout <<vc[ 0 ]<< endl; if (! st.empty()) cout <<st<< endl; return 0 ; } 结果为: #include <iostream> #include <cstring> #include <cstdlib> #include <vector> using namespace std; int main() { string st = " I love xing " ; vector < string > vc ; vc.push_back(st); cout <<vc[ 0 ]<< endl; if (! st.empty()) cout <<st<< endl; return 0 ; } 结果为: 这两个小程序唯一的不同是调用vc.push_back()将字符串插入到容器中去时, 第一段代码使用了move语句

Filter calls to libc from valgrind's callgrind output

时间秒杀一切 提交于 2020-08-22 06:16:46
问题 I'm trying to generate a call graph for a server for documentation purposes. Not for any kind of profiling. I generated the output with: sudo valgrind --tool=callgrind --dump-instr=yes /opt/ats-trunk/bin/traffic_server and converted with: http://code.google.com/p/jrfonseca/wiki/Gprof2Dot to a .dot file, but this contains way too much info to be useful as documentation. I would like to filter out the calls to libraries such as libc, libstdc++, libtcl, libhwloc and whatnot. n.b.: I've been