C++ 堆损坏和 valgrind

标签 c++ linux solaris core

我在 Solaris/Linux 平台上都有一个核心,但我没有发现问题。 在 linux 平台上,我有以下核心:

(gdb) where
#0  0x001aa81b in do_lookup_x () from /lib/ld-linux.so.2
#1  0x001ab0da in _dl_lookup_symbol_x () from /lib/ld-linux.so.2
#2  0x001afa05 in _dl_fixup () from /lib/ld-linux.so.2
#3  0x001b5c90 in _dl_runtime_resolve () from /lib/ld-linux.so.2
#4  0x00275e4c in __gxx_personality_v0 () from /opt/gnatpro/lib/libstdc++.so.6
#5  0x00645cfe in _Unwind_RaiseException_Phase2 (exc=0x2a7b10, context=0xffd58434) at ../../../src/libgcc/../gcc/unwind.inc:67
#6  0x00646082 in _Unwind_RaiseException (exc=0x2a7b10) at ../../../src/libgcc/../gcc/unwind.inc:136
#7  0x0027628d in __cxa_throw () from /opt/gnatpro/lib/libstdc++.so.6
#8  0x00276e4f in operator new(unsigned int) () from /opt/gnatpro/lib/libstdc++.so.6
#9  0x08053737 in Receptor::receive (this=0x93c12d8, msj=...) at Receptor.cc:477
#10 0x08099666 in EventProcessor::run (this=0xffd75580) at EventProcessor.cc:437
#11 0x0809747d in SEventProcessor::run (this=0xffd75580) at SEventProcessor.cc:80
#12 0x08065564 in main (argc=1, argv=0xffd76734) at my_project.cc:20

在 Solaris 平台上我有另一个核心:

$ pstack core.ultimo
core 'core.ultimo' of 9220:     my_project_sun
-----------------  lwp# 1 / thread# 1  --------------------
 0006fa28 __1cDstdGvector4CpnMDistribuidor_n0AJallocator4C2___Dend6kM_pk2_ (1010144, 1ce84, ffbd0df8, ffb7a18c, fffffff8, ffbedc7c) + 30
 0005d580 __1cDstdGvector4CpnMDistribuidor_n0AJallocator4C2___Esize6kM_I_ (1010144, 219, 1ce84, ffffffff, fffffff8, ffbedc7c) + 30
 0005ab14 __1cTReceptorHreceive6MrnKMensaje__v_ (33e630, ffbede70, ffffffff, 33e634, 33e68c, 0) + 1d4
 0015df78 __1cREventProcessorDrun6M_v_ (ffbede18, 33e630, dcc, 1, 33e730, 6e) + 350
 00159a50 __1cWSEventProcessorDrun6M_v_ (da08000, 2302f7, 111de0c, 159980, ff1fa07c, cc) + 48
 000b6acc main     (1, ffbeef74, ffbeef7c, 250000, 0, 0) + 16c
 00045e10 _start   (0, 0, 0, 0, 0, 0) + 108
-----------------  lwp# 2 / thread# 2  --------------------

...

这段代码是:

...
msj2.tipo(UPDATE);
for(i = 0; i < distr.size(); ++i)
{
    distr[i]->insert(new Mensaje(msj2)); **--> Receptor.cc:477**

}
...

这个核心是随机发生的,有时这个过程会运行数周。 核心大小为4291407872 B。

我正在运行 valgrind 以查看堆是否已损坏,但到目前为止我还没有遇到“无效读取”、“无效写入”等问题...... 此外,当我运行 valgrind 时,我发现了两次以下消息:

==19002== Syscall param semctl(arg) points to uninitialised byte(s)

而且我已经检测到代码行,但是这些错误会导致核心吗?我认为我之前在 valgrind 中看到过这些错误,它们并不像那些说“无效读/写”的错误那么重要。

如果您知道如何解决这个问题,我们将不胜感激。

最佳答案

核心大小就是线索。最大的 32 位无符号数是 4,294,967,295。您的核心非常接近表明进程内存不足的核心。最可能的原因是内存泄漏。

请参阅我最近的文章 Memory Leaks in C/C++

Valgrind 会在 Linux 上为您找到问题。为此,您必须使用 --leak-check 选项启动它。它会在进程正常退出时检查是否有泄漏,因此您需要一种方法来关闭进程。

在 Solaris 上使用 dbx 的 Dtrace 也可能工作。

关于C++ 堆损坏和 valgrind,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38763305/

相关文章:

c++ - 如何使用后缀树查找所有匹配子串的索引?

linux - 必须重新编译什么才能运行 x32 ABI 应用程序?

c - 避免在 Solaris 操作系统上重写文件

c++ - 不确定如何解释我的并行矩阵乘法代码的一些性能结果

c++ - 释放资源的异常处理的替代方案

c++ - C++模板函数,在仍允许内联的同时指定回调仿函数/lambda的参数类型?

linux - 包 'docker.io' 没有安装候选

linux - 使用 sed 和正则表达式替换 html 内容

c++ - 无法在 Solaris 10 上使用 GCC 5.5 包含 cmath

c - 错误 : expected primary-expression before "__attribute__";