首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

堆问题分析的利器——valgrind的massif

堆问题也是内存问题的一部分。如果我们发现程序内存一直在增加,怀疑是内存泄漏,则可以使用《内存问题分析的利器——valgrind的memcheck》一文中介绍的“内存泄露”方法去分析定位。...因为如果不这么设置,则父进程和子进程的记录结果将都掺杂在一个文件中,这会对结果分析带来困扰。当然,如果不会产生子进程,则怎么设置都可以。        ...对比A和B,可以发现,create_destory方法没有发生内存没释放的问题,而test.c第19行调用的create和第22行调用的malloc的空间没有及时释放。        ...再看最后一个快照——24号,可以发现test.c第22行申请的空间已经释放干净。但是第19行调用的create方法申请的空间还是40K——没有释放过——发生了内存泄漏。        ...需要指出的是,massif是在进程结束时才能产生报告的。而服务程序一般都不会主动退出运行。于是我们在分析这类程序时,可以使用ctrl+C来终止valgrind运行并产生报告。

5.8K50

故障分析 | MySQL OOM 故障应如何下手

它打分的算法如下: 某一个进程和它所有的子进程都占用了很多内存的将会打一个高分。 为了释放足够的内存来解决这种情况,将杀死最少数量的进程(最好是一个进程)。...“ 以上是对 OOM 发生原因的一些见解,那思考一下还有没有其他的原因会导致内存溢出的情况呢?...它提供了一组工具,每个工具都执行某种调试、分析或类似的任务,以帮助您改进程序。Valgrind 的体系结构是模块化的,因此可以轻松地创建新工具,而不会影响现有的结构。.../a.out 从上面的命令可以清楚地看到,主要的命令是“ Valgrind”,而我们要使用的工具由选项“ --tool”指定。...suppressed errors, rerun with: -v==9954== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 发现程序退出时几乎没有内存未释放

