![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
neosapient |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
Добрый день.
Какие ещё параметры в настройках проекта VC2008 отвечают за обработку исключений? Делаю dll, которая работает с MySQL через с статически-линкуемую mysqlclient.lib. Начал проводить нагрузочное тестирование - dll стала падать. Тогда я обернул каждую функцию в try/catch блоки
Т.е. обернул вообще каждую функцию и метод класса в try/catch. Но падения продолжались. Зашел в настройки проекта (у меня VC2008) и установил Properties: Configuration Properties -> C\C++ -> Code Generation ->Yes With SEH Exceptions (/EHa) Но исключения по прежнему появляются и не обрабатываются программой. Возможно есть флаги в настройках проекта, который отвечают за работу с исключениями. Вопрос: Какие ещё параметры проекта надо проверить? Это сообщение отредактировал(а) neosapient - 3.8.2012, 12:24 |
|||
|
||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Если бы исключения не были включены, то студия бы вас материла за это. Кстати, SEH - это совершенно иные исключения. Вам хватит и /EHs, я думаю(оно по-умолчанию, вроде как, и есть).
Проблема в другом, я думаю. DllMain должна как можно быстрее возвращать управление. В ней нельзя делать много действий и различных системных вызовов. Можно использовать только функции библиотеки kernel32. Это сообщение отредактировал(а) Randajad - 3.8.2012, 12:40 |
|||
|
||||
neosapient |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
При старте запускается дочерний поток, в котором идет основная работа.
При завершении Главной программы, мою dll уведомляют, что пора закрывать дочерний поток, что она и делает. Системных вызовов не делаю, только опрос и запись данных в MySQL. Я гадаю, может при статической линковке mysqlclient.lib компилятор не подцепил обработку исключений из этой библиотеки? Это сообщение отредактировал(а) neosapient - 3.8.2012, 12:57 |
|||
|
||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Ничего в ней не делайте. Можете даже убрать. Будете спать крепче. Кто дает гарантии, что загружены все нужные DLL, когда вы создаете поток? А MySQL, по-вашему, системных вызовов не делает?
Компилятор умный, зря вы так. mysqlclient.lib - это библиотека на C? Если да, в ней нет исключений. Добавлено через 3 минуты и 2 секунды К тому же, создание потоков запрещено в DllMain. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ага. возможно речь идет о сегфолтах? |
|||
|
||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Не-не. Сегфолты там? Я все-таки считаю, что они умные люди и до такого бы не опустились.
![]() В любом случае, все это уже прописано в либе и читается линкером. А /Eh* влияют только на компиляцию того кода, который, собственно, компиляют, а не на код либы. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: нет Всего: 88 |
нет, создание разрешено, но фактическое начало выполнения треда происходит после выхода из DllMain -------------------- Обижено школьников: 8 |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: нет Всего: 88 |
-------------------- Обижено школьников: 8 |
|||
|
||||
Randajad |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Нельзя запускать. Это может потребовать блокировку загрузчика OS, что в свою очередь может вызвать deadlock.
Насчет:
Не понял глубокой мысли. Я говорил о SEH исключениях и только. Это сообщение отредактировал(а) Randajad - 3.8.2012, 21:42 |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: нет Всего: 88 |
Я тоже говорил именно о них. Почему нельзя вызывать никакие апи, кроме kernel32? Потому что нет гарантии что для остальных используемых длл уже вызвана дллмейн. Но это же касается и вообще любых используемых длл, не только вин-апишных. Например авторы mysqlclient в своей длл мейн инициализируют глобальный указатель адресом, выделенным из кучи. В экспортируемых функциях они обращаются к этой памяти по этому указателю. Они не обязаны предусматривать вариант что кто-то может вызвать экспорт до того как отработает дллмейн. В этом случае функция пытается разыменовать неинициализированный глобальный указатель и получаем закономерное access violation, которое успешно проходит через границы модулей Так глубокая мысль более понятна? Это сообщение отредактировал(а) bems - 3.8.2012, 22:32 -------------------- Обижено школьников: 8 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |