Форум программистов, компьютерный форум CyberForum.ru

Segmentation fault при вызове метода - C++

Восстановить пароль Регистрация
 
lan143
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 15
10.12.2012, 00:54     Segmentation fault при вызове метода #1
Собственно такое дело, имеется следующий код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Item* m_items[PLAYER_SLOTS_COUNT];
 
Player::Player()
{
    ...
    memset(m_items, 0, sizeof(Item*)*PLAYER_SLOTS_COUNT);
    ...
}
 
void Player::RemoveFromWorld()
{
    ...
    for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
        if (m_items[i])
            m_items[i]->RemoveFromWorld();
}
Программа ловит Segmentation fault на m_items[i]->RemoveFromWorld(), но очень редко, не могу понять из-за чего. В gdb:
Код
#0  0x0000000000abf400 in Player::RemoveFromWorld (this=0x7fff80541000)
    at /home/x5/source/src/server/game/Entities/Player/Player.cpp:2442
No locals.
#1  0x0000000000a08433 in Unit::CleanupBeforeRemoveFromMap (
    this=0x7fff80541000, finalCleanup=true)
    at /home/x5/source/src/server/game/Entities/Unit/Unit.cpp:13247
        __FUNCTION__ = "CleanupBeforeRemoveFromMap"
#2  0x0000000000a0a34d in Unit::CleanupsBeforeDelete (this=0x7fff80541000, 
    finalCleanup=)
    at /home/x5/source/src/server/game/Entities/Unit/Unit.cpp:13269
No locals.
Никакой информации не вижу. Собирал без оптимизаций. g++ (Debian 4.7.1-5) 4.7.1. Подскажите пожалуйста, как можно решить эту проблему.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2012, 00:54     Segmentation fault при вызове метода
Посмотрите здесь:

[C/C++] "Segmentation fault" при попытке передачи параметра командной строки. C++
Segmentation fault при использовании модуля <time.h> C++
C++ Segmentation fault
C++ Segmentation fault
Segmentation fault C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
10.12.2012, 00:58     Segmentation fault при вызове метода #2
lan143, так это бесконечная рекурсия или я что-то не заметил.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
10.12.2012, 01:03     Segmentation fault при вызове метода #3
без всего кода трудно сказать.
быть может в некоторых случаях вот это условие возвращает тру:
if (m_items[i])
но это что-то неинициализированное. такое может быть из-за выходов за пределы, из-за порчи памяти в другом месте. отладочные трейсы втыкайте и смотрите лог. колл стек тоже не помешает.
lan143
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 15
10.12.2012, 01:09  [ТС]     Segmentation fault при вызове метода #4
Цитата Сообщение от go Посмотреть сообщение
lan143, так это бесконечная рекурсия или я что-то не заметил.
Нет, для m_items тип Item, основной Player.

но это что-то неинициализированное.
В конструкторе инициализируется нулями, затем во множествах местах происходит изменение указателей. Весь код просто огромен и разбросан по всему проекту.

отладочные трейсы втыкайте и смотрите лог. колл стек тоже не помешает.
Не подскажите как их в GDB вызвать?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
10.12.2012, 01:11     Segmentation fault при вызове метода #5
printf("тут всякая полезная инфа")
или fprintf

или же std::cout << "что-то" и запуск бинаря:
my_exe.exe >>log.txt
правда не знаю, будет ли это работать не в винде
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
10.12.2012, 01:23     Segmentation fault при вызове метода #6
lan143, не вижу метода Item::RemoveFromWorld
lan143
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 15
10.12.2012, 14:16  [ТС]     Segmentation fault при вызове метода #7
Цитата Сообщение от go Посмотреть сообщение
lan143, не вижу метода Item::RemoveFromWorld
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Item : Object
{
    ....
}
 
class Object : ACE_Copy_Disabled
{
    ...
    virtual void RemoveFromWorld();
    ...
}
 
void Object::RemoveFromWorld()
{
    if (!m_inWorld)
        return;
 
    m_inWorld = false;
 
    // if we remove from world then sending changes not required
    ClearUpdateMask(true);
}
В Item RemoveFromWorld не определен, поэтому вызывается из класса Object.

Добавлено через 12 часов 47 минут
Ещё вопрос: а в каких случаях может падать на инскрементировании итератора std::map?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.12.2012, 14:17     Segmentation fault при вызове метода #8
lan143, Если за end выходим очевидным образом. Или пытаемся разыменовать end.
lan143
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 15
10.12.2012, 14:56  [ТС]     Segmentation fault при вызове метода #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    typedef std::map<RepListID, FactionState> FactionStateList;
 
    for (FactionStateList::iterator itr = _factions.begin(); itr != _factions.end(); ++itr)
    {
        if (itr->second.needSave)
        {
            PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_REPUTATION_BY_FACTION);
            stmt->setUInt32(0, m_player->GetGUIDLow());
            stmt->setUInt16(1, uint16(itr->second.ID));
            trans->Append(stmt);
 
            stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_REPUTATION_BY_FACTION);
            stmt->setUInt32(0, m_player->GetGUIDLow());
            stmt->setUInt16(1, uint16(itr->second.ID));
            stmt->setInt32(2, itr->second.Standing);
            stmt->setUInt16(3, uint16(itr->second.Flags));
            trans->Append(stmt);
            itr->second.needSave = false;
        }
    }
Да, но вот тут по моему за end выйти невозможно, или я не прав?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2012, 17:37     Segmentation fault при вызове метода
Еще ссылки по теме:

C++ Ошибка "Segmentation fault" при организации дерева
Segmentation fault C++
Segmentation fault при наследовании класса C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
10.12.2012, 17:37     Segmentation fault при вызове метода #10
lan143, может указатель разыменовываете, который непонятно куда ссылается. Повтыкайте печать куда-нибудь, что понять на какой строке она валится. Ну или в дебаге смотрите шаг за шагом.
Yandex
Объявления
10.12.2012, 17:37     Segmentation fault при вызове метода
Ответ Создать тему
Опции темы

Текущее время: 15:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru