Редкие падение на boost::bind
От: rusla Россия  
Дата: 04.07.13 13:09
Оценка: 1 (1)
Здравствуйте!
Помогите найти и исправить причину падения.
Падает с Access Violation при попытке сделать boost::bind. Падает очень редко. Может упасть 1-2 раза в день, а иногда работает неделю без падений.
Путем добавления логирования удалось выяснить что передаваемые параметры валидны, при обращении к ним не падает.
В логе при падении выводится следующее:
Start
good1
good2
good3
good4
SEH_exception:
ExceptionCode: 0xc0000005
ExceptionFlags: 0x0
ExceptionInformation[0]: 0x0
ExceptionInformation[1]: 0xffff8012
NumberParameters: 0x2
ExceptionAddress: 0x43e65cc'


Код:

typedef boost::function<bool (long)> callback_foo_type;

bool callback_foo (long p0, a1* a1_, a2* a2_, a3* a3_, a4* a4_)
{
....
}


bool A::foo (a1* a1_, a2* a2_, a3* a3_, a4* a4_)
{
    Log("Start");

    if (a1_)
        Log("good1");
    if (a2_)
        Log("good2");
    if (a3_)
        Log("good3");
    if (a4_)
        Log("good4");

    callback_foo_type callFn = boost::bind (&callback_foo, _1, a1_, a2_, a3_, a4_); /*тут падает*/

    Log("Finish");
}



05.07.13 13:24: Перенесено модератором из 'C/C++' — Кодт
Re: Редкие падение на boost::bind
От: Abyx Россия  
Дата: 04.07.13 13:38
Оценка: +1
Здравствуйте, rusla, Вы писали:

используйте крешдампы.
In Zen We Trust
Re: Редкие падение на boost::bind
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 04.07.13 14:32
Оценка:
Здравствуйте, rusla, Вы писали:

R>Здравствуйте!

R>Помогите найти и исправить причину падения.
Многопоточность есть?
Sic luceat lux!
Re[2]: Редкие падение на boost::bind
От: rusla Россия  
Дата: 04.07.13 15:02
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, rusla, Вы писали:


R>>Здравствуйте!

R>>Помогите найти и исправить причину падения.
K>Многопоточность есть?

многопоточность есть
этот код использует один поток
данные которые передаются в функцию (которые могут быть изменены в других потоках) — boost::thread_specific_ptr<>

еще такая закономерность: когда логирования не было — падало часто (1-2-3 раза в день) после добавления логирования успешно работало почти месяц.
Re: Редкие падение на boost::bind
От: anglichanin  
Дата: 04.07.13 15:08
Оценка:
Здравствуйте, rusla, Вы писали:
...
R> callback_foo_type callFn = boost::bind (&callback_foo, _1, a1_, a2_, a3_, a4_); /*тут падает*/

R> Log("Finish");

R>}
R>[/ccode]

Падает точно тут? Или все-таки при вызове функционального объекта, созданного байндом?
Пример:

    callFn( 1 );


Не вижу причин для падения при связывании.
Re: Редкие падение на boost::bind
От: Erop Россия  
Дата: 04.07.13 15:09
Оценка:
Здравствуйте, rusla, Вы писали:

R>
R>    if (a1_)
R>        Log("good1");
R>    if (a2_)
R>        Log("good2");
R>    if (a3_)
R>        Log("good3");
R>    if (a4_)
R>        Log("good4");
R>


Тут нет доступа по указателям, правда в bind, возможно, тоже нет,..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Редкие падение на boost::bind
От: TimurSPB Интернет  
Дата: 04.07.13 15:09
Оценка:
Здравствуйте, rusla, Вы писали:

R>Здравствуйте, Kernan, Вы писали:


K>>Здравствуйте, rusla, Вы писали:


R>>>Здравствуйте!

R>>>Помогите найти и исправить причину падения.
K>>Многопоточность есть?

R>многопоточность есть

R>этот код использует один поток
R>данные которые передаются в функцию (которые могут быть изменены в других потоках) — boost::thread_specific_ptr<>

R>еще такая закономерность: когда логирования не было — падало часто (1-2-3 раза в день) после добавления логирования успешно работало почти месяц.


Есть тулы для поиска data race типа http://software.intel.com/en-us/intel-inspector-xe
Make flame.politics Great Again!
Re[2]: Редкие падение на boost::bind
От: rusla Россия  
Дата: 04.07.13 15:24
Оценка:
Здравствуйте, anglichanin, Вы писали:

A>Здравствуйте, rusla, Вы писали:

A>...
R>> callback_foo_type callFn = boost::bind (&callback_foo, _1, a1_, a2_, a3_, a4_); /*тут падает*/

R>> Log("Finish");

R>>}
R>>[/ccode]

A>Падает точно тут? Или все-таки при вызове функционального объекта, созданного байндом?

A>Пример:

A>
A>    callFn( 1 );
A>


A>Не вижу причин для падения при связывании.



падает точно тут
функциональный объект созданный байндом вообще не вызывается далее нигде, потому что у клиента эта функциональность выключена. Вся эта функциональность представляет собой некую дополнительную проверку данных на валидность. Функция callFn вызывается далее если это требуется (если заполнены определенные данные в БД). У клиента сейчас там все пусто, в логах видно что функция ни разу не вызывается...

вот тоже не пойму что там может падать
Re: Редкие падение на boost::bind
От: ioni Россия  
Дата: 04.07.13 16:42
Оценка:
Здравствуйте, rusla, Вы писали:

