【问题标题】:core dump in basic_string.tcc - optimized outbasic_string.tcc 中的核心转储 - 已优化
【发布时间】:2012-02-13 17:36:28
【问题描述】:

偶尔我会遇到一些核心转储,我无法弄清楚它们为什么会发生。通常在将 av 值分配给字符串时会发生这种情况。以下是其中一种情况的回溯。核心转储似乎是由我的 c++ 代码中的这一行引起的:

m_strValue = "---";

我不知道在这种情况下发生了什么,我在家里有人可以对这个问题有所了解。

下面是回溯

#0  0x40227ed4 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:67
#1  0x402293d0 in *__GI_abort () at abort.c:92
#2  0x4011a594 in __gnu_cxx::__verbose_terminate_handler () at /home/habbjack/ssd/workspace/builder2/build_armv5l-linux-gnueabi/gcc-4.5.3/gcc-4.5.3/libstdc++-v3/libsupc++/vterminate.cc:93
#3  0x40118770 in __cxxabiv1::__terminate (handler=<optimized out>) at /home/habbjack/ssd/workspace/builder2/build_armv5l-linux-gnueabi/gcc-4.5.3/gcc-4.5.3/libstdc++-v3/libsupc++/eh_terminate.cc:39
#4  0x40118798 in std::terminate () at /home/habbjack/ssd/workspace/builder2/build_armv5l-linux-gnueabi/gcc-4.5.3/gcc-4.5.3/libstdc++-v3/libsupc++/eh_terminate.cc:49
#5  0x40118914 in __cxxabiv1::__cxa_throw (obj=<optimized out>, tinfo=<optimized out>, dest=<optimized out>) at /home/habbjack/ssd/workspace/builder2/build_armv5l-linux-gnueabi/gcc-4.5.3/gcc-4.5.3/libstdc++-v3/libsupc++/eh_throw.cc:83
#6  0x400c8de8 in std::__throw_length_error (__s=<optimized out>) at /home/habbjack/ssd/workspace/builder2/build_armv5l-linux-gnueabi/gcc-4.5.3/gcc-4.5.3/libstdc++-v3/src/functexcept.cc:74
#7  0x400fe02c in std::string::_Rep::_S_create (__capacity=4294967293, __old_capacity=<optimized out>, __alloc=<optimized out>) at /home/habbjack/ssd/workspace/builder2/build_armv5l-linux-gnueabi/gcc-4.5.3/gcc-4.5.3-stage3/armv5l-linux-gnueabi/libstdc++-v3/include/bits/basic_string.tcc:552
#8  0x400fe260 in std::string::_M_mutate (this=0x7d3d78, __pos=0, __len1=9, __len2=3) at /home/habbjack/ssd/workspace/builder2/build_armv5l-linux-gnueabi/gcc-4.5.3/gcc-4.5.3-stage3/armv5l-linux-gnueabi/libstdc++-v3/include/bits/basic_string.tcc:479
#9  0x400fe3fc in std::string::_M_replace_safe (this=0x7d3d78, __pos1=0, __n1=<optimized out>, __s=0x62d708 "---", __n2=3) at /home/habbjack/ssd/workspace/builder2/build_armv5l-linux-gnueabi/gcc-4.5.3/gcc-4.5.3-stage3/armv5l-linux-gnueabi/libstdc++-v3/include/bits/basic_string.tcc:684
#10 0x400fe48c in std::string::assign (this=0x7d3d78, __s=<optimized out>, __n=3) at /home/habbjack/ssd/workspace/builder2/build_armv5l-linux-gnueabi/gcc-4.5.3/gcc-4.5.3-stage3/armv5l-linux-gnueabi/libstdc++-v3/include/bits/basic_string.tcc:264
#11 0x0026175c in CLCD_Wnd::Refresh (this=0x7d3d60) at ../../lib/src/HAL/LCD/CLCD_Wnd.cpp:49

【问题讨论】:

  • 这样的问题几乎总是在程序执行的早期阶段造成的内存损坏的结果。该字符串可能会覆盖其指针以引用垃圾内存,因此当它尝试写入自身时,自然会得到一个 SEGV。你在 ARM 上,所以很遗憾你不能使用 Mudflap 或 valgrind,但你至少可以使用 -g3 -O0 编译并使用调试器来逐步检查你开始偏离苍白的地方。如果您可以脱靶,请尝试使用 valgrind,它会注意到您的错误写入...
  • 我想你会发现Valgrind很有用。

标签: c++ linux gcc core stdstring


【解决方案1】:

第 7 行显示创建容量=4294967293,紧随其后的是 throw_length_error。

另外,第 11 行的对象距离字符串仅 24 个字节,如果 CLCD_Wnd 需要更多空间,这可能表明存在某种分配问题。

【讨论】:

    【解决方案2】:

    几乎可以肯定m_strValue 或其包含对象不再存在(已删除或超出范围)。没有更多代码是不可能的,但如果你在 Linux 上,valgrind 可以帮助你。

    【讨论】:

      猜你喜欢
      • 2015-05-12
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 2011-01-16
      • 2021-12-06
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多