这个堆栈跟踪可能意味着什么?

时间:2010-01-23 12:44:51

标签: c++ debugging segmentation-fault stack-trace

我在使用C ++编写并使用GCC 4.3.2编译的应用程序中遇到了段错误问题。它在Debian 5 x64下运行。

该进程在以下代码行崩溃:

#0  0x00000000007c720f in Action::LoadInfoFromDB (this=0x7fae10d38d90)
    at ../../../src/server/Action.cpp:1233
1233            m_tmap[tId]->slist[sId] = pItem;

我从核心转储获得的堆栈跟踪如下:

#0  0x00000000007c720f in Action::LoadInfoFromDB (this=0x7fae10d38d90)
    at ../../../src/server/Action.cpp:1233
    ItemGuid = <value optimized out>
    ItemEntry = <value optimized out>
    pItem = (class Item *) 0x2b52bae0
    fields = <value optimized out>
    tId = 1 '\001'
    sId = 0 '\0'
    result = (QueryResult *) 0x7fadcae3d8e0
#1  0x00000000007c7584 in Action::DisplayInfo (this=0x0, session=0x7fadbdd44a20)
    at ../../../src/server/Action.cpp:1090
    data = {<ByteBuffer> = {static DEFAULT_SIZE = 4096, _rpos = 220043248, _wpos = 5469086, 
    _storage = {<std::_Vector_base<unsigned char, std::allocator<unsigned char> >> = {
        _M_impl = {<std::allocator<unsigned char>> = {<__gnu_cxx::new_allocator<unsigned char>> = {<No data fields>}, <No data fields>}, _M_start = 0x41200000 <Address 0x41200000 out of bounds>, 
          _M_finish = 0x0, 
          _M_end_of_storage = 0x7fad00000000 <Address 0x7fad00000000 out of bounds>}}, <No data fields>}}, m_code = 51152}
#2  0x00000000007d01a3 in Session::HandleAction (this=0x7fadbdd44a20, 
    recv_data=@0x25d83780) at ../../../src/server/ActionHandler.cpp:862
    pAction = (Action *) 0x0
    ActionId = 1079
    GoGuid = <value optimized out>

在第1帧中,Action::DisplayInfo来自Session::HandleAction pAction。但是,第1帧显示this=0x0,第2帧显示pAction = (Action *) 0x0

我无法理解为什么会导致崩溃。这可能意味着什么?无法在空引用上调用DisplayInfo

非常感谢任何帮助。

由于

2 个答案:

答案 0 :(得分:2)

m_tmap[tId]->slist[sId] = pItem;

如果这是崩溃位置,您最有可能索引到不存在的数据。如果m_tmap是std::map,那没关系 - 但你确认slist[sId]是有效的下标吗?

或者 - 你在一个NULL(或其他无效的)-Pointer上调用了一个成员函数,并在你第一次直接访问该对象的一个​​成员时崩溃,即使它只有几帧之外。你确定pAction不能为NULL吗?

堆栈跟踪无需有效。首先,您可以在应用程序中破坏它们。其次,优化编译器可以最大限度地优化生成的堆栈跟踪不可靠。尝试禁用编译器优化的构建,并使用assert验证您的数组下标是否正常。

答案 1 :(得分:2)

很明显pAction为null,你调用了pAction-&gt; DisplayInfo。看看Action中的地址在第1帧中是如何都是无效的。除此之外,很难在没有看到某些代码的情况下告诉原因,但我想DisplayInfo直接或间接地调用LoadInfoFromDB。