【问题标题】:Valgrind or asan alternative with low memory overheadValgrind 或作为低内存开销的替代品
【发布时间】:2022-11-18 01:22:21
【问题描述】:

我目前正在调试 C++ 应用程序中的堆栈损坏。不幸的是,此应用程序需要大量内存才能运行(~100GB),而我的系统只有 128GB 可用内存。 目前我也无法访问更多的内存。

Asan 和 valgrind 似乎需要相当多的额外内存,因此应用程序无法与它们一起运行。使用 gdb 运行时,我只会在堆栈明显损坏的某些地方停止(例如,我什至无法再显示调用堆栈)。使用 printf 语句很难找到问题所在。如果可能的话,知道如何使用工具进行调试吗?我已经尝试减少内存需求,但到目前为止还没有成功。

【问题讨论】:

  • 如果您有可用的磁盘空间或额外的磁盘,开始可能是添加大量交换空间。一切都会非常缓慢,但也许您的错误仍会在合理的时间内出现。
  • DrMemory drmemory.org 将是 valgrind 的替代品,具有更好的占用空间
  • 您知道涉及哪一段代码吗?您是否可以取出可疑的代码片段,但将它们放在单独的库中并对它们进行单元测试?您是否允许您的程序使用 (...) 捕获访问冲突?
  • @PepijnKramer 是的,我有一些想法,问题是程序运行了一个相当复杂的算法,取出一些部分会影响未来的计算,所以不可能轻易禁用一些部分并检查问题是否已解决。
  • 不,那不是我的意思。您能否将运行算法的文件编译为单独的静态库,然后创建仅运行该部分的测试可执行文件(在一些较小的测试数据上)。所以您知道该算法是独立运行的,还是该程序基本上已经只运行该算法了? (这里有点头脑风暴)

标签: c++ valgrind address-sanitizer stack-corruption


【解决方案1】:

如果你想要更低的内存开销和堆栈检查,我会选择地址清理器。

Valgrind 不能像 Asan 那样做堆栈检查。它还使用更多内存,因为它执行位精确的内存有效性检查。虽然在某些情况下这可能是一个优势,但它确实意味着影子内存需要与堆的大小相同。 Asan 进行字节精确的内存有效性检查,这意味着影子内存的大小约为 1/8。

我从未使用过记忆博士。如果它也是字节精确的,那么它也将需要更少的内存。但是我不确定它是否具有 Asan 的优势,其中检测代码能够检查堆栈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2011-05-16
    • 2016-06-14
    • 1970-01-01
    • 2011-06-24
    相关资源
    最近更新 更多