Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Sender и Exception, Так кто вызвал ошибку, а кто метод? 
V
    Опции темы
Avers
Дата 12.11.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.6.2008
Где: 26rus

Репутация: нет
Всего: нет



Цитата(CodeMonkey @  12.11.2008,  11:16 Найти цитируемый пост)
Ну нет в exe-файле информации о принадлежности адреса функции. Нету. Хоть головой об стенку бейтесь, но её там нет 

Биться об стенку тоже вар)) Если хорошо удариться кодинг вообще не нужен станет  smile 
Создатели EurekaLog заявляют, что используют только стандартную Debug Info.... 
Они же получают имя процедуры.... даже если, она "висит сама по себе"....  
Я в тупике. 
--------------------
Born to be wild
PM MAIL   Вверх
CodeMonkey
Дата 12.11.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(Avers @  12.11.2008,  11:29 Найти цитируемый пост)
Создатели EurekaLog заявляют, что используют только стандартную Debug Info.... 

Давайте ещё раз. Приведу кусок текста из своей статьи про исключения:
Цитата
Поговорим о понятии отладочной информации. Программа представляет собой набор машинных команд. Текст программы представляет собой текстовый файл. Вопрос: как отладчик узнаёт, когда надо остановиться, если вы поставили бряк на строку в тексте? Где же соответствие между текстовым файлом и набором байт в exe-файле? Вот для такой связи и служит отладочная информация. Это, грубо говоря, набор инструкций типа: «машинные коды с 1056 по 1059 относятся к строке 234 модуля Unit1.pas». Вот с помощью такой информации и работает отладчик. По-умолчанию она включена. Делается это в опциях проекта на вкладке «Compiler» в разделе «Debugging». Обычно они все (или почти все) включены для отладочной версии программы и отключаются для конечной версии, которую вы будете распространять. Напомним, что после переключения любой из этих опций необходимо делать полный Build проекта, чтобы опция вступила в силу. 
«Debug information» (директива {$D+} или {$D-}) – это собственно и есть отладочная информация. Т.е. соответствие между текстом программы и её машинным кодом. Вы должны включить эту опцию, если хотите ставить бряки и выполнять пошаговую отладку. Отладочная информация сохраняется вместе с кодом модуля в dcu-файле. Т.е. один и тот же Unit1.dcu может быть скомпилирован как с отладочной информацией, так и без неё. Отладочная информация увеличивает время компиляции, размер dcu-файлов, но не влияет на размер и скорость работы полученного exe-файла (т.е. отладочная информация не подключается к exe-файлу). 
«Local symbols» (директива {$L+} или {$L-}) – является дополнением к отладочной информации. Она отвечает за соответствие между данными в exe-файле и именами переменных. Если вы включаете эту опцию, то отладчик позволит вам просматривать и изменять переменные. Также окно «Call Stack» будет способно отражать переданные в процедуры параметры.
«Reference info» – это дополнительная информация для редактора кода, которая позволяет ему отображать более подробную информацию об идентификаторах. Например, где была объявлена переменная.
Заметим, что эти три опции («Debug information», «Local symbols» и «Reference info») обычно имеет смысл включать или отключать одновременно. Опцию «Definitions only» включать особого смысла нет.


Формат DCU файлов недокументирован и меняется в (почти) каждой версии Delphi. Очевидно, что пытаться брать отладочную информацию из DCU, как это делает отладчик в Delphi - не самая лучшая идея.

Окей, тогда где её берут?

Ну во-первых, есть две таких опции: "TD32 Debug Info" и "Remote Debug Info" (вкладка "Linker"). Включение опции заставляет компилятор добавить в exe секцию с данными, которые содержат всю отладочную информацию для exe в формате TD32 или удалённого отладчика Delphi. Это уже можно использовать - в частности JclDebug и EurekaLog при недоступности других источников берут информацию именно из отладочной информации для TD32 - см. например TJclDebugInfoTD32.InitializeSource (есть даже целый модуль JclTD32.pas).
Но обычно это является запасным вариантом, а не основным. Почему? Потому что отладочная информация в этих форматах предназначена для внешнего (Turbo Debugger 32) и удалённого отладчика соответвенно. Это значит, что её формат оптимизирован для отладки, но не для ваших целей. В частности, с практической точки зрения это означает многократное (!) увеличение размера exe-файла.

