Что может означать эта трассировка стека? - PullRequest
1 голос
/ 23 января 2010

У меня проблема с segfault в моем приложении, написанном на 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 ]

2 голосов
/ 23 января 2010

Совершенно очевидно, что pAction имеет значение null, и вы вызвали pAction-> DisplayInfo. Посмотрите, как все адреса в действии являются недопустимыми в кадре 1. Кроме этого, трудно понять, почему, не видя некоторый код, но я предполагаю, что DisplayInfo вызывает LoadInfoFromDB прямо или косвенно.

2 голосов
/ 23 января 2010
m_tmap[tId]->slist[sId] = pItem;

Если это позиция сбоя, вы, скорее всего, индексируете несуществующие данные. Если m_tmap - std::map, то все в порядке - но вы убедились, что slist[sId] является действительным индексом?

Или - вы вызвали функцию-член для NULL (или иным образом недействительным) -Pointer и аварийно завершали работу при первом обращении к члену объекта напрямую, даже если он находится в нескольких кадрах. Вы уверены, что pAction не может быть NULL?

Следы стека не должны быть действительными. Во-первых, вы можете повредить их в своем приложении. Во-вторых, оптимизирующие компиляторы оптимизируют настолько, что получаемые трассировки стека не являются надежными. Попробуйте сборку с отключенной оптимизацией компилятора и используйте assert, чтобы убедиться, что подписка вашего массива в порядке.

...