Здравствуйте!
Помогите найти и исправить причину падения.
Падает с 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'
Здравствуйте, Kernan, Вы писали:
K>Здравствуйте, rusla, Вы писали:
R>>Здравствуйте! R>>Помогите найти и исправить причину падения. K>Многопоточность есть?
многопоточность есть
этот код использует один поток
данные которые передаются в функцию (которые могут быть изменены в других потоках) — boost::thread_specific_ptr<>
еще такая закономерность: когда логирования не было — падало часто (1-2-3 раза в день) после добавления логирования успешно работало почти месяц.
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, возможно, тоже нет,..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, rusla, Вы писали:
R>Здравствуйте, Kernan, Вы писали:
K>>Здравствуйте, rusla, Вы писали:
R>>>Здравствуйте! R>>>Помогите найти и исправить причину падения. K>>Многопоточность есть?
R>многопоточность есть R>этот код использует один поток R>данные которые передаются в функцию (которые могут быть изменены в других потоках) — boost::thread_specific_ptr<>
R>еще такая закономерность: когда логирования не было — падало часто (1-2-3 раза в день) после добавления логирования успешно работало почти месяц.
Здравствуйте, 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 вызывается далее если это требуется (если заполнены определенные данные в БД). У клиента сейчас там все пусто, в логах видно что функция ни разу не вызывается...
скорее всего где то гонки и объект уже не валиден
прикручивать нормальное создание крэшдампов
и пытаться создать минимальный пример в песочнице где это гарантированно падает
Здравствуйте, rusla, Вы писали:
... R>падает точно тут R>функциональный объект созданный байндом вообще не вызывается далее нигде, потому что у клиента эта функциональность выключена. Вся эта функциональность представляет собой некую дополнительную проверку данных на валидность. Функция callFn вызывается далее если это требуется (если заполнены определенные данные в БД). У клиента сейчас там все пусто, в логах видно что функция ни разу не вызывается...
R>вот тоже не пойму что там может падать
Здравствуйте, rusla, Вы писали:
R>еще такая закономерность: когда логирования не было — падало часто (1-2-3 раза в день) после добавления логирования успешно работало почти месяц.
Это ничего не гарантирует. Нужно разбираться с многопоточностью и временем жизни объектов, на которые передаются ссылки.
Здравствуйте, 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 всех потоков показал бы причину подробнее.
Здравствуйте, rusla, Вы писали:
R>еще такая закономерность: когда логирования не было — падало часто (1-2-3 раза в день) после добавления логирования успешно работало почти месяц.
Очевидно, что что-то у тебя уходит в небытие и добавление логгирования хороший индикатор этого. Скорее всего это создаётся на стеке. Напомню, что валидность данных в дампе не всегда говорит о валидности объекта который был размещён по адресу. Смотри как всё создаётся и удаляется.
Вообще, ситуация настолько бородатая, что можно в неё завернуться.
R>убрал & R>Что правильнее? Или это эквивалентные записи?
По стандарту пишется с &, ваш компилятор поддерживает запись без & как легаси.
R>Что должно произойти чтоб &callback_foo стало не валидным? Такое возможно?
Компиляция и кодогенерация обоих вариантов идеинтична.
бряк на адрес — и по стеку смотреть — где что, может какие мысли и появяться
... но я пока за то, что какойто адрес невалиден, хотя и ненулевой
еще вариант — расстрел стека или памяти
... если есть оптимизация — то лучше отключить и стараться воспроизвести,
при оптимизации — возможны кривые адреса и стек, так что вполне возможно вы патаете на вызове функции,
а отладчик показывает кривой аддрес на бинд ... если нужно отладить именно релизную — ассемблер в руки
еще проверить — падает ли одинаково в релизной и дебажной версии