Ещё варианты? Окей, вот основной вариант:
Цитата
Обратимся за помощью к компилятору Delphi, а точнее к его линкёру. Дело в том, что линкёр может сгенерировать нам при компиляции файлик, в который он запишет информацию по всему коду: какой код, каким модулям, каким функциям и даже каким строкам соответствует. Соответственно, мы можем прочитать этот файлик, найти там интересующий нас адрес и посмотреть, какой строке и в каком модуле он соответствует.
Для включения генерации такого файла нужно зайти в меню «Project»/«Options» и на вкладке «Linker» переключить «Map file» в любую позицию, отличную от «Off». Разные опции соответствуют разным уровням детализации информации, «Off» - генерация файла отключена. Рекомендую всегда ставить в позицию «Detailed» – это самая функциональная позиция. Итак, при включении генерации файла карты во время компиляции будет создаваться файл с тем же именем, что и исполняемый файл проекта, только с расширением .map. Вот вырезки из его содержимого, чтобы вы представляли, о чём идёт речь:

Код
 Start         Length     Name                   Class
 0001:00000000 00060508H .text                   CODE
 0002:00000000 0000181CH .data                   DATA
 0002:0000181C 0000125DH .bss                    BSS


Detailed map of segments 

 0001:00000000 00005103 C=CODE     S=.text    G=(none)   M=System   ACBP=A9
 0001:00005104 00000140 C=CODE     S=.text    G=(none)   M=SysInit  ACBP=A9
 0001:00005244 00000078 C=CODE     S=.text    G=(none)   M=Types    ACBP=A9
 0001:000052BC 00000CEC C=CODE     S=.text    G=(none)   M=Windows  ACBP=A9
 0001:00005FA8 00000038 C=CODE     S=.text    G=(none)   M=Messages ACBP=A9
 0001:00005FE0 00000320 C=CODE     S=.text    G=(none)   M=SysConst ACBP=A9
 0001:00006300 00006B24 C=CODE     S=.text    G=(none)   M=SysUtils ACBP=A9
 0001:0000CE24 000007FB C=CODE     S=.text    G=(none)   M=VarUtils ACBP=A9
 0001:0000D620 00002A42 C=CODE     S=.text    G=(none)   M=Variants ACBP=A9
 0001:00010064 00000120 C=CODE     S=.text    G=(none)   M=RTLConsts ACBP=A9
 0001:00010184 000007E8 C=CODE     S=.text    G=(none)   M=TypInfo  ACBP=A9
 0001:0001096C 00000038 C=CODE     S=.text    G=(none)   M=ActiveX  ACBP=A9
 0001:000109A4 00009896 C=CODE     S=.text    G=(none)   M=Classes  ACBP=A9
 0001:0001A23C 000002C8 C=CODE     S=.text    G=(none)   M=Consts   ACBP=A9
 0001:0001A504 00008D47 C=CODE     S=.text    G=(none)   M=Graphics ACBP=A9
 0001:0002324C 00000048 C=CODE     S=.text    G=(none)   M=Math     ACBP=A9
 0001:00023294 00000564 C=CODE     S=.text    G=(none)   M=Contnrs  ACBP=A9
 0001:000237F8 000000F4 C=CODE     S=.text    G=(none)   M=CommCtrl ACBP=A9
 0001:000238EC 00000787 C=CODE     S=.text    G=(none)   M=MultiMon ACBP=A9
 0001:00024074 00000038 C=CODE     S=.text    G=(none)   M=Imm      ACBP=A9
 0001:000240AC 00000FF8 C=CODE     S=.text    G=(none)   M=HelpIntfs ACBP=A9
