草庐IT

c++ - linux上的轻量级内存泄漏调试

coder 2023-06-01 原文

我首先寻找现有的答案,发现 Valgrind 是大家最喜欢的 linux 内存泄漏调试工具。不幸的是,Valgrind 似乎不适用于我的目的。我将尝试解释原因。

约束:

  • 泄漏只会在客户的环境中重现。由于某些 法律限制我们必须使用现有的二进制文件。没有重建。
  • 在常规环境中,我们的应用程序消耗约 10% 的 CPU。说,我们可以 容忍高达 10 倍的 CPU 使用率增加。 Valgrind 带有默认的 memcheck 设置更糟糕,使我们的应用程序长时间无响应 时间段。

我需要的是 Microsoft 的 UMDH 的等价物:为每个堆分配打开堆栈跟踪,然后在某个时间点转储所有按堆栈分组并按分配计数降序排列的分配。我们的应用同时在 Windows 和 Linux 平台上发布,所以我知道在 UMDH 下的 Windows 上的性能仍然可以接受。

这是我考虑过的工具/方法

  • Valgrind-memcheck–massif 工具它们做的比需要的多得多(比如扫描整个进程内存以进行每次分配 指针),它们太慢了,而且它们仍然没有完全按照我的方式做
    需要(转储按计数排序的调用堆栈),所以我将不得不写一些 解析输出的脚本
  • dmalloc 库 (dmalloc.com) 需要新的二进制文件
  • LeakTracer (http://www.andreasen.org/LeakTracer/) 仅适用于 C++ new/delete(我也需要 malloc/free),没有 group-by-stack 和排序功能
  • 使用 LD_PRELOAD 自己将工具实现为 .so 库 机制 (Overriding 'malloc' using the LD_PRELOAD mechanism) 考虑到我的 Linux 编码技能,这至少需要一周时间,而且感觉 就像发明自行车一样。

我错过了什么吗?是否有任何轻量级的 Valgrind 选项或现有的 LD_PRELOAD 工具?

最佳答案

GNU libc 具有内置的 malloc 调试功能:

http://www.gnu.org/software/libc/manual/html_node/Allocation-Debugging.html

使用 LD_PRELOAD 从你自己的 .so 中调用 mtrace():

#include <mcheck.h>
static void prepare(void) __attribute__((constructor));
static void prepare(void)
{
    mtrace();
}

编译:

gcc -shared -fPIC dbg.c -o dbg.so

运行它:

export MALLOC_TRACE=out.txt
LD_PRELOAD=./dbg.so ./my-leaky-program

稍后检查输出文件:

mtrace ./my-leaky-program out.txt

你会得到类似的东西:

Memory not freed:
-----------------
           Address     Size     Caller
0x0000000001bda460     0x96  at /tmp/test/src/test.c:7

当然,您可以随意编写自己的 malloc Hook 来转储整个堆栈(如果您认为这会有所帮助,请调用 backtrace())。

如果您将二进制文件的调试信息保存在某处(例如二进制文件内置了一些调试信息,或者您执行了 objcopy --only-keep-debug my-leaky),则可以获得行号和/或函数名称-program my-leaky-program.debug)。


另外,您可以试试 Boehm 的 GC,它也可以用作检漏仪:

http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html

关于c++ - linux上的轻量级内存泄漏调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18455698/

有关c++ - linux上的轻量级内存泄漏调试的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  4. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  5. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  6. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  7. ruby-on-rails - 无法让 rspec、spork 和调试器正常运行 - 2

    GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'

  8. ruby - JetBrains RubyMine 3.2.4 调试器不工作 - 2

    使用Ruby1.9.2运行IDE提示说需要gemruby​​-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall

  9. ruby-on-rails - 如何调试 cucumber 测试? - 2

    我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element

  10. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

随机推荐