【问题标题】:C++ detect memory allocationC++ 检测内存分配
【发布时间】:2016-07-17 07:49:16
【问题描述】:

我正在尝试提高我的 C++ 程序的性能,我发现将内存分配 (malloc) 转换为对象池会产生很好的效果。 问题在于检测调用 malloc 的位置,因为代码库非常大。我不能使用带断点的简单 gdb,因为有许多计时器和信号处理程序并行运行。

gdb 中有没有一种方法可以在调用 malloc 时打印整个堆栈跟踪,而不必每次都手动执行。 或者 你能推荐任何其他工具来帮助我做同样的事情吗?

【问题讨论】:

  • 在整个代码库中搜索字符串 malloc 有多难?
  • 为什么在 C++ 代码中使用 malloc?你应该使用新的。在这种情况下,您可以定义自己的新运算符
  • 你可以在 GDB 中做this 吗?如果它落在 malloc(或 new)中,您就找到了一个活的。如果没有,在 20 个左右的样本之后,它使用的时间太少,以至于优化它真的不值得。
  • @MikeDunlavey 它将登陆 malloc 因为 new 使用它.. 我想 pool 也使用它

标签: c++ gdb gprof


【解决方案1】:

您可以使用 Python 编写 gdb 脚本。

您还可以实现自己的 malloc 函数并与之链接。返回地址将在堆栈上,这将为您提供调用者。

【讨论】:

    【解决方案2】:

    valgrind 工具套件包含可以用于此目的的 massif:

    valgrind --tool=massif ./mybinary
    

    这会收集所有分配的详细信息,包括您可以在程序完成执行后检查的堆栈跟踪。有关输出的更多详细信息,请参阅地块文档:http://valgrind.org/docs/manual/ms-manual.html。希望对您有所帮助。

    附:还要检查 TCMalloc 库——它可能已经做了你想要的,尽管你可以根据你的具体应用做得更好。最好的是不需要更改源代码 - 您只需使用链接器指令替换 glibc 中的 malloc 函数。

    【讨论】:

      猜你喜欢
      • 2016-03-20
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      相关资源
      最近更新 更多