...
 0002:00003220 00000004 C=BSS      S=.bss     G=DGROUP   M=JclSynch ACBP=A9
 0002:00003224 00000014 C=BSS      S=.bss     G=DGROUP   M=JclHookExcept ACBP=A9
 0002:00003238 0000001C C=BSS      S=.bss     G=DGROUP   M=JclDebug ACBP=A9
 0002:00003254 00000008 C=BSS      S=.bss     G=DGROUP   M=Unit1    ACBP=A9


  Address         Publics by Name

 0002:00003138       .01
 0002:00002A44       .1
 0002:00002668       .1
 0002:00002A34       .1
 0002:00002C00       .1
...
 0001:00023808       ImageList_GetImageCount
 0001:00023894       ImageList_Read
 0001:0002384C       ImageList_Remove
 0001:00023818       ImageList_ReplaceIcon
 0001:00023820       ImageList_SetBkColor
 0001:0002387C       ImageList_SetDragCursorImage
 0001:000238AC       ImageList_SetIconSize
 0001:0002389C       ImageList_Write
 0001:00055AB4       ImageRvaToSection
 0001:00055B10       ImageRvaToVa
 0002:00000BDC       Images
 0001:000414F4       ImgList
 0001:000240A4       Imm
 0002:00000BC0       IMM32DLL
 0001:0003E7E0       Imm32IsIME
 0002:00000180       IMSecsPerDay
 0001:0000E3C8       InBounds
 0001:0000E128       InBounds
 0001:0000E158       Increment
...

Line numbers for JclHookExcept(JclHookExcept.pas) segment .text

   145 0001:0005BBB0   146 0001:0005BBB1   147 0001:0005BBC9   148 0001:0005BBE6
   153 0001:0005BC7C   154 0001:0005BC82   155 0001:0005BC8E   156 0001:0005BC9C
   157 0001:0005BCA7   156 0001:0005BCB6   159 0001:0005BCC6   161 0001:0005BCD8
   162 0001:0005BCE2   167 0001:0005BCE8   168 0001:0005BD00   169 0001:0005BD09
   170 0001:0005BD0C   171 0001:0005BD29   181 0001:0005BD30   182 0001:0005BD34
   183 0001:0005BD3A   185 0001:0005BD48   186 0001:0005BD4F   187 0001:0005BD5B
   195 0001:0005BD60   196 0001:0005BD71   198 0001:0005BD83   200 0001:0005BD90
   201 0001:0005BD9C   202 0001:0005BDA9   203 0001:0005BDB7   204 0001:0005BDC4
   205 0001:0005BDD2   206 0001:0005BDD6   207 0001:0005BDE4   208 0001:0005BDEE
   209 0001:0005BDF6   206 0001:0005BE06   209 0001:0005BE09   205 0001:0005BE0C
   211 0001:0005BE1F   214 0001:0005BE3E   217 0001:0005BE52   228 0001:0005BE58
   229 0001:0005BE67   231 0001:0005BE84   232 0001:0005BE96   233 0001:0005BEA3
   238 0001:0005BEAC   239 0001:0005BEB3   240 0001:0005BEBD   241 0001:0005BEC9
   242 0001:0005BED4   243 0001:0005BED8   244 0001:0005BEDC   254 0001:0005BEE0
   257 0001:0005BEFB   260 0001:0005BEFC   261 0001:0005BF07   262 0001:0005BF0D
   263 0001:0005BF13   264 0001:0005BF1F   265 0001:0005BF2D   267 0001:0005BF52
   269 0001:0005BF67   287 0001:0005BF70   288 0001:0005BF7B   289 0001:0005BF83
   290 0001:0005BF89   291 0001:0005BF96   292 0001:0005BFA4   294 0001:0005BFB2
   295 0001:0005BFBC   297 0001:0005BFC4   298 0001:0005BFC9   300 0001:0005BFD5
   292 0001:0005BFD6   301 0001:0005BFD9   303 0001:0005BFEE   305 0001:0005C003
   341 0001:0005C00C   342 0001:0005C00D   344 0001:0005C016   345 0001:0005C022
   346 0001:0005C02A   348 0001:0005C04E   350 0001:0005C052   351 0001:0005C05B
   352 0001:0005C069   354 0001:0005C075   357 0001:0005C07C   358 0001:0005C07E
   441 0001:0005C098   443 0001:0005C09A   545 0001:0005C09C   575 0001:0005C0CF
   538 0001:0005C0D4   539 0001:0005C0DD   541 0001:0005C0EE

