На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Узнать где произошла ошибка по имеющемуся адресу
    Здравствуйте.
    Не знал в какой раздел запостить этот топик, но так или иначе.
    Пишу оболочки на Делфи, и переодически некоторые dll-ки пишу на С++ (посредством Visual Studio), которые в последствии к этой оболочке подключаю. Бывает, в этих dll'ках происходят ошибки, а-ля Access Violation at address 05B47A7 in module 'blabla.dll'. Вопрос: как узнать в каком месте в dll'ke произошла ошибка зная адрес(05B47A7) ошибки?
    Сообщение отредактировано: IDontBelieveInSilence -
      Пока висит окно - ставьте программу на паузу (вы ведь запускали под отладчиком?), потом Search/Go to address, вводите $05B47A7.
        >Пока висит окно - ставьте программу на паузу (вы ведь запускали под отладчиком?), потом Search/Go to address, вводите $05B47A7.
        Нет, речь идет о баграпортах которые приходят от пользователей. Например, вот, прислали мне скриншот, мол A/V по адресу хххххх в blabla.dll.
        И вот, как мне узнать где именно там произошла ошибка, имея на руках только адрес?
          Обычно достаточно расрутить стек SEH фреймов. Достаточно грамотный пример идет в составе JEDY библиотеки, там как раз помимо этого показано как работать с линкуемой отладочной информацией и MAP файлом.
            Адрес ошибки имеет значение только на машине клиента. Так что эта информация, на мой взгляд, пользы не несёт.

            Попробуйте скомпилировать тот модуль (если знаете какой именно или даже все, когда выбора нет) с отладочным журналом (log), ведя учёт времени входа и выхода критических участков кода. Затем попросите клиента прислать вам этот журнал. Нужно знать сначала как воспроизвести ту ошибку, а остальное - дело техники.
              Цитата IDontBelieveInSilence @
              Нет, речь идет о баграпортах которые приходят от пользователей.

              Рекомендую http://www.eurekalog.com/index_delphi.php
                Цитата IDontBelieveInSilence @
                И вот, как мне узнать где именно там произошла ошибка, имея на руках только адрес?


                Никак. Чтобы это узнать, нужно знать актуальный базовый адрес blabla.dll на машине клиента в момент ошибки.

                Например, адрес ошибки - $05B47A7. blabla.dll была загружена по $0500000. Значит, смещение инструкции кода, вызывавшей ошибку, от начала DLL: $05B47A7 - $0500000 = $B47A7.

                Вы запустили программу у себя, поставили на паузу. На вашей машине blabla.dll имеет базовый адрес $0610000. Тогда вас интересует адрес $0610000 + $B47A7 = $06C47A7.

                К таким ситуациям нужно себя готовить заранее. EurekaLog, madExcept, JCL (JclDebug + JclHookExcept).
                  >К таким ситуациям нужно себя готовить заранее. EurekaLog, madExcept, JCL (JclDebug + JclHookExcept).
                  В том то и дело, что в случае с Делфи-оболочкой всё решено именно так - у меня интегрирован EurekaLog, но как быть с dll'ками, которые у меня написаны на С++ в Visual Studio 2008? Есть ли для Visual Studio аналог EurekaLog?
                    Цитата IDontBelieveInSilence @

                    >К таким ситуациям нужно себя готовить заранее. EurekaLog, madExcept, JCL (JclDebug + JclHookExcept).
                    В том то и дело, что в случае с Делфи-оболочкой всё решено именно так - у меня интегрирован EurekaLog, но как быть с dll'ками, которые у меня написаны на С++ в Visual Studio 2008? Есть ли для Visual Studio аналог EurekaLog?


                    Тогда не понятно почему вы задаёте свой вопрос именно тут?
                    Мы никогда не отвечали за мелкомягких.
                    P.S. У них есть свои решения, но это уже не сюда.
                      Ответ на этот вопрос зависит от того, кто обрабатывает исключение в DLL.

                      Если исключение передаётся вам - его должна поймать EurekaLog. Понятно, что вразумительное сообщение об ошибке при этом будет далеко не всегда. Но у вас будет хотя бы стек вызовов. Только вот сам стек вызовов будет нечитабелен - ведь в DLL, написанной на C++, нет никакой отладочной информации в любом "формате Borland" (map, TD и т.п.).

                      Как правило, передавать исключения через границы модулей - плохая идея. Потому что обычно в языке исключение представлено объектом. Программа Delphi не знает, как обращаться с объектами C++, как их читать, как их освобождать (после обработки исключения). Поэтому, DLL обязана обрабатывать все исключения внутри себя, передавая во вне только индикацию ошибки.
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0498 ]   [ 16 queries used ]   [ Generated: 29.07.25, 06:29 GMT ]