скорее всего где то гонки и объект уже не валиден
прикручивать нормальное создание крэшдампов
и пытаться создать минимальный пример в песочнице где это гарантированно падает
Re[3]: Редкие падение на boost::bind
От: anglichanin  
Дата: 05.07.13 08:04
Оценка:
Здравствуйте, rusla, Вы писали:
...
R>падает точно тут
R>функциональный объект созданный байндом вообще не вызывается далее нигде, потому что у клиента эта функциональность выключена. Вся эта функциональность представляет собой некую дополнительную проверку данных на валидность. Функция callFn вызывается далее если это требуется (если заполнены определенные данные в БД). У клиента сейчас там все пусто, в логах видно что функция ни разу не вызывается...

R>вот тоже не пойму что там может падать


Значит где-то портится память.
Re[3]: Редкие падение на boost::bind
От: anglichanin  
Дата: 05.07.13 08:07
Оценка:
Здравствуйте, rusla, Вы писали:

R>еще такая закономерность: когда логирования не было — падало часто (1-2-3 раза в день) после добавления логирования успешно работало почти месяц.


Это ничего не гарантирует. Нужно разбираться с многопоточностью и временем жизни объектов, на которые передаются ссылки.
Re[2]: Редкие падение на boost::bind
От: johny5 Новая Зеландия
Дата: 06.07.13 19:29
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, rusla, Вы писали:


R>>
R>>    if (a1_)
R>>        Log("good1");
R>>    if (a2_)
R>>        Log("good2");
R>>    if (a3_)
R>>        Log("good3");
R>>    if (a4_)
R>>        Log("good4");
R>>


E>Тут нет доступа по указателям, правда в bind, возможно, тоже нет,..


bind никакой код не запускает вообще, он только выдаёт тип подходящего функтора и складывает аргументы.
Тут либо стек порчен (и возможно повреждён callstack в дампе), либо куча (падает в new), либо callFn порчен (падает в boost::function) или доступается в параллель где то. Думаю callstack всех потоков показал бы причину подробнее.
Re[3]: Редкие падение на boost::bind
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 08.07.13 10:44
Оценка:
Здравствуйте, rusla, Вы писали:

R>еще такая закономерность: когда логирования не было — падало часто (1-2-3 раза в день) после добавления логирования успешно работало почти месяц.

Очевидно, что что-то у тебя уходит в небытие и добавление логгирования хороший индикатор этого. Скорее всего это создаётся на стеке. Напомню, что валидность данных в дампе не всегда говорит о валидности объекта который был размещён по адресу. Смотри как всё создаётся и удаляется.
Вообще, ситуация настолько бородатая, что можно в неё завернуться.
Sic luceat lux!
Re: Редкие падение на boost::bind
От: rusla Россия  
Дата: 23.08.13 15:52
Оценка:
R>
bool callback_foo (long p0, a1* a1_, a2* a2_, a3* a3_, a4* a4_)
R>{
R>....
R>}

R>bool A::foo (a1* a1_, a2* a2_, a3* a3_, a4* a4_)
R>{
R>    callback_foo_type callFn = boost::bind (&callback_foo, _1, a1_, a2_, a3_, a4_); /*тут падает*/
R>}
R>


Дополнение к вопросу.
Функция callback_foo глобальная.
Есть разница между тем что выше и вот этим?

сallback_foo_type callFn = boost::bind (callback_foo, _1, a1_, a2_, a3_, a4_);


убрал &
Что правильнее? Или это эквивалентные записи?

Что должно произойти чтоб &callback_foo стало не валидным? Такое возможно?
Re[2]: Редкие падение на boost::bind
От: johny5 Новая Зеландия
Дата: 23.08.13 22:50
Оценка:
Здравствуйте, rusla, Вы писали:

R>>
R>bool callback_foo (long p0, a1* a1_, a2* a2_, a3* a3_, a4* a4_)
R>>{
R>>....
R>>}

R>>bool A::foo (a1* a1_, a2* a2_, a3* a3_, a4* a4_)
R>>{
R>>    callback_foo_type callFn = boost::bind (&callback_foo, _1, a1_, a2_, a3_, a4_); /*тут падает*/
R>>}
R>>


R>Дополнение к вопросу.

R>Функция callback_foo глобальная.
R>Есть разница между тем что выше и вот этим?

R>
R>сallback_foo_type callFn = boost::bind (callback_foo, _1, a1_, a2_, a3_, a4_);
R>


R>убрал &

R>Что правильнее? Или это эквивалентные записи?
По стандарту пишется с &, ваш компилятор поддерживает запись без & как легаси.

R>Что должно произойти чтоб &callback_foo стало не валидным? Такое возможно?

Компиляция и кодогенерация обоих вариантов идеинтична.
Re: Редкие падение на boost::bind
От: The Passenger СССР  
Дата: 24.08.13 11:25
Оценка:
R>ExceptionAddress: 0x43e65cc'


бряк на адрес — и по стеку смотреть — где что, может какие мысли и появяться
... но я пока за то, что какойто адрес невалиден, хотя и ненулевой
еще вариант — расстрел стека или памяти

... если есть оптимизация — то лучше отключить и стараться воспроизвести,
при оптимизации — возможны кривые адреса и стек, так что вполне возможно вы патаете на вызове функции,
а отладчик показывает кривой аддрес на бинд ... если нужно отладить именно релизную — ассемблер в руки
еще проверить — падает ли одинаково в релизной и дебажной версии
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.