2012-02-13 117 views
0

偶爾會遇到一些核心轉儲,我無法弄清楚它們爲什麼會發生。通常,在將av值分配給字符串時會發生這種情況。以下是這種情況之一的回溯。核心轉儲似乎是此行中我的C++代碼引起的:basic_string.tcc中的核心轉儲 - 優化出

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 
+1

像這樣的問題幾乎總是在程序執行的早期階段導致內存損壞的結果。該字符串可能會將其指針覆蓋到引用垃圾內存,所以當它試圖寫入自身時,它會得到一個SEGV。你在ARM上,所以不幸的是你不能使用Mudflap或者valgrind,但是你至少可以用-g3 -O0進行編譯,並且使用一個調試器來逐步瀏覽,並且看到你開始偏離蒼白的地方。如果你可以脫靶,試試valgrind,它會注意到你的錯誤寫... – Borealid 2012-02-13 17:43:00

+1

我認爲你會發現[Valgrind](http://www.valgrind.org/)有用。 – JimR 2012-02-13 19:41:52

回答

0

幾乎可以肯定m_strValue或其包含對象不再存在(刪除或出去的範圍)。沒有更多的代碼是不可能的,但如果你在Linux上,valgrind可以幫助你。

1

第7行顯示容量= 4294967293的創建,緊接着是throw_length_error。

另外,第11行的對象距離字符串只有24個字節,如果CLCD_Wnd需要更多空間,這可能表示某種分配問題。