Sign in Join
Wiki copytemporary

FpDebug/ru: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11# О пакете
22
33FpDebug - это [[Debugger|отладчик]], написанный языке [[Pascal|Паскаль]] для использования в Pascal.
44
55Подробнее:
66
77- FpDebug написан на Паскале
88- FpDebug использует формат отладочной информации [[DWARF]]
99 - Текущая реализация является подмножеством DWARF с поддержкой DWARF версий 2 и 3. Однако «подмножество» - это просто состояние реализации. Цель состоит в том, чтобы расширить его, дабы реализовать как можно больше стандартных возможностей.
1010 - Текущая реализация охватывает подмножество, которое используется FPC
1111 - FpDebug имеет специальные реализации для работы с конкретным использованием DWARF для FPC (ошибки, отсутствующая информация, подробности реализации)
1212
1313## Что подразумевается под «FpDebug»
1414
1515FpDebug может ссылаться на
1616
1717### Пакет "FpDebug"
1818
1919Это движок отладчика. Это не относится к [[IDE]]. Пакет используется несколькими бэкэндами IDE:
2020
2121- Отладчик LLDB (с fpdebug): этот отладчик использует LLDB в качестве бэкэнда. Чтобы отображать результаты в стиле Паскаля, он использует движок «fpdebug» для отображения locals/watches.
2222- [[GDB|Отладчик GNU]] (с fpdebug): для пошаговой отладки(stepping)/точек останова(breakpoints)/... используется GDB, а FpDebug - для списка слежения (watches).
2323- Внутренний отладчик Dwarf FpDebug: "чистый" FpDebug. Пошаговая отладка(Stepping), Запуск(Running), Точки останова(Breakpoint), Список слежения (Watches), Локальные переменные (Locals), Стэк (Stack)....
2424
2525### FpDebug как ссылка на серверную часть IDE [[LazDebuggerFp]]
2626
2727Фактическое имя серверной части IDE - [[LazDebuggerFp]]. Это имя пакета, который необходимо установить для использования отладчика. Однако, как видно выше, ни в каком техническом контексте (например, в заголовках в среде IDE) это не упоминается как «FpDebug ...»
2828
2929### Другие проекты FpDebug
3030
3131Имя используется для другого проекта с той же целью.
3232
3333- <https://github.com/graemeg/fpdebug>
3434- <http://sourceforge.net/projects/duby/>
3535
3636## Установка в IDE
3737
3838Установите пакет LazDebuggerFp
3939
4040# Общие проблемы отладки
4141
4242Эти проблемы не могут быть исправлены одним отладчиком. Им тоже нужны изменения в FPC. На некоторых может также повлиять отсутствие поддержки в DWARF.
4343
4444Эти проблемы относятся ко всем серверным модулям отладчика.
4545
4646## Свойства
4747
4848Свойства - одна из наиболее востребованных функций (любого) отладчика(ов). Вот почему они еще не могут быть проверены, и почему до этого пройдет еще немало времени.
4949
50-Прежде, чем вдаваться в подробности: для «<u>Свойства без getter-функции»</u> (т.е. «<u>с прямым доступом к полю</u>») FPC (как средство решения проблемы) в настоящее время добавляет запись для переменной с именем свойства. Это означает, что такие свойства могут отображаться. Они также могут быть записаны отладчиком (если отладчик поддерживает изменение данных), и если они записаны, это делается в обход любой процедуры Setter, поскольку отладчик не знает, есть ли даже сеттер.
50+Прежде, чем вдаваться в подробности: для «Свойства без getter-функции» (т.е. «с прямым доступом к полю») FPC (как средство решения проблемы) в настоящее время добавляет запись для переменной с именем свойства. Это означает, что такие свойства могут отображаться. Они также могут быть записаны отладчиком (если отладчик поддерживает изменение данных), и если они записаны, это делается в обход любой процедуры Setter, поскольку отладчик не знает, есть ли даже сеттер.
5151
5252Есть несколько недостающих частей, позволяющих отладчику показывать (и, возможно, изменять) свойства.
5353
5454- Отладчику нужна поддержка для вызова функций.
5555- FPC нужен способ добавить информацию о «свойствах» к отладочной информации.
5656
5757Что касается вызова функции. Это просто может отсутствовать реализация в отладчике. Это еще не было исследовано более глубоко. Может потребоваться или не потребоваться дополнительная информация в DWARF, созданном FPC.
5858
5959Что касается добавления «свойств» к отладочной информации: DWARF (по крайней мере версии 2 и 3 / не проверено 4 или 5) фактически не имеет возможности кодировать эту информацию. Следовательно, FPC в настоящее время также не добавляет его.
6060
6161В случае, если DWARF не добавит это вовремя, DWARF позволит использовать данные от производителя (afaik). До сих пор ни один отладчик не знал бы о каких-либо «частных данных fpc», поэтому в этом не было никакого смысла. В будущем такие данные могут быть согласованы между FPC и FpDebug. Но до этого еще далеко. FpDebug еще даже не выполняет вызов функций.
6262
6363## Strings (vs PChar и Array of Char)
6464
6565Первоначально в DWARF не было концепции кодирования строк. Это было добавлено в DWARF 4 (требуется проверка), но еще не исследовано на предмет удобства использования с FPC. Также в FPC в настоящее время реализованы только DWARF 2 и 3 (с первыми шагами к версии 4).
6666
6767Остается только 2 способа кодирования строки в DWARF.
6868
6969- Как указатель на char
7070- Как массив char
7171
7272Какой из них используется, зависит от версии FPC и от того, используется ли DWARF 2 или 3.
7373
7474Если это «указатель на char», то это делает его неотличимым от реального PChar. По этой причине все отладчики в Lazarus иногда для таких отслеживаемых выражений, как `SomeString[4]`, показывают результат «PChar: 'a'; String: 'b'». Поскольку PChar начинается с нуля, а строка - с единицы, индекс «4» может означать 4-й или 5-й символ.
7575
7676Недавние FPC используют «массив символов», когда они генерируются DWARF 3. В том, что у них (в настоящее время) есть различия в деталях реализации между тем, как они кодируют строки и реальный массив символов. (Например, пропуск необязательного/избыточного бита информации. В данном случае: DW_AT_byte_stride). Эти детали не имеют смысла с точки зрения любого другого отладчика, но FpDebug может их обнаружить, поскольку знает об этих деталях реализации. Конечно, это очень ненадежно, следующая версия FPC всегда может это изменить.
7777
7878Аналогичным образом FPC обрабатывает ShortStrings внутри как запись и кодирует их как есть. Опять же, различие заключается в деталях реализации.
7979
8080## Изменение управляемых типов
8181
8282Это применимо к любому отладчику, который может устанавливать новые значения для списка слежения (изменяет переменную в отлаживаемом exe).
8383
8484Управляемые типы не могут быть изменены корректно.
8585
8686Для изменения управляемых типов отладчику необходимо знать:
8787
8888- счетчик ссылок
8989- копирование при записи
9090- как выделить/освободить память / или лучше как вызвать методы inc/dec_ref для каждого типа, чтобы они выполняли работу правильно
9191
9292Ничего из этого не доступно.
9393
9494Если вы присваиваете новое значение строке или динамическому массиву, то необходимо скорректировать счетчик ссылок старого и нового значения. При необходимости память должна быть выделена или освобождена. Если это сделать неправильно, это, по крайней мере, вызовет утечку памяти. Но это также может вызвать сбои или другие случайные ошибки, когда отлаженный exe продолжает работу.
9595
9696В массиве можно изменить один элемент. "SomeArray\[5\] := 7;". Если на массив ссылаются несколько переменных, это повлияет на их всех. То же самое произойдет, если вы выполните этот оператор в своем приложении.
9797
9898У строки (AnsiString) использует механизм копирование при записи (copy-on-write). Если вы сделаете "SomeString\[4\] := 'a'", тогда переменная, из которой вы получили доступ к строке, получит новую копию, и другие переменные (которые совместно используют память) не должны быть затронуты. У отладчика этой информации нет. Также у него нет доступа к счетчику ссылок и распределению/освобождению памяти (или внутренним строковым процессам).
9999
100100## Вызов функции с управляемыми типами в качестве параметра или результата
101101
102102Предполагая, что вызов функции был реализован в целом ....
103103
104104По той же причине, что и в «Модификации управляемых типов», отладчик не может создавать строки или массивы для вызова функций, которые ожидают их как параметр.
105105
106106Значения результатов можно принять, но это вызовет утечку памяти.
107107
108108## Область действия / порядок поиска переменных
109109
110110Существуют различные проблемы, при которых FPC не помещает достаточно информации в информацию DWARF, чтобы отладчик мог вычислить правильную область для всех переменных. В тех же случаях это может быть связано с тем, что DWARF не предлагает этого или не предлагает его в то время, когда он был реализован или последний раз обновлялся в FPC. Некоторые из них можно исправить, если FPC изменит способ кодирования информации.
111111
112112### Вложенные процедуры
113113
114114``` pascal
115115var SomeVar: Integer; // глобальная переменная
116116
117117procedure Outer(NumText: string);
118118var
119119 SomeVar: Integer; // локальная переменная, объявленная выше "Nested"
120120
121121 procedure Nested;
122122 var
123123 I: Integer;
124124 begin
125125 WriteLn(OuterVarInScope);
126126 end;
127127
128128//var
129129// SomeVar: Integer; // локальная переменная, объявленная ниже "Nested"
130130begin
131131 Nested;
132132end;
133133```
134134
135135Локальная переменная `SomeVar` скрывает глобальную переменную с таким же именем, если вы находитесь в процедуре «Outer». Локальная переменная также видна (и скрывает глобальную), если вы находитесь в процедуре «Nested».
136136
137137Но если вы закомментируете локальную переменную, "объявленную выше Nested", и раскомментируете локальную переменную, "объявленную ниже Nested", то локальная переменная больше не будет в области видимости "Nested". «Nested» теперь будет видеть глобальную переменную. («Outer» по-прежнему видит локальные переменные).
138138
139139Информация DWARF в настоящее время только сообщает отладчику, что `SomeVar` объявлена как локальная переменная в параметре "Outer". И это «Nested» находится внутри «Outer». Но информация DWARF не включается, если `SomeVar` объявлен выше или ниже "Nested". Так что отладчик не заметит разницы. В обоих случаях отладчик будет отображать локальную переменную `SomeVar`, если она приостановлена ​​в "Nested".
140140
141141### Глобальные перменные из других модулей
142142
143143Информация DWARF содержит раздел для каждого модуля. Все символы модуля перечислены в правильном разделе. Однако нет информации о том, какой модуль входит в секцию "uses" какого другого модуля. И, очевидно, даже меньше, в каком порядке они используются.
144144
145145Если существует несколько глобальных переменных с одинаковым именем, по одной в каждом из нескольких модулей, то FPC использует порядок разделов uses (справа налево), чтобы найти переменную, которая будет видна из кода в текущем модуле.
146146
147147Если в модуле `FooBar` есть код, который обращается к переменной с именем `NotInFooBar` (которая не объявлена ​​в модуле `FooBar`), то эта переменная должна быть из одного из других модулей. Если есть несколько переменных с именем `NotInFooBar` в разных модулях, то отладчик не имеет информации, какой из них именно использовал FPC. В настоящее время отладчик показывает первое найденное. (Что вроде случайно)
148148
149149# Проблемы FPC
150150
151151Это влияет на все отладчики
152152
153153- resourcestring
154154
155155В настоящее время не реализовано <https://bugs.freepascal.org/view.php?id=35571>
156156
157157- const Foo = unicodestring('abc')
158158
159159Информация об отладке не реализована <https://bugs.freepascal.org/view.php?id=35569>
160160
161161- type Foo = object (Dwarf 3) - Исправлено в 3.3.3
162162
163163Неправильно закодирован как экземпляр класса <https://bugs.freepascal.org/view.php?id=36017>\
164164Отладчик не может отобразить данные.
165165
166166- Динамический массив при кросс-компиляции
167167
168168<https://bugs.freepascal.org/view.php?id=35567>\
169169Отладчик может неправильно вычислить длину.
170170
171171- Неправильный шаг для битового массива - исправлено в 3.3.3
172172
173173<https://bugs.freepascal.org/view.php?id=36144>\
174174В настоящее время у FpDebug есть обходной путь
175175
176176# Положение дел
177177
178178FpDebug поддерживает Linux, Windows и MacO.
179179
180180Любые функции, касающиеся управления выполнением (пошаговое выполнение/приостановка ...), тестируются только для Linux и Windows. Поддержка этого на Mac неполная/ненадежная.
181181
182182> **Note:** Для Windows/Linux см. **[[Debugger Status]]**
183183
184184Поддержка Mac в настоящее время считается «альфа-версией» Оценка данных может использоваться на Mac через серверную часть LLDB + FpDebug
185185
186186Информация носит ориентировочный характер и может обновляться / подлежит дальнейшему тестированию.
187187
188188## Примечания
189189
190190### Пошаговый вывод
191191
192192«Пошаговый вывод» основан на поиске адреса вызова. Расположение которого зависит от того, есть ли у функции «стековый фрейм» (использует регистр BasePointer и (прим. перев.: представляет из себя структуры в стеке процессора)) и имеет ли уже/все еще настроенный фрейм. Обнаружение этого ограничено несколькими стандартными ситуациями. (Особенно это невозможно обнаружить в коде FPC или в оптимизированном коде).
193193
194194Эта функция работает в неоптимизированном коде FPC.
195195
196196### Аппаратные точки наблюдения (также известные как точки останова по данным)
197197
198198Частично реализовано для большинства типов данных (подмножество типов, поддерживаемых оборудованием), включая условия и другие свойства.
199199
200200Все точки наблюдения будут иметь глобальную область действия. Наблюдение за локальной переменной будет предупреждать вас в следующий раз, когда память переменной будет перезаписана (например, если другая переменная займет память).
201201
202202Точки наблюдения "только запись" действуют как "чтение/запись"
203203
204204Точки наблюдения также срабатывают, если они перезаписываются имеющимся у них значением.
205205
206206Точки наблюдения не показывают диалоговое окно до/после.
207207
208208Точки наблюдения, которые не выровнены по адресу, кратному их размеру, могут запускаться соседними значениями. Например, Word, начинающееся с нечетного адреса, может запускаться байтом до или после него. 64-битный указатель должен быть выровнен по 8-байтовой границе или может запускаться соседями.
209209
210210### Поток и стэк
211211
212212См. «Пошаговый вывод». Полагается на то же обнаружение кадров.
213213
214214### Окно наблюдений / Локальные переменные / Осмотр
215215
216216Реализовано
217217
218218- Любые отсутствующие типы должны быть обнаружены (т.е. неизвестны какие-либо типы, которые не отображаются, если они не указаны в разделе «Проблемы fpc»
219219- типы валют могут не отображать десятичную точку (они будут отображать значение * 1000)
220220- Реализованы не все настройки из свойств окна наблюдений (большинство из них)
221221- Выражения:
222222 - Отладчик принимает выражения, которые он будет вычислять. Не все операторы Паскаля реализованы.
223223 - Выражения рассчитываются без проверки диапазона
224224 - простые выражения (просто идентификатор)
225225 - Включает идентификатор значения 'self' (если в методе) и константы nil, true, false.
226226 - приведение типов
227227 - @ и ^ (address of и deref)
228228 - "^TFoo(x)"' приведение типа x как указатель на TFoo
229229 - () выражение в квадратных скобках "a*(b+c)"
230230 - \[\] индекс для массивов, указателей и pchar
231231 - Доступ участников к Foo.Bar
232232 - постоянные числа в десятичном, шестнадцатеричном формате (\$), oct (u0026), bin (%)
233233 - постоянная строка (ansistring)
234234 - \+ - * / для int и float
235235 - мод для int
236236 - \+ для строки
237237 - +- для указателя + int
238238 - div для int
239239 - = \<\> \< \> \<= \>= для int, float, string
240240 - not and or xor: для int и boolean
241241
242242### Изменение переменных (не реализовано)
243243
244244Не сделано
245245
246246### Консольный вывод
247247
248248В Windows консоль открывается ОС. В Linux вывод поступает в окно отладчика «Консольный вывод».
249249
250250### Кросс-битовая отладка (32/64 бит)
251251
252252FpDebug не имеет кросс отладки между разными платформами.
253253
254254Однако, если ваша IDE имеет другую разрядность, ваш проект FpDebug может ее отладить.
255255
256256#### Windows
257257
258258A 64-битная IDE
259259может отлаживать как 64-битные, так и 32-битные приложения
260260
261261A 32-битная IDE
262262может отлаживать только 32-битные приложения
263263
264264#### Linux
265265
266266Перекрестная отладка еще не тестировалась, но, вероятно, возможна.
267267
268268# Еще не реализовано
269269
270270- Изменение окна отладки
271271- Изменение места выполнения (во время паузы) / возобновление выполнения с другой строки
272272- Свойства
273273- Вызов функций
274274- ...
275275
276276---
277277*From the Free Pascal wiki, page "FpDebug/ru", as it stood on 2021-08-17 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history