valgrind是如何实现的?
基于仿真方式
在实际处理器的基础上仿真一个虚拟处理器,使应用程序运行于这个虚拟处理器之上,从而进行监视分析。
core dump+内存问题定位:
1.无效指针(野指针)
2.内存泄漏(一般不会报错):申请了内存空间没有释放
2.指针越界(很难发现)
案例分析:用调试工具调试这个core 文件也能定位到代码行, 但是从对应行的代码看, 可能这行代码本身并没有什么问题, 它只是一个“被陷害者”。
1、当时的core文件并没有提供相关的信息。
2、出错的语句是一个赋值语句
3、使用valgrind分析以后发现有一个类内成员变量出现了越界。怀疑是数组越界访问导致被赋值变量的访问出现了问题
内存泄漏、越界可以用valgrind工具包的Memcheck工具进行定位
例如
valgrind --tool=tool_name program_name
一切对malloc()/free()/new/delete的调用都会被捕获。主要用于定位以下的问题
线程死锁问题定位
使用Valgrind中的Helgrind工具进行定位
valgrind --tool=helgrind ./dead_lock
core dump + gdb分析定位
如果编译的时候有调试信息-g,则可以直接用where来定位core dump位置
如果没有,则先用dt 指令查看core堆栈
f n指令进入对应堆栈
调用dissamble即可查看出现问题的位置