Добрый день всем!
Возникла у меня проблема.
Есть программа (обычная аппликуха, для меня является черным ящиком), которая вызывает мою длл-ку.
Моя длл-ка ранее работала хорошо.
После серии серьезных изменений в длл стали возникать время от времени креши.
"An exception (c00000005) occured during DLLEntryPoint or DLL main in module mylib.dll"
или
"The application, ExtProg.exe, generated an application error
The error occurred on 07/04/2008 @ 14:07:04.743
The exception generated was c0000005 at address 01BEA2C0 (mylib!)"
Проблема нестабильна. Натыкал в разные места логи и начал гонять прогу.
В том числе обрамил все вызовы внешних экспортируемых функций логами
Например:
int WINAPI SendCommandToServerEx(HSESSION hSession, int command, const BYTE *data, int length, BOOL answer,
int answerErrorCode, const char* answerErrorMsg)
{
WriteLogExternal(logname, "SendCommandToServerEx: begin", FAppLogCS, true, Flot, lotImportant);
int res = g_pClient->SendCommandToServerEx(command, data, length, answer, answerErrorCode, answerErrorMsg);
WriteLogExternal(logname, "SendCommandToServerEx: end", FAppLogCS, true, Flot, lotImportant);
return res;
}
В последнее время вижу, что исключения возникают как-будто вне моих экспортируемых функций, например, "SendCommandToServerEx: end" будет последней строкой в логе, дальше уже исключение.
Как такое может быть? Ну не return же вызвал исключение! Как это отловить?
Помогите, сроки горят.
Длл-ка написана на Visual Studio 2008.
Re: Crash DLL, Access violation. Не могу отловить место.
Первая причина возможно не совпадают рантайм библиотеки и приложения
экспшены возникают по всей видимости в системных функциях и успешно обрабатываются с возвратом кода ошибки
соответственно ваше приложение должно проверять все коды возвратов
ну и самое простое запустите под отладчиком и смотрите что где не так
удачи
Re[2]: Crash DLL, Access violation. Не могу отловить место.
спасибо, но не совсем понятно
I>Первая причина возможно не совпадают рантайм библиотеки и приложения
Насчет рантаймов. Внешнее приложение тоже написано на VS C++, не уверен только насчет версии. Могут ли быть такие несовместимости? Ранее эта дллка была написана на Borland C++ Builder 6.0 — проблем с рантаймом не возникало. Я и на студию-то мигририровал эту дллку, чтобы попробовать избежать возникшей проблемы. Проблемы появились после изменения внутренних механизмов работы длл-ки. Мне кажеться, и копаться надо внутри нее. Но как, если по логам исключения происходят уже после отработки дллки?
I>экспшены возникают по всей видимости в системных функциях и успешно обрабатываются с возвратом кода ошибки
Не совсем вас понял. Судя по логу, ошибки возникают где-то по пути из длл в аппликуху.
I>соответственно ваше приложение должно проверять все коды возвратов
я внутри дллки стараюсь все проверять. но наружу, тоесть внутрь вызывающей апликухи я не в силах заглянуть.
I>ну и самое простое запустите под отладчиком и смотрите что где не так I>удачи
Прошу поподробней обьяснить, как я могу отдебагать дллку, когда она вызывается внешней апликухой, к которой нет исходников.
Простите, если что, я в студии новичок.
Re[3]: Crash DLL, Access violation. Не могу отловить место.
Здравствуйте, Kelasant, Вы писали:
K>Здравствуйте, ioni, Вы писали:
K>спасибо, но не совсем понятно
I>>Первая причина возможно не совпадают рантайм библиотеки и приложения
K>Насчет рантаймов. Внешнее приложение тоже написано на VS C++, не уверен только насчет версии. Могут ли быть такие несовместимости? Ранее эта дллка была написана на Borland C++ Builder 6.0 — проблем с рантаймом не возникало. Я и на студию-то мигририровал эту дллку, чтобы попробовать избежать возникшей проблемы. Проблемы появились после изменения внутренних механизмов работы длл-ки. Мне кажеться, и копаться надо внутри нее. Но как, если по логам исключения происходят уже после отработки дллки?
Вполне могут
более того если написаны на разных студия (вплоть до сервис паков) могут быть проблемы
попробуйте собрать с разными версиями рантаймов
может быть попробовать использовать статическую линковку
I>>экспшены возникают по всей видимости в системных функциях и успешно обрабатываются с возвратом кода ошибки K>Не совсем вас понял. Судя по логу, ошибки возникают где-то по пути из длл в аппликуху.
это как это то?
I>>соответственно ваше приложение должно проверять все коды возвратов
K>я внутри дллки стараюсь все проверять. но наружу, тоесть внутрь вызывающей апликухи я не в силах заглянуть.
I>>ну и самое простое запустите под отладчиком и смотрите что где не так I>>удачи
K>Прошу поподробней обьяснить, как я могу отдебагать дллку, когда она вызывается внешней апликухой, к которой нет исходников. K>Простите, если что, я в студии новичок.
Это в принципе не важно есть у вас исходники приложения или нет
на вкладке для отладчика указываете приложение которое загружает вашу либу и вперед
Re[4]: Crash DLL, Access violation. Не могу отловить место.
Здравствуйте, ioni, Вы писали:
K>>Насчет рантаймов. Внешнее приложение тоже написано на VS C++, не уверен только насчет версии. Могут ли быть такие несовместимости? Ранее эта дллка была написана на Borland C++ Builder 6.0 — проблем с рантаймом не возникало. Я и на студию-то мигририровал эту дллку, чтобы попробовать избежать возникшей проблемы. Проблемы появились после изменения внутренних механизмов работы длл-ки. Мне кажеться, и копаться надо внутри нее. Но как, если по логам исключения происходят уже после отработки дллки?
I>Вполне могут I>более того если написаны на разных студия (вплоть до сервис паков) могут быть проблемы I>попробуйте собрать с разными версиями рантаймов I>может быть попробовать использовать статическую линковку
Может ли быть, что был каким-то образом нарушен стек длл-кой? Или какие-то фокусы с кучей?
I>>>экспшены возникают по всей видимости в системных функциях и успешно обрабатываются с возвратом кода ошибки K>>Не совсем вас понял. Судя по логу, ошибки возникают где-то по пути из длл в аппликуху. I>это как это то?
Ну, я имел в виду, что если вызывающая прога корректна, а мои экспортируемые функции доходят до ретурна без проблем, то могут быть какие-то проблемы со стеком или кучей, правда, пока просто не представляю себе как это.
K>>Прошу поподробней обьяснить, как я могу отдебагать дллку, когда она вызывается внешней апликухой, к которой нет исходников. K>>Простите, если что, я в студии новичок. I>Это в принципе не важно есть у вас исходники приложения или нет I>на вкладке для отладчика указываете приложение которое загружает вашу либу и вперед
Попрошу уточнить для новичка. Это весь комплекс (вызывающая программа + моя длл) должен быть установлен и настроен в каталоге, куда компилится моя дллка, затем вызывающая программа запущена, далее я должен открыть в студии проект дллки, сделать "Дебаг"-"Атач ту процесс" и начать дебагать?
Re[5]: Crash DLL, Access violation. Не могу отловить место.
K>Может ли быть, что был каким-то образом нарушен стек длл-кой? Или какие-то фокусы с кучей?
может
это уже как правило следствие
I>>>>экспшены возникают по всей видимости в системных функциях и успешно обрабатываются с возвратом кода ошибки K>>>Не совсем вас понял. Судя по логу, ошибки возникают где-то по пути из длл в аппликуху. I>>это как это то?
>Ну, я имел в виду, что если вызывающая прога корректна, а мои экспортируемые функции доходят до ретурна без проблем, >то могут быть какие-то проблемы со стеком или кучей, правда, пока просто не представляю себе как это.
возможно все
но чудес как правило не бывает
K>>>Прошу поподробней обьяснить, как я могу отдебагать дллку, когда она вызывается внешней апликухой, к которой нет исходников. K>>>Простите, если что, я в студии новичок. I>>Это в принципе не важно есть у вас исходники приложения или нет I>>на вкладке для отладчика указываете приложение которое загружает вашу либу и вперед
K>Попрошу уточнить для новичка. Это весь комплекс (вызывающая программа + моя длл)
да >должен быть установлен и настроен в каталоге, куда компилится моя дллка,
не обязательно но возможно
>затем вызывающая программа запущена,
это делает студия > далее я должен открыть в студии проект дллки, сделать "Дебаг"-"Атач ту процесс" и начать дебагать?
можно и так
Re: Crash DLL, Access violation. Не могу отловить место.
От:
Аноним
Дата:
10.08.08 14:21
Оценка:
1) ищи проблемы в конструкторах и деструкторов статических объектов
2) запусти приложение под дебагером перед тем как оно всосет твою длл, stop on AV должен стоять на 1st chance
Re[2]: Crash DLL, Access violation. Не могу отловить место.
Всем спасибо, кажеться, дело оказалось понятнее, чем я думал.
Я не учел, что прога вызывает мои функции из разных потоков.
Указал номера потоков в логах, теперь никаких чудес быть не должно.
Re[3]: Crash DLL, Access violation. Не могу отловить место.
От:
Аноним
Дата:
16.09.08 20:39
Оценка:
Здравствуйте, Kelasant, Вы писали:
K>Всем спасибо, кажеться, дело оказалось понятнее, чем я думал. K>Я не учел, что прога вызывает мои функции из разных потоков. K>Указал номера потоков в логах, теперь никаких чудес быть не должно.
Привет .
Вообще есть спец АПИ для отлова таких неприятносетй. поищи на CodeProject StackWalk XCrashReport BugTrap