Line numbers for JclDebug(JclDebug.pas) segment .text

   712 0001:0005C91C   713 0001:0005C91E   717 0001:0005C920   718 0001:0005C922
   722 0001:0005C924   723 0001:0005C926   724 0001:0005C929   731 0001:0005C92C
   732 0001:0005C933   786 0001:0005C934   787 0001:0005C94D   788 0001:0005C958
   789 0001:0005C95B   790 0001:0005C961   791 0001:0005C967   792 0001:0005C987
   795 0001:0005C990   796 0001:0005C99A   798 0001:0005C9BE   805 0001:0005C9C4
...
  3684 0001:0005FD38  3686 0001:0005FD41  3687 0001:0005FD4B  3690 0001:0005FD53
  3691 0001:0005FD55  4026 0001:0005FD58  4027 0001:0005FD7A  4028 0001:0005FD84
  4029 0001:0005FD8E  4030 0001:0005FD98  4031 0001:0005FDA2  4090 0001:0005FE2A
  4017 0001:0005FE2C  4018 0001:0005FE35  4019 0001:0005FE46  4020 0001:0005FE57
  4022 0001:0005FE68

Line numbers for Unit1(Unit1.pas) segment .text

    37 0001:00060054    38 0001:00060067    39 0001:00060098    42 0001:0006009C
    43 0001:000600A1    47 0001:000600A4    48 0001:000600A9    56 0001:000600AC
    57 0001:000600CB    58 0001:000600D2    59 0001:000600DD    60 0001:000600E8
    59 0001:00060120    61 0001:00060123    62 0001:00060140    63 0001:00060173
    69 0001:00060190    71 0001:000601C3    65 0001:000601C8    66 0001:000601D1
    68 0001:000601D6

Line numbers for Project1(H:\Project1.dpr) segment .text

     9 0001:000604C0    10 0001:000604D0    11 0001:000604DC    12 0001:000604F4
    13 0001:00060500

Bound resource files

e:\programming\delphi7\Lib\Buttons.res
e:\programming\delphi7\Lib\ExtDlgs.res
e:\programming\delphi7\Lib\Controls.res
Unit1.dfm
Project1.res
Project1.drf


Program entry point at 0001:000604C0


Т.е. по сути, map-файл – это просто отладочная информация, выгруженная в текстовый файл.

Вот его и используют все готовые решения. Текстовый файл фиксированного формата. Что может быть проще? Читаем его, ищем нужный адрес и смотрим, какой функции, какому классу он принадлежит. 
Разумеется, читать (парсить) файл каждый раз - долго и неудобно (да и большой он). Именно поэтому большинство готовых решений при компиляции берут этот файл, выдёргивают из него нужную информацию, сохраняют её в удобном для себя формате и подключают её к exe-файлу. Получается аналог отладочной информации в формате TD32 в exe, только формат отладочной информации будет ваш личный. Кстати, готовые решения при этом часто ещё сжатие применяют. В среднем прирост размера exe файла составляет где-то 30%.