1.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux 命令(143)—— valgrind 命令

    --trace-children= [default: no] 启用后,Valgrind 将跟踪通过 exec 系统调用启动的子进程。 这对于多进程程序是必要的。...这与 --trace-children-skip 相同,但有一个区别:是否跳过子进程是通过检查子进程的参数而不是其可执行文件的名称。...--child-silent-after-fork= [default: no] 启用后,Valgrind 不会显示由 fork 调用产生的子进程的任何调试或日志输出。...在处理创建子进程时,这可以使输出不那么混乱(尽管更具误导性)。 与 --trace-children 结合使用特别有用。...这通常很重要,因为在某些环境中,使用不匹配的函数释放可能会导致崩溃。 然而,有一种情况是无法避免这种不匹配的。

    3.3K40

    MySQL OOM 故障应如何下手

    它打分的算法如下: 某一个进程和它所有的子进程都占用了很多内存的将会打一个高分。 为了释放足够的内存来解决这种情况,将杀死最少数量的进程(最好是一个进程)。...“ 以上是对 OOM 发生原因的一些见解,那思考一下还有没有其他的原因会导致内存溢出的情况呢?...它提供了一组工具,每个工具都执行某种调试、分析或类似的任务,以帮助您改进程序。Valgrind 的体系结构是模块化的,因此可以轻松地创建新工具,而不会影响现有的结构。.../a.out 从上面的命令可以清楚地看到,主要的命令是“ Valgrind”,而我们要使用的工具由选项“ –tool”指定。...suppressed errors, rerun with: -v==9954== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 发现程序退出时几乎没有内存未释放

    1.2K10

    Valgrind 使用入门

    --log- file=memchk.log valgrind_tst [Your progame option]; c....特别的 --trace-children = yes 开启这个选项将使 valgrind 追踪到子进程,但据说不是很好用,所以我一般将服务设置为前台运行,如果你的后台服务(daemon 进程)无法设置前台运行...结果输出,直接 vi memchk.log(由命令中的 --log-file 指定)查看: 结果中比较重要的是: definitely lost: 确定有内存泄漏,表示在程序退出时,该内存无法回收,...也没指针指向该内存(首地址); indirectly lost: 间接内存泄漏,比如结构体中定义的指针指向的内存无法回收; possibly lost: 可能出现内存泄漏,比如程序退出时,没有指针指向一块内存的首地址了...,但由其他某个指针能推算出首地址; still reachable: 程序没主动释放内存,在退出时候该内存仍能访问到,比如全局 new 的对象没 delete,由于操作系统会回收,所以此类问题可忽略;

    7.9K00

    C++雾中风景番外篇3:GDB与Valgrind ,调试代码内存的工具

    笔者 入"坑"C++之后,在调试 C++代码的过程之中,学习了不少调试代码内存的工具。...valgrind 对内存的分析 这里列出了多种的内存泄露情况: definitely lost: 肯定的内存泄漏,这表示在程序退出时,有内存没有回收,但是也没有指针指向该内存。...这种情况最为严重。 indirectly lost: 间接的内存泄漏,如类之中定义的指针指向的内存没有回收。这种情况和上述相同。 possibly lost: 可能出现内存泄漏。...这种情况需要仔细排查,可能代码没有问题,也可能有异常的内存泄露。 still reachable: 程序没主动释放内存,在退出时候该内存仍能访问到。...这种情况一般问题不大,因为程序退出之后操作系统会回收程序的内存,所以这种情况一般问题不大。

    2.2K31

    谈谈如何利用 valgrind 排查内存错误

    作者认为内存泄漏有如下两种场景: 内存已经分配,但是在进程结束之前没有被优雅的释放。...具有进程级别的生命周期的静态指针或者全局指针指向的内存块没有在进程结束前被释放是造成这种场景下的内存泄漏的主要原因。 内存已经分配,但是在进程运行过程中不能被正常释放。...其实,这种场景下的泄漏在严格意义上来讲也许并不能称之为内存泄漏,因为在进程运行过程中并没有泄漏问题。...最终,将数据缓存结构的上层全局指针在进程退出时主动释放,结果这一次的内存检查报告不仅精确的定位到了内存泄露的地方,而且也没有了 still reachable 的错误。...其次,全局对象 g_stream_mgr 也是动态分配的内存,但是由于其生命周期是进程级,所以很多开发者不会在进程退出前去主动释放它,即使在原则上我们确实该释放它。

    7.5K41

    容器中的一号进程

    内核代码启动 1 号进程的时候,在没有外面参数指定程序路径的情况下,一般会从几个缺省路径尝试执行 1 号进程的代码。这几个路径都是 Unix 常用的可执行代码路径。...Bash 正确地收割了采用的子进程。Bash 可以运行任何东西。...SIGKILL是特权信号,无法被捕获,因此进程无法干净地终止。假设服务正在运行的应用程序正忙于写入文件;如果应用程序在写入过程中不干净地终止,文件可能会损坏。不干净的终止是不好的。...因为真正想要的可能是Bash返回与的进程相同的退出代码。 请注意,我们对bash进行修改,编写一个 EXIT 处理程序,它只是向子进程发送信号: #!...向子进程发送信号是不够的:init 进程还必须等待子进程终止,然后才能终止自己。如果 init 进程过早终止,那么所有子进程都会被内核不干净地终止。

    1.8K60

    linux下的程序调试方法汇总

    ,没有完不成的,只有你不知道的。...若需要调试的程序比较大,这将是一个耗时费力的方法。 2. 查询 在某些情况下,我们需要弄清楚在一个运行在内核中的进程的状态和内存映射。为了获得这些信息,我们不需要在内核中插入任何代码。...ls -l /proc'的输出结果,通过对 系统中运行的每一个进程在/proc文件系统中有一个以进程id命名的项。每个进程的细节信息可以在进程id对应的目录下的文件中获得。...例如,如果'x'是调试程序内的变量,'print x'会打印x的值。 检查源码: 源码可以在GDB中打印。默认情况下,'list'命令会打印10行代码。...如果没有传递参数默认操作是在所有的断点 step: 一步一步执行程序 continue: 继续执行程序,直到执行完毕 退出 GDB: 用'quit'命令还从GDB中退出。 GDB还有更多的可用选项。

    4K21

    程序异常分析指南

    在Linux上编写运行C语言程序,经常会遇到程序崩溃、卡死等异常的情况。程序崩溃时最常见的就是程序运行终止,报告Segmentation fault (core dumped)错误。...了解该问题的原因需要清楚局部变量在栈内的存储机制。在函数调用时,会将调用信息、局部变量等保存在进程的栈内。栈是从高地址到低地址增长的,因此先定义的局部变量的地址一般大于后定义的局部变量地址。...还有一种办法就是提前预知该情况的发生,不使用两个锁同步线程,这就需要人工费力地排查潜在的死锁可能,当然,也有分析工具帮助开发者完成此类工作,稍后会作介绍。...第27和48显示:线程2和3(主线程编号为1)在退出时仍然格持有1个锁,很明显,这两个线程相互死锁了,与之前的讨论一致。...希望看到此文的读者,在以后遇到程序异常时都能泰然自若,冷静分析,顺利地找到问题的根源,便不枉费笔者撰写此文之心血。

    3.1K31

    高并发性能测试经验分享(下)

    我通过valgrind测试nginx也发现了一些内存方面的错误,简单分享下valgrind测试nginx的经验: 1.nginx通常都是使用master fork子进程的方式运行,使用–trace-children...=yes来追踪子进程的信息。...3.如果nginx进程较多,比如超过4个时,会导致valgrind的错误日志打印混乱,尽量减小nginx工作进程,保持为1个。因为一般的内存错误其实和进程数目都是没有关系的。...AddressSanitizer的优点 address sanitizer(简称asan)是一个用来检测c/c++程序的快速内存检测工具。...我一直在告诉自己: 1.调试BUG是一次非常难得的学习机会,不要把它看成是负担。不管是线上还是线下,能够主动地,高效地追查BUG特别是有难度的BUG,对自己来说一次非常宝贵的学习机会。

    3.8K20

    docker的reap问题

    这发生于子进程需要保留表项以允许其父进程读取子进程的exit status:一旦退出态通过wait系统调用读取,僵尸进程条目就从进程表中删除,这个过程被称为reap。...僵尸进程被reap后,其进程号与在进程表中的表项都可以被系统重用。但如果父进程没有调用wait,僵尸进程将保留进程表中的表项,导致资源泄漏。...bash会正确地reap收养的子进程。bash可以执行任何程序。...SIGKILL无法被捕获,所以进程不能干净地终止。假如应用程序正在写文件;如果应用程序在写入过程中被不正确地终止,则文件可能会损坏。这就像拔服务器电源一样。...Tini一般在容器中运行,用于生成子进程,等待它推出,reap僵尸进程,并执行信号转发。 在最新的版本中,能将退出码143重新映射为0。

    1.2K30

    Linux常用指令

    :#ps -aux e、杀死进程:#kill pid f、查看某个程序在什么位置:#whereis exec g、下载文件:#wget -c url  h、查看端口情况: #netstat -tlpn...i、监控内存cpu情况:#top j、查看内存分布:#pmap pid k、杀死某些进程:pkill xxx(进程关键字) 3、压缩解压 a、tar压缩:#tar xcvf  dst src...、esc ->切换到命令模式 c、:q ->退出指令 d、:wq ->保存并退出 e、数字+/- ->加或者减多少行 f、ctrl+f/d ->后翻页 g、ctrl+b/u ->前翻页 h、...查询某个档案的动态函式库:#ldd execname d、查看某个库的符号表:#nm -D execname 9、gdb相关指令 a、ctrl+c:程序暂停 b、c:继续运行 c、bt:打印当前线程的当前的调用栈...file:linenumber:在指定文件指定行加断点 n、delete number:删除指定断点 10、软件安装yum a、yum list |grep xxx:列出可以安装的安装包

    3.6K30

    valgrind使用介绍

    二、 valgrind工具介绍 Memcheck是内存错误检测器。它可以帮助您使程序,尤其是用C和C ++编写的程序更加正确。 Cachegrind是一个缓存和分支预测探查器。...注意: (1)打开调试模式(gcc编译器的-g选项)。如果没有调试信息,即使最好的valgrind工具也将只能够猜测特定的代码是属于哪一个函数。.../val 其中==中间的数字(28431)是valgrind的进程ID,也是program的进程ID,它们是同一个进程。...如果没有指定,输出到stderr。 --tool=memcheck 指定Valgrind使用的工具。...(程序退出时仍在工作的异步系统调用?) possibly lost:是说可能有泄漏,一般是有二级指针(指针的指针)等复杂情况不易于追踪时出现。

    3.2K30

    窗口结束不断循环的线程

    Application.Exit()方法是终止所有线程上的消息循环,一般情况下,无论在什么地方调用此方法,程序就能退出。...如果运行中我关闭子窗体,发现窗体虽然关闭了,但子窗体中的循环程序却没有退出,一直在 执行,并占用着系统资源,直到循环结束,才真正的释放资源。...我感觉最好方法的就是,在子窗体的Closing事件中,写循环退出条件,这样就可以避免某些未知的错误,而且可以只关闭子窗体,并释放子窗体占用的资源 1.Application.Exit(): 方法停止在所有线程上运行的所有消息循环...(强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法干净地退出) 2.Environment.Exit(0): 调用此方法,应用程序即强制退出。...主消息泵结束后依然存在的任何窗口都需要手动关闭。在应用程序退出之前通过调用 Form.Close 或 Form.Dispose 来关闭窗口是清除窗口的良好做法,但这需要您有意识地去做。

    1.6K41

    【linux学习指南】SIGCHLD信号

    采⽤第⼀种⽅式,⽗进程阻塞了就不能处理⾃⼰的⼯作了;采⽤第⼆种⽅式,⽗进程在处理⾃⼰的⼯作的同时还要记得时不时地轮询⼀下,程序实现复杂。...函数接收一个整型参数 sig,代表接收到的信号编号,不过在这个函数内部其实并没有使用这个参数来做不同的分支处理,它主要关注的是处理子进程退出的情况。...是一个宏,它使得 waitpid 函数在没有已终止的子进程可等待时立即返回,而不是阻塞等待。...循环结束后(也就是没有已终止的子进程可等待了),通过 printf 打印出当前进程(也就是父进程)的进程ID,表示子进程已经退出完毕,当前提示信息所在的进程(父进程)还在运行(printf("child...不过要注意的是,代码最后的 return 0; 其实在当前逻辑下是无法执行到的,因为父进程进入了一个无限循环,正常情况下不会跳出循环去执行这行返回语句。

    9410

    记一次openssl使用不当引发的内存泄漏

    ​前言:本文记录一起第三方库使用不当引发的内存泄漏的定位过程。在日常工作中新写服务或者代码引发的内存泄漏还是相对较好定位的,因为这种情况下改动范围相对明确。...发生这种情况首先考虑的是最近是不是有什么改动上线导致了内存泄漏,但是经过比对最近一年改动的代码很少而且完全没有引入内存泄漏的可能。这就意味这这个服务很有可能子上线以来就一直存在这个问题。...这些问题往往是C/C++程序员最头疼的问题;显然我们这里用到的就是memcheck了。...(3)valgrind在spp下的使用valgrind在spp下的使用稍微有些不同,主要有一下注意事项。(0)如果是tke机器的话重新部署一个实例,注意不要有健康检查啥的。...3、效果验证接下来就是要验证修复前后的效果了。验证思路是非常简单的,即部署不同的实例观察内存走势即可。但是在具体实施过程中会发现没有那么简单。主要是因为该内存泄漏出现的频率比较低。

    51620

    Linux性能分析工具与图形化方法

    /run 或者 perf record -e cpu-clock -g -p 4522  使用ctrl+c中断perf进程,或者在程序执行结束后,会产生perf.data的文件,使用 perf report...在程序正常退出后,会生成gmon.out文件,解析这个文件,可以生成一个可视化的报告 2.2 使用方法 使用gprof,需要在编译时,加入-pg选项 另外只有在程序正常退出后才会生成gmon.out,kill...进程的方法是没法生成gmon.out的。...我们在压测的过程中发现使用valgrind启动的时候,可以支持的在线总人数比直接运行程序要少很多。...4.4 监控原理 这是一个很专业的话题,目前对三者的监控原理还没有摸的太透,所以这里暂时空着。大家有兴趣可以先行研究。

    8.8K311
    领券