帮助解释此堆栈跟踪

时间:2009-10-14 01:10:43

标签: c++ stack-trace

我知道它在strcmp失败了。我提供了运营商<下面,它调用strcmp。

在第1行,有值@ 0xbfffeeac。 @是什么意思?

#0  0x00212bd8 in strcmp () from /lib/libc.so.6
#1  0x0012ed2f in Json::Value::CZString::operator< (this=0x8317300, other=@0xbfffeeac)
    at src/lib_json/json_value.cpp:221
#2  0x001361b0 in std::less<Json::Value::CZString>::operator() (this=0x83173a0, __x=@0x8317300, 
    __y=@0xbfffeeac)
    at /usr/lib/gcc/i586-redhat-linux/4.4.1/../../../../include/c++/4.4.1/bits/stl_function.h:230
#3  0x00136101 in std::_Rb_tree<Json::Value::CZString, std::pair<Json::Value::CZString const, Json::Value>, std::_Select1st<std::pair<Json::Value::CZString const, Json::Value> >, std::less<Json::Value::CZString>, std::allocator<std::pair<Json::Value::CZString const, Json::Value> > >::_M_lower_bound (this=0x83173a0, 
    __x=0x83172f0, __y=0x83173a4, __k=@0xbfffeeac)
    at /usr/lib/gcc/i586-redhat-linux/4.4.1/../../../../include/c++/4.4.1/bits/stl_tree.h:986
#4  0x001348da in std::_Rb_tree<Json::Value::CZString, std::pair<Json::Value::CZString const, Json::Value>, std::_Select1st<std::pair<Json::Value::CZString const, Json::Value> >, std::less<Json::Value::CZString>, std::allocator<std::pair<Json::Value::CZString const, Json::Value> > >::find (this=0x83173a0, __k=@0xbfffeeac)
    at /usr/lib/gcc/i586-redhat-linux/4.4.1/../../../../include/c++/4.4.1/bits/stl_tree.h:1421
#5  0x0013383a in std::map<Json::Value::CZString, Json::Value, std::less<Json::Value::CZString>, std::allocator<std::pair<Json::Value::CZString const, Json::Value> > >::find (this=0x83173a0, __x=@0xbfffeeac)
    at /usr/lib/gcc/i586-redhat-linux/4.4.1/../../../../include/c++/4.4.1/bits/stl_map.h:659
#6  0x00131779 in Json::Value::operator[] (this=0x8317280, key=0xbfffef74 "col1")
    at src/lib_json/json_value.cpp:1055
#7  0x00131ba8 in Json::Value::isMember (this=0x8317280, key=0xbfffef74 "col1")
    at src/lib_json/json_value.cpp:1169
#8  0x0805cf4d in CFG::CFG_Fetch_Raw (this=0x825846c, section=0x8317280, key=0xbfffef74 "col1", defval=0x0)
    at CFG.cpp:48
#9  0x08050e5b in Generic::CFGSetup (this=0x825846c, k=0x8255e2c "display_qt") at Generic.cpp:89
#10 0x0804df6a in LCDControl::ConfigSetup (this=0xbffff2a8) at LCDControl.cpp:81
#11 0x0804d93b in LCDControl::Start (this=0xbffff2a8, argc=1, argv=0xbffff404) at LCDControl.cpp:15
#12 0x0804f224 in main (argc=1, argv=0xbffff404) at Main.cpp:7

bool
Value::CZString::operator<( const CZString &other ) const
{
   if ( cstr_ )
      return strcmp( cstr_, other.cstr_ ) < 0; //src/lib_json/json_value.cpp:221
   return index_ < other.index_;
}

4 个答案:

答案 0 :(得分:2)

您正在检查this->cstr_是否为null,但是您没有检查other.cstr_。也许容器会阻止插入任何具有空cstr_值的字符串,因此不需要进行此类检查。

然而,这不是问题,因为在这种情况下其他不是null。而是看起来other对象可能已被删除。您如何管理std::map容器中对象的生命周期?是否有可能删除其中一个值而未从地图中删除?

更新

在进一步检查时,这似乎是关键:

#5  0x0013383a in std::map<...>::find (this=0x83173a0, __x=@0xbfffeeac)
#6  0x00131779 in Json::Value::operator[] (this=0x8317280, key=0xbfffef74 "col1")

你传入一个常量字符串指针(0xbfffef74,显然有效,因为调试器显示字符串),并且它会自动转换为CZString类型的临时值。您可以看到临时CZString对象忠实地传递到operator<

我相信0x8...地址表示堆分配,而0xbf...地址表示堆栈分配。

不幸的是,我们需要看到的是strcmp()的论据。我们需要知道,当CZString::operator<使用0xbfffeeac(临时CZString对象)的“其他”参数调用时,是否传递了原始字符串值0xbfffef74进入strcmp,或者可能是该字符串的堆分配副本(我不知道CZString在内部做了什么)。

如果这是b树搜索中的第一个比较,则可能表示strcmp的第二个参数未正确转换为CZString。否则,它表示第二个参数正确传递,并且地图中的一个字符串无效但不为空,留下“已删除”和“非空终止”可能是怀疑。

答案 1 :(得分:1)

@ 0xbfffeeac看起来像一个特殊的值,也许是未初始化的内存?我只是猜测,但是@符号可以放在那里表示内存地址指向一个特殊格式的值来表示未初始化的内存吗?

答案 2 :(得分:1)

@符号表示参数是通过引用传递的。

有关了解程序内存映射的帮助,例如:数据段中的地址与堆栈中的地址相同,请在gdb下尝试info files。此外,由于您在Linux下运行,请查看cat /proc/<pid>/maps

的输出

答案 3 :(得分:0)

或许strcmp在运行时接收到意外值,或者某些东西。只是一个想法,抱歉,如果我错了。