JclDebug, например, получает информацию о имени функции по заданному адресу с помощью таких классов:
 - TJclDebugInfoMap - получает информацию из map-файла с тем же именем, что и exe-файл.
 - TJclDebugInfoBinary - получает информацию из встроенной в exe секции JCLDEBUG или jdbg-файла с тем же именем, что и exe-файл.
 - TJclDebugInfoTD32 - получает информацию из встроенной в exe секции TD32.
 - TJclDebugInfoSymbols - получает информацию из встроенной в exe секции виндовой отладочной информации - аналог TD32, только решение от Microsoft.
Основным вариантом является TJclDebugInfoBinary, а остальные используются как запасные.

EurekaLog, во-первых, использует JclDebug для получений той же информации:
 - TELDebugInfoMap - получает информацию из map-файла с тем же именем, что и exe-файл.
 - TELDebugInfoJedy - получает информацию из встроенной в exe секции JCLDEBUG или jdbg-файла с тем же именем, что и exe-файл.
 - TELDebugInfoTD32 - получает информацию из встроенной в exe секции TD32.
Плюс добавляет свою информацию - реализация полностью аналогична TJclDebugInfoBinary/TELDebugInfoJedy, только формат не JDBG, а EurekaLog (отдельного класса нет, получение информации лежит леликом внутри GetSourceInfoByAddr). Этот вариант является для неё основным, а остальные используются как запасные.

Т.е. как я и говорил - сама идея проста до безобразия (искать строчки в текстовом файле), но чтобы её реализовать самому.... попотеть придётся.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Avers
  Дата 13.11.2008, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 20.6.2008
Где: 26rus

Репутация: нет
Всего: нет



Спасибо) большое)
Вот. теперь все ясно и понятно...  
Как говориться, дело ясное, что дело темное  smile  Попотеть уж точно придется))
Теперь ударюсь в способы работы с exe файлами)) надо подумать, как дополнить его нужной инфой, но при этом не попортить))

Добавлено через 2 минуты и 17 секунд
Жаль у меня постов мало, а то бы обязательно плюсик поставил, поэому ограничусь человеческим спасибо.
А за столь подробную информацию и нескольких +ов не жаль))) 
--------------------
Born to be wild
PM MAIL   Вверх
CodeMonkey
Дата 13.11.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(Avers @  13.11.2008,  10:11 Найти цитируемый пост)
как дополнить его нужной инфой, но при этом не попортить

Проще всего (и обычно так все и поступают) - добавить в exe файл пользовательский тип ресурса (RCData) с уникальным именем.
Если я не ошибаюсь, то JCL добавляет секцию с именем JCLDEBUG, а EurekaLog - с ELDATA.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
CodeMonkey
Дата 13.11.2008, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



P.S.
Цитата(Avers @  11.11.2008,  11:08 Найти цитируемый пост)
Смотрю как работает эврика лог - загляденье

Кстати, в текущей версии EL есть как минимум три серьёзные проблемы (Fabio пообещался исправить в следующей версии):
1. Используется RAW-метод трассировки. Это значит, что стек вызовов может содержать ложные элементы. По-хорошему нужна возможность использовать frame-based трассировку (на выбор, разумеется).
2. В стеке вызовов не показывается запись, если для неё нет отладочной информации. Видимо, подразумевалось, что это сгладит пункт 1. В реальности это сделало некоторые логи очень тяжело читаемыми. По-хорошему нужно показывать просто адрес без доп. информации.
3. Из map-файлов не забираются записи из модулей, для которых нет отладочной информации (в этом случае в map файле нет информации о строках, но по-крайней мере там есть список функций - вот его бы нужно брать, как это делает JCL). Например, для стандартных модулей (SysUtils и т.п.), если отключена опция "Use Debug DCUs". Это приводит проблемам в совокупности с пунктом 2. 

Лично для себя я вписываю в EL трассировку из JCL и модифицирую парсер. Ну пока это не поправят.

Это сообщение отредактировал(а) CodeMonkey - 13.11.2008, 17:01


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0720 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.