
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.220] |
![]() |
|
Сообщ.
#1
,
|
|
|
Здравствуйте.
Не знал в какой раздел запостить этот топик, но так или иначе. Пишу оболочки на Делфи, и переодически некоторые dll-ки пишу на С++ (посредством Visual Studio), которые в последствии к этой оболочке подключаю. Бывает, в этих dll'ках происходят ошибки, а-ля Access Violation at address 05B47A7 in module 'blabla.dll'. Вопрос: как узнать в каком месте в dll'ke произошла ошибка зная адрес(05B47A7) ошибки? |
Сообщ.
#2
,
|
|
|
Пока висит окно - ставьте программу на паузу (вы ведь запускали под отладчиком?), потом Search/Go to address, вводите $05B47A7.
|
Сообщ.
#3
,
|
|
|
>Пока висит окно - ставьте программу на паузу (вы ведь запускали под отладчиком?), потом Search/Go to address, вводите $05B47A7.
Нет, речь идет о баграпортах которые приходят от пользователей. Например, вот, прислали мне скриншот, мол A/V по адресу хххххх в blabla.dll. И вот, как мне узнать где именно там произошла ошибка, имея на руках только адрес? |
![]() |
Сообщ.
#4
,
|
|
Обычно достаточно расрутить стек SEH фреймов. Достаточно грамотный пример идет в составе JEDY библиотеки, там как раз помимо этого показано как работать с линкуемой отладочной информацией и MAP файлом.
|
![]() |
Сообщ.
#5
,
|
|
Адрес ошибки имеет значение только на машине клиента. Так что эта информация, на мой взгляд, пользы не несёт.
Попробуйте скомпилировать тот модуль (если знаете какой именно или даже все, когда выбора нет) с отладочным журналом (log), ведя учёт времени входа и выхода критических участков кода. Затем попросите клиента прислать вам этот журнал. Нужно знать сначала как воспроизвести ту ошибку, а остальное - дело техники. |
Сообщ.
#6
,
|
|
|
Цитата IDontBelieveInSilence @ Нет, речь идет о баграпортах которые приходят от пользователей. Рекомендую http://www.eurekalog.com/index_delphi.php |
Сообщ.
#7
,
|
|
|
Цитата IDontBelieveInSilence @ И вот, как мне узнать где именно там произошла ошибка, имея на руках только адрес? Никак. Чтобы это узнать, нужно знать актуальный базовый адрес blabla.dll на машине клиента в момент ошибки. Например, адрес ошибки - $05B47A7. blabla.dll была загружена по $0500000. Значит, смещение инструкции кода, вызывавшей ошибку, от начала DLL: $05B47A7 - $0500000 = $B47A7. Вы запустили программу у себя, поставили на паузу. На вашей машине blabla.dll имеет базовый адрес $0610000. Тогда вас интересует адрес $0610000 + $B47A7 = $06C47A7. К таким ситуациям нужно себя готовить заранее. EurekaLog, madExcept, JCL (JclDebug + JclHookExcept). |
Сообщ.
#8
,
|
|
|
>К таким ситуациям нужно себя готовить заранее. EurekaLog, madExcept, JCL (JclDebug + JclHookExcept).
В том то и дело, что в случае с Делфи-оболочкой всё решено именно так - у меня интегрирован EurekaLog, но как быть с dll'ками, которые у меня написаны на С++ в Visual Studio 2008? Есть ли для Visual Studio аналог EurekaLog? |
Сообщ.
#9
,
|
|
|
Цитата IDontBelieveInSilence @ >К таким ситуациям нужно себя готовить заранее. EurekaLog, madExcept, JCL (JclDebug + JclHookExcept). В том то и дело, что в случае с Делфи-оболочкой всё решено именно так - у меня интегрирован EurekaLog, но как быть с dll'ками, которые у меня написаны на С++ в Visual Studio 2008? Есть ли для Visual Studio аналог EurekaLog? Тогда не понятно почему вы задаёте свой вопрос именно тут? Мы никогда не отвечали за мелкомягких. P.S. У них есть свои решения, но это уже не сюда. |
Сообщ.
#10
,
|
|
|
Ответ на этот вопрос зависит от того, кто обрабатывает исключение в DLL.
Если исключение передаётся вам - его должна поймать EurekaLog. Понятно, что вразумительное сообщение об ошибке при этом будет далеко не всегда. Но у вас будет хотя бы стек вызовов. Только вот сам стек вызовов будет нечитабелен - ведь в DLL, написанной на C++, нет никакой отладочной информации в любом "формате Borland" (map, TD и т.п.). Как правило, передавать исключения через границы модулей - плохая идея. Потому что обычно в языке исключение представлено объектом. Программа Delphi не знает, как обращаться с объектами C++, как их читать, как их освобождать (после обработки исключения). Поэтому, DLL обязана обрабатывать все исключения внутри себя, передавая во вне только индикацию ошибки. |