【发布时间】:2022-11-18 01:22:21
【问题描述】:
我目前正在调试 C++ 应用程序中的堆栈损坏。不幸的是,此应用程序需要大量内存才能运行(~100GB),而我的系统只有 128GB 可用内存。 目前我也无法访问更多的内存。
Asan 和 valgrind 似乎需要相当多的额外内存,因此应用程序无法与它们一起运行。使用 gdb 运行时,我只会在堆栈明显损坏的某些地方停止(例如,我什至无法再显示调用堆栈)。使用 printf 语句很难找到问题所在。如果可能的话,知道如何使用工具进行调试吗?我已经尝试减少内存需求,但到目前为止还没有成功。
【问题讨论】:
-
如果您有可用的磁盘空间或额外的磁盘,开始可能是添加大量交换空间。一切都会非常缓慢,但也许您的错误仍会在合理的时间内出现。
-
DrMemory drmemory.org 将是 valgrind 的替代品,具有更好的占用空间
-
您知道涉及哪一段代码吗?您是否可以取出可疑的代码片段,但将它们放在单独的库中并对它们进行单元测试?您是否允许您的程序使用 (...) 捕获访问冲突?
-
@PepijnKramer 是的,我有一些想法,问题是程序运行了一个相当复杂的算法,取出一些部分会影响未来的计算,所以不可能轻易禁用一些部分并检查问题是否已解决。
-
不,那不是我的意思。您能否将运行算法的文件编译为单独的静态库,然后创建仅运行该部分的测试可执行文件(在一些较小的测试数据上)。所以您知道该算法是独立运行的,还是该程序基本上已经只运行该算法了? (这里有点头脑风暴)
标签: c++ valgrind address-sanitizer stack-corruption