BFE>Метод logger() не является потокобезопасным. Если он вызывается из двух и более ниток, то может быть создано два и более объектов типа CLogger.
Знаю. Там где крашится — поток из которгго пишутся логи — единственный.
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, Sheridan, Вы писали:
S>>Полный стек вызовов, крашится в Thread 1: _>
_>...
_>#15 0x000000000049692e in eing::graphic::world::CBlock::~CBlock (this=0x105d070) at ../../../src/graphic/world/cblock.cpp:48
_>#16 0x0000000000496c89 in eing::graphic::world::CBlock::~CBlock (this=0x105d070) at ../../../src/graphic/world/cblock.cpp:41
_>...
_>
S>Накидайте идей что это может быть? Может уже встречалось такое?... _>А что твориться в файле cblock.cpp в строках 40-50
Это деструктор.
Здравствуйте, Sheridan, Вы писали:
S>>>Полный стек вызовов, крашится в Thread 1: _>>
_>>...
_>>#15 0x000000000049692e in eing::graphic::world::CBlock::~CBlock (this=0x105d070) at ../../../src/graphic/world/cblock.cpp:48
_>>#16 0x0000000000496c89 in eing::graphic::world::CBlock::~CBlock (this=0x105d070) at ../../../src/graphic/world/cblock.cpp:41
_>>...
_>>
S>Накидайте идей что это может быть? Может уже встречалось такое?... _>>А что твориться в файле cblock.cpp в строках 40-50 S>Это деструктор.
Здравствуйте, Sheridan, Вы писали:
S>Здравствуйте, kov_serg, Вы писали:
_>>Здравствуйте, Sheridan, Вы писали:
S>>>Полный стек вызовов, крашится в Thread 1: _>>
_>>...
_>>#15 0x000000000049692e in eing::graphic::world::CBlock::~CBlock (this=0x105d070) at ../../../src/graphic/world/cblock.cpp:48
_>>#16 0x0000000000496c89 in eing::graphic::world::CBlock::~CBlock (this=0x105d070) at ../../../src/graphic/world/cblock.cpp:41
_>>...
_>>
S>Накидайте идей что это может быть? Может уже встречалось такое?... _>>А что твориться в файле cblock.cpp в строках 40-50 S>Это деструктор. S>
Смущает что в #15 и #16 this одинаковый (0x105d070) т.е. сначала 48: delete m_dynamicMesh; а затем контрольный #41 ~CBlock() -- очень подозрительно, или нумерация строк съехала.
я бы добавил что-то вида
struct CBlock {
...
struct State { int x; State() { x=0; } ~State() { if (x) panic(); x=1; } } state;
...
~CBlock() {
if (state.x) panic();
...
Здравствуйте, Sheridan, Вы писали:
S>Я предполагал что это краш в другом потоке, но уже дважды всё там переписал — не должно S>Ну и крашится на вызове логгера из деструктора объекта. При этом оно к объекту самому разрушаемому не обращается
Ещё вариант: у базового объекта нет виртуального деструктора, а у наследника деструктор виртуальный.
Здравствуйте, kov_serg, Вы писали:
_>Смущает что в #15 и #16 this одинаковый (0x105d070) т.е. сначала 48: delete m_dynamicMesh; а затем контрольный #41 ~CBlock() -- очень подозрительно, или нумерация строк съехала.
Да, меня тоже это смущает, но я склоняюсь к мысли что дебаггер тут просто показывает место вызова delete в деструкторе.
I>Добавь проверку что m_logstream.open был успешен.
Проходил через это. Даже вообще по месту новый создавал явно. Не помогает. Всё больше склоняюсь к мысли что не в логгере дело.
Здравствуйте, B0FEE664, Вы писали:
BFE>Ещё вариант: у базового объекта нет виртуального деструктора, а у наследника деструктор виртуальный.
Есть виртуальный, есть...
Здравствуйте, nekocoder, Вы писали:
S>>Я же точно знаю время жизни своих объектов. N>Нет, не знаешь. Поэтому у тебя портится память и ты мучаешься с непонятным крашем.
У меня не портится. А вот за urho3d не ручаюсь. Достаточно посмотреть на реализацию их "умных" указателей, не к ночи они помянуты будут...
Здравствуйте, Sheridan, Вы писали:
S>#17 0x000000000045c05f in eing_helper::cube::AppCubeHelper::redrawTestCube (this=0x77cee0) at ../../../src/applications/cube_helper/main.cpp:350 S> e = @0xae6100: {_vptr.exception = 0xae61b0} S>#18 0x000000000045d2af in eing_helper::cube::AppCubeHelper::HandleUpdate (this=0x77cee0, eventType=..., eventData=...) at ../../../src/applications/cube_helper/main.cpp:289
А почему вообще вызываются деструкторы? Кто-то бросил исключение?
Здравствуйте, Sheridan, Вы писали:
S>Да, меня тоже это смущает, но я склоняюсь к мысли что дебаггер тут просто показывает место вызова delete в деструкторе.
С другой стороны. Ошибка говорит о том что кто-то помял память.
Можно попробывать вызвть проверку целосности памяти в разных местах что бы локализовать момент разрушения.
Здравствуйте, B0FEE664, Вы писали:
BFE>А почему вообще вызываются деструкторы? Кто-то бросил исключение?
Нет. Просто по событию пришло время удалить объект.
Здравствуйте, Sheridan, Вы писали:
S>Здравствуйте, nekocoder, Вы писали:
S>>>Я же точно знаю время жизни своих объектов. N>>Нет, не знаешь. Поэтому у тебя портится память и ты мучаешься с непонятным крашем. S>У меня не портится. А вот за urho3d не ручаюсь. Достаточно посмотреть на реализацию их "умных" указателей, не к ночи они помянуты будут...
Ты ещё не нашёл ошибку, но уверен, что у тебя память не портиться. Откуда такая уверенность? При ошибках работы с памятью упасть может не там, где память испорчена, а совсем в другом месте.
У тебя не падает при запуске из под валгринда, но падает, когда запускаешь без валгринда. Похоже на неинициализированную переменную или испорченный стек. При сборке в debug и в release программа ведёт себя одинаково? sprintf нигде не используется?
AN>Ты ещё не нашёл ошибку, но уверен, что у тебя память не портиться. Откуда такая уверенность? При ошибках работы с памятью упасть может не там, где память испорчена, а совсем в другом месте.
В своих объектах я уверен просто, пока что не могу себе представить ситуацию когда чтото удалится или создастса невовремя.
AN>У тебя не падает при запуске из под валгринда, но падает, когда запускаешь без валгринда. Похоже на неинициализированную переменную или испорченный стек.
Да, похоже на то. Сегодня еще раз поищу-почитаю как в urho объектами рулить можно. В предыдущие итерации ничего не обнаружил хитрого...
AN>При сборке в debug и в release программа ведёт себя одинаково?
Да.
AN>sprintf нигде не используется?
Нет, только std::out