Difference between revisions of "GDB Debugger Tips/ru"

From Lazarus wiki
Jump to navigationJump to search
m (OSX -> macOS)
 
(18 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{MenuTranslate|page=GDB Debugger Tips}}
+
{{Lazarus Documentation}}
  
  
Line 107: Line 107:
 
В настоящее время отладчик не поддерживает выполнение каких-либо методов. Поэтому могут быть проверены только те свойства, которые относятся непосредственно к переменной. (Это работает только при использовании dwarf).
 
В настоящее время отладчик не поддерживает выполнение каких-либо методов. Поэтому могут быть проверены только те свойства, которые относятся непосредственно к переменной. (Это работает только при использовании dwarf).
  
<syntaxhighlight>TFoo = Class
+
<syntaxhighlight lang="pascal">
 +
TFoo = Class
 
private
 
private
 
   FBar: Integer;
 
   FBar: Integer;
Line 121: Line 122:
 
=== Вложенные процедуры / функции ===
 
=== Вложенные процедуры / функции ===
 
</td><td>
 
</td><td>
<syntaxhighlight>procedure SomeObject.Outer(NumText: string);
+
<syntaxhighlight lang="pascal">
 +
procedure SomeObject.Outer(NumText: string);
 
var  
 
var  
 
   OuterVarInScope: Integer;
 
   OuterVarInScope: Integer;
Line 160: Line 162:
 
</td><td>
 
</td><td>
  
<syntaxhighlight>array [x..y] of Integer;</syntaxhighlight>
+
<syntaxhighlight lang="pascal">array [x..y] of Integer;</syntaxhighlight>
 
показывает как символы, а не int. Только GDB 7.2 или выше, кажется, справиться с этим правильно.
 
показывает как символы, а не int. Только GDB 7.2 или выше, кажется, справиться с этим правильно.
  
Line 174: Line 176:
 
== Указание GDB вида сборки ==
 
== Указание GDB вида сборки ==
 
GDB позволяет указать вид сборки (стиль Intel или AT&T), который будет использоваться при отображении кода сборки. Если кто-то хочет перейти на конкретный вариант, это можно изменить в свойстве AssemblerStyle в параметрах отладчика Lazarus для GDB (функция доступна в Lazarus 2.0). Альтернативно (и единственный способ добиться этого внутри Lazarus в более старых версиях до Lazarus 2.0) можно указать эту опцию, передав команду ''set disassembly-flavor'' в [[Media:Dbg_setup_options2.png|Debugger_Startup_options]]. Можно использовать несколько вариантов синтаксиса (в зависимости от версии GDB), некоторые из которых показаны ниже:
 
GDB позволяет указать вид сборки (стиль Intel или AT&T), который будет использоваться при отображении кода сборки. Если кто-то хочет перейти на конкретный вариант, это можно изменить в свойстве AssemblerStyle в параметрах отладчика Lazarus для GDB (функция доступна в Lazarus 2.0). Альтернативно (и единственный способ добиться этого внутри Lazarus в более старых версиях до Lazarus 2.0) можно указать эту опцию, передав команду ''set disassembly-flavor'' в [[Media:Dbg_setup_options2.png|Debugger_Startup_options]]. Можно использовать несколько вариантов синтаксиса (в зависимости от версии GDB), некоторые из которых показаны ниже:
<syntaxhighlight lang=gdb>-ex "set disassembly-flavor intel"
+
 
--eval-command="set disassembly-flavor intel"
+
  -ex "set disassembly-flavor intel"
-eval-command="set disassembly-flavor intel"
+
  --eval-command="set disassembly-flavor intel"
--eval-command "set disassembly-flavor intel"</syntaxhighlight>
+
  -eval-command="set disassembly-flavor intel"
 +
  --eval-command "set disassembly-flavor intel"
  
 
Обратите внимание, что может потребоваться сбросить отладчик ''(Run | Reset Debugger)'' перед загрузкой GDB с новой настройкой.
 
Обратите внимание, что может потребоваться сбросить отладчик ''(Run | Reset Debugger)'' перед загрузкой GDB с новой настройкой.
Line 224: Line 227:
 
* Если ваша программа блокируется при запуске, перейдите в Tools(Сервис) / Options(Настройки) / Debugger(Отладчик) / General(Общее) и установите <tt>DisableLoadSymbolsForLibraries=True</tt>
 
* Если ваша программа блокируется при запуске, перейдите в Tools(Сервис) / Options(Настройки) / Debugger(Отладчик) / General(Общее) и установите <tt>DisableLoadSymbolsForLibraries=True</tt>
  
= Mac OS X =
+
= macOS =
  
Под OS X вы обычно устанавливаете GDB с инструментами разработчика Apple. Версия GDB, доступная на момент написания, - 6.3.50.
+
Под macOS вы обычно устанавливаете GDB с инструментами разработчика Apple. Версия GDB, доступная на момент написания, - 6.3.50.
  
Этот раздел - первый подход к сбору информации об известных проблемах и обходных путях. Информация, представленная здесь, во многом зависит от отзывов пользователей OS X.
+
Этот раздел - первый подход к сбору информации об известных проблемах и обходных путях. Информация, представленная здесь, во многом зависит от отзывов пользователей macOS.
  
 
Начиная с Lazarus 2.0, в среде IDE имеется отладчик на основе LLDB. Отладчик на основе GDB также может использоваться, но требует много работы по сборке и подписи кода GDB.
 
Начиная с Lazarus 2.0, в среде IDE имеется отладчик на основе LLDB. Отладчик на основе GDB также может использоваться, но требует много работы по сборке и подписи кода GDB.
Line 264: Line 267:
 
Альтернативное решение, похоже, заключается в использовании более новой версии GDB (см. ниже).
 
Альтернативное решение, похоже, заключается в использовании более новой версии GDB (см. ниже).
  
===Hardware exceptions under Mac OS X===
+
===Hardware exceptions under macOS===
  
When a hardware exception occurs under Mac OS X, such as an invalid pointer access (SIGSEGV) or an integer division-by-zero on Intel processors, the debugger will catch this exception at the Mach level. Normally, the system translates these Mach exceptions into Unix-style signals where the FPC run time library handles them. The debugger is however unable to propagate Mach exceptions in this way.
+
When a hardware exception occurs under macOS, such as an invalid pointer access (SIGSEGV) or an integer division-by-zero on Intel processors, the debugger will catch this exception at the Mach level. Normally, the system translates these Mach exceptions into Unix-style signals where the FPC run time library handles them. The debugger is however unable to propagate Mach exceptions in this way.
  
The practical upshot is that it is impossible under Mac OS X to continue a program in the debugger once a hardware exception has been triggered. This is not FPC-specific, and cannot be fixed by us.
+
The practical upshot is that it is impossible under macOS to continue a program in the debugger once a hardware exception has been triggered. This is not FPC-specific, and cannot be fixed by us.
  
 
== Использование альтернативных отладчиков (GDB) ==
 
== Использование альтернативных отладчиков (GDB) ==
Line 287: Line 290:
 
;Lazarus версии от 1.0 до 1.0.12:  
 
;Lazarus версии от 1.0 до 1.0.12:  
 
В настройках отладчика сконфигурируйте  
 
В настройках отладчика сконфигурируйте  
<syntaxhighlight lang="">EncodeCurrentDirPath = gdfeNone
+
 
EncodeExeFilename = gdfeNone</syntaxhighlight>
+
  EncodeCurrentDirPath = gdfeNone
 +
  EncodeExeFilename = gdfeNone
 +
 
 
И вы должны использовать <u>"run param"</u>, чтобы указать фактический исполняемый файл внутри пакета приложения (project.app/Content/MacOS/project или аналогичный)
 
И вы должны использовать <u>"run param"</u>, чтобы указать фактический исполняемый файл внутри пакета приложения (project.app/Content/MacOS/project или аналогичный)
  
Line 295: Line 300:
 
== Xcode 5 ==
 
== Xcode 5 ==
  
Начиная с OS X Mavericks 10.9, Xcode 5 больше не устанавливает GDB по умолчанию и не [делает его] глобальным.
+
Начиная с Mavericks 10.9, Xcode 5 больше не устанавливает GDB по умолчанию и не [делает его] глобальным.
  
 
* Для 10.9 вы можете установить старый Xcode 4 параллельно. Это не поддерживается Apple, поэтому он может порвать с одной из следующих версий.
 
* Для 10.9 вы можете установить старый Xcode 4 параллельно. Это не поддерживается Apple, поэтому он может порвать с одной из следующих версий.
Line 306: Line 311:
 
* http://forum.lazarus.freepascal.org/index.php/topic,22328.0.html - установка gdb
 
* http://forum.lazarus.freepascal.org/index.php/topic,22328.0.html - установка gdb
  
Тема "[Lazarus] Help: Проблемы OS X" на
+
Тема "[Lazarus] Help: Проблемы macOS" на
 
* http://lists.lazarus.freepascal.org/pipermail/lazarus/2013-November/thread.html#84126
 
* http://lists.lazarus.freepascal.org/pipermail/lazarus/2013-November/thread.html#84126
 
* http://lists.lazarus.freepascal.org/pipermail/lazarus/2013-October/thread.html#84095
 
* http://lists.lazarus.freepascal.org/pipermail/lazarus/2013-October/thread.html#84095
Line 316: Line 321:
 
==Ссылки==
 
==Ссылки==
  
*Mac OS X поставляется с множеством полезных инструментов для отладки и профилирования. Просто запустите /Developer/Applications/Instruments.app и попробуйте их.
+
*macOS поставляется с множеством полезных инструментов для отладки и профилирования. Просто запустите /Developer/Applications/Instruments.app и попробуйте их.
  
 
= FreeBSD =
 
= FreeBSD =
Line 410: Line 415:
  
 
Обходной путь: попробуйте изменить маску с помощью [http://www.freepascal.org/docs-html/rtl/math/setexceptionmask.html SetExceptionMask] как можно раньше в вашей программе:
 
Обходной путь: попробуйте изменить маску с помощью [http://www.freepascal.org/docs-html/rtl/math/setexceptionmask.html SetExceptionMask] как можно раньше в вашей программе:
<syntaxhighlight>
+
<syntaxhighlight lang="pascal">
 
uses  math;
 
uses  math;
 
...
 
...
Line 462: Line 467:
 
   <td colspan="3">
 
   <td colspan="3">
  
== SigSegV - and continue debugging ==
+
== SigSegV - и продолжить отладку ==
 
   </td>
 
   </td>
 
   <td>&nbsp;</td>
 
   <td>&nbsp;</td>
Line 469: Line 474:
 
   <td>'''Windows''', '''Mac'''</td>
 
   <td>'''Windows''', '''Mac'''</td>
 
   <td  colspan="2">
 
   <td  colspan="2">
http://sourceware.org/bugzilla/show_bug.cgi?id=10004
+
[http://sourceware.org/bugzilla/show_bug.cgi?id=10004 Bug 10004 - gdb cannot continue after SIGFPE or SIGSEGV happen on windows]
  
http://forum.lazarus.freepascal.org/index.php/topic,18121.msg101798.html#msg101798
+
[http://forum.lazarus.freepascal.org/index.php/topic,18121.msg101798.html#msg101798 Workaround for SIGFPE bug in GDB for Windows?]
 
</td></tr>
 
</td></tr>
  
Line 478: Line 483:
 
<tr valign="top">
 
<tr valign="top">
 
   <td colspan="3">
 
   <td colspan="3">
== On Windows Open/Save/File or System Dialog cause gdb to crash ==
 
  
See next entry "gdb.exe has stopped working"
+
== На Windows Open/Save/File или System Dialog вызывает сбой GDB ==
  
Or download the "alternative GDB" 7.7.1 (Win32) from the Lazarus SourceForge site.
+
См. следующую запись [[GDB_Debugger_Tips/ru#.D0.9F.D0.B5.D1.80.D0.B5.D1.81.D1.82.D0.B0.D0.BB_.D1.80.D0.B0.D0.B1.D0.BE.D1.82.D0.B0.D1.82.D1.8C_gdb.exe|перестал работать gdb.exe]]
  
 +
Или загрузите "alternative GDB"(альтернативный GDB) 7.7.1 (Win32) с сайта Lazarus SourceForge.
  
== "Step over" steps into function (Win 64) ==
+
== "Step over" шаги внутри функции (Win 64) ==
 
   </td>
 
   </td>
 
   <td>&nbsp;</td>
 
   <td>&nbsp;</td>
Line 493: Line 498:
 
   <td  colspan="2">
 
   <td  colspan="2">
  
Sometimes pressing F8 does not step over a function, but steps into it.
+
Иногда нажатие клавиши F8 не переходит [мимо] функции, а входит в нее.
  
It is possible to continue with F8, and sometimes GDB will step back into the calling function, after 1 or 2 further steps (stepping over the remainder of the function).
+
Можно продолжить с F8, и иногда GDB возвращается в вызывающую функцию после 1-го или 2-ого дальнейших шагов (переступая через оставшуюся часть функции).
  
In Lazarus 2.0 a workaround was added, but needs to be enabled. Go to Tools > Options > Debugger and enable (in the property grid) "FixIncorrectStepOver".  
+
В Lazarus 2.0 обходной путь был добавлен, но его необходимо включить. Перейдите в Tools(Сервис) > Options(Настройки) > Debugger(Отладчик) и включите (в сетке свойств) «FixIncorrectStepOver».  
  
 
<tr valign="top">
 
<tr valign="top">
Line 510: Line 515:
 
   <td  colspan="2">
 
   <td  colspan="2">
  
GDB itself has crashed. This will be due to a bug in gdb, and may not be fixable in Lazarus. Still it may be worth submitting info (see section "Reporting Bugs" below). Maybe Lazarus can avoid calling the failing function.
+
Поврежден сам GDB. Это будет связано с ошибкой в GDB и может быть невозможно исправить в Lazarus. Тем не менее, возможно, стоит отправить информацию (см. Раздел «Сообщения об ошибках» ниже). Возможно, Лазарус может избежать вызова неисправной функции.
  
There is one already known situation. GDB (6.6 to 7.4 (latest at the time of testing)) may crash while your app is being started, or right after your app stopped. This happen while the libraries (DLL) for your app are loaded (watch the "[[IDE_Window:_Debug_Output|Debug output]]" window).  
+
Есть одна уже известная ситуация. GDB (от 6,6 до 7,4 (последний на момент тестирования)) может аварийно завершить работу во время запуска вашего приложения или сразу после его остановки. Это происходит во время загрузки библиотек (DLL) для вашего приложения (смотрите окно «[[IDE_Window:_Debug_Output/ru|Debug output]]»).
;Lazarus 1.2.2 and before: go to the debugger options and in the field "debugger_startup_options" enter:<br>      --eval-command="set auto-solib-add off"  
+
;Lazarus 1.2.2 и более ранние версии: перейдите к параметрам отладчика и в поле «debugger_startup_options» введите:<br>      --eval-command="set auto-solib-add off"  
;Lazarus 1.2.4 and higher: go to the debugger options and set the field "DisableLoadSymbolsForLibraries" to "True"
+
;Lazarus 1.2.4 и выше: перейдите к параметрам отладчика и установите для поля «DisableLoadSymbolsForLibraries» значение «True».
This can only be used, if you do not debug within libraries (if you have not written your own lib)  
+
Это можно использовать, только если вы не отлаживаете в библиотеках (если вы не написали свою собственную библиотеку)
 
[[File:gdb start opt nolib.png]]
 
[[File:gdb start opt nolib.png]]
 
</td></tr>
 
</td></tr>
Line 529: Line 534:
 
</tr><tr valign="top">
 
</tr><tr valign="top">
 
   <td>&nbsp;</td>
 
   <td>&nbsp;</td>
   <td>'''Windows, maybe other'''</td>
+
   <td>'''Windows, может быть другая ОС'''</td>
 
   <td  colspan="2">
 
   <td  colspan="2">
  
At the end of the debug session, the debugger reports:
+
В конце сеанса отладки отладчик сообщает:
 
  internal-error: clear_dangling_display_expressions:  
 
  internal-error: clear_dangling_display_expressions:  
 
  Assertion `objfile->pspace == solib->pspace' failed.
 
  Assertion `objfile->pspace == solib->pspace' failed.
  
This is an error in gdb, and sometimes solved by
+
Это ошибка в GDB, и иногда решается так:
;Lazarus 1.2.2 and before: go to the debugger options and in the field "debugger_startup_options" enter:<br>      --eval-command="set auto-solib-add off"  
+
;Lazarus 1.2.2 и более ранние версии: перейдите к параметрам отладчика и в поле "debugger_startup_options" введите:
;Lazarus 1.2.4 and higher: go to the debugger options and set the field "DisableLoadSymbolsForLibraries" to "True"
+
--eval-command="set auto-solib-add off"  
This can only be used, if you do not debug within libraries (if you have not written your own lib)  
+
;Lazarus 1.2.4 и выше: перейдите к параметрам отладчика и установите для поля "DisableLoadSymbolsForLibraries" значение "True"
 +
Это можно использовать, только если вы не отлаживаете библиотеку (если вы не пишете свою собственную библиотеку)  
 
</td></tr>
 
</td></tr>
  
Line 554: Line 560:
 
   <td>'''Windows'''</td>
 
   <td>'''Windows'''</td>
 
   <td  colspan="2">
 
   <td  colspan="2">
GDB may fail with this message. This is due to [http://sourceware.org/bugzilla/show_bug.cgi?id=14018 http://sourceware.org/bugzilla/show_bug.cgi?id=14018]
+
GDB может упасть с этим сообщением. Это связано с [http://sourceware.org/bugzilla/show_bug.cgi?id=14018 Bug 14018].
If you get this issue you may want to downgrade to GDB 7.2
+
Если вы получаете эту проблему, вы можете при желании перейти с GDB 7.4 на GDB 7.2
 
</td></tr>
 
</td></tr>
  
Line 562: Line 568:
 
<tr valign="top">
 
<tr valign="top">
 
   <td colspan="3">
 
   <td colspan="3">
== Can not insert breakpoint ==
+
 
 +
== Can not insert breakpoint (Не могу вставить точку останова) ==
 
   </td>
 
   </td>
 
   <td>&nbsp;</td>
 
   <td>&nbsp;</td>
 
</tr><tr valign="top">
 
</tr><tr valign="top">
 
   <td>&nbsp;</td>
 
   <td>&nbsp;</td>
   <td>'''All'''</td>
+
   <td>'''Все'''</td>
 
   <td  colspan="2">
 
   <td  colspan="2">
<b>For breakpoints with negative numbers</b>
+
<b>Для точек останова с отрицательными числами:</b>
Please see: http://forum.lazarus.freepascal.org/index.php/topic,10317.msg121818.html#msg121818
+
См. сюда, плз: [http://forum.lazarus.freepascal.org/index.php/topic,10317.msg121818.html#msg121818 How to reset gdb settings]
  
You may also want to try:
+
Вы также можете попробовать:
;Lazarus 1.2.2 and before: go to the debugger options and in the field "debugger_startup_options" enter:<br>      --eval-command="set auto-solib-add off"  
+
;Lazarus 1.2.2 и более ранние версии: перейдите к параметрам отладчика и в поле «debugger_startup_options» введите:<br>      --eval-command="set auto-solib-add off"  
;Lazarus 1.2.4 and higher: go to the debugger options and set the field "DisableLoadSymbolsForLibraries" to "True"
+
;Lazarus 1.2.4 и выше: перейдите к параметрам отладчика и установите для поля «DisableLoadSymbolsForLibraries» значение «True».
This can only be used, if you do not debug within libraries (if you have not written your own lib)  
+
Это можно использовать, только если вы не отлаживаете библиотеку (если вы не пишете свою собственную библиотеку)
  
<b>For breakpoints with positive numbers</b>
+
<b>Для точек останова с положительными числами</b>
This may happen due to incorrect [[Debugger Setup]]. Ensure smart linking is disabled.
+
Это может произойти из-за неправильных [[Debugger_Setup/ru|настроек отладчика]]. Убедитесь, что интеллектуальные ссылки отключены.
It usually means that the breakpoint is in a procedure that is not called, and not included in your exe.
+
Обычно это означает, что точка останова находится в процедуре, которая не вызывается и не включается в ваш исполняемый файл.
  
On Windows, if it happens despite correct setup, then add -Xe (external linker) to the custom options.
+
В Windows, если это происходит несмотря на правильную настройку, добавьте -Xe (внешний компоновщик) к пользовательским параметрам.
  
 
</td></tr>
 
</td></tr>
Line 588: Line 595:
 
</table>
 
</table>
  
=Reporting Bugs=
+
=Сообщения об ошибках=
  
* Did you verify your [[Debugger Setup]]?
+
* Вы проверили свои [[Debugger_Setup/ru|настройки отладчика]]?
* Did you try Dwarf and Stabs
+
* Вы пробовали [переключать в режим] Dwarf и Stabs
  
== Check existing Reports ==
+
== Проверьте существующие отчеты ==
  
Please check each of the following links
+
Пожалуйста, проверьте каждую из следующих ссылок
  
 
* [http://bugs.freepascal.org/search.php?project_id=0&category=Debugger&status_id%5B%5D=10&status_id%5B%5D=20&status_id%5B%5D=30&status_id%5B%5D=40&status_id%5B%5D=50&status_id%5B%5D=80&sticky_issues=on&sortby=last_updated&dir=DESC&per_page=250&hide_status_id=-2 Search Mantis for category "debugger"]
 
* [http://bugs.freepascal.org/search.php?project_id=0&category=Debugger&status_id%5B%5D=10&status_id%5B%5D=20&status_id%5B%5D=30&status_id%5B%5D=40&status_id%5B%5D=50&status_id%5B%5D=80&sticky_issues=on&sortby=last_updated&dir=DESC&per_page=250&hide_status_id=-2 Search Mantis for category "debugger"]
Line 603: Line 610:
 
* [http://bugs.freepascal.org/search.php?project_id=0&search=stabs&category%5B%5D=-&category%5B%5D=Compiler&category%5B%5D=Converter&category%5B%5D=Custom+Drawn&category%5B%5D=Database&category%5B%5D=Database+Components&category%5B%5D=Documentation&category%5B%5D=FCL&category%5B%5D=FPSpreadsheet&category%5B%5D=FV&category%5B%5D=Free+Vision&category%5B%5D=IDE&category%5B%5D=Installer&category%5B%5D=LCL&category%5B%5D=LazDataDesktop&category%5B%5D=LazReport&category%5B%5D=Misc&category%5B%5D=OnGuard&category%5B%5D=Other&category%5B%5D=Packages&category%5B%5D=Patch&category%5B%5D=Printer&category%5B%5D=RTL&category%5B%5D=TAChart&category%5B%5D=Utilities&category%5B%5D=Virtual+Treeview&category%5B%5D=Web+site&category%5B%5D=Website&category%5B%5D=Widgetset&category%5B%5D=glscene&category%5B%5D=lNet&category%5B%5D=rx&status_id%5B%5D=10&status_id%5B%5D=20&status_id%5B%5D=30&status_id%5B%5D=40&status_id%5B%5D=50&status_id%5B%5D=80&sticky_issues=on&sortby=last_updated&dir=DESC&per_page=250&hide_status_id=-2 Search Mantis for text "stabs"]
 
* [http://bugs.freepascal.org/search.php?project_id=0&search=stabs&category%5B%5D=-&category%5B%5D=Compiler&category%5B%5D=Converter&category%5B%5D=Custom+Drawn&category%5B%5D=Database&category%5B%5D=Database+Components&category%5B%5D=Documentation&category%5B%5D=FCL&category%5B%5D=FPSpreadsheet&category%5B%5D=FV&category%5B%5D=Free+Vision&category%5B%5D=IDE&category%5B%5D=Installer&category%5B%5D=LCL&category%5B%5D=LazDataDesktop&category%5B%5D=LazReport&category%5B%5D=Misc&category%5B%5D=OnGuard&category%5B%5D=Other&category%5B%5D=Packages&category%5B%5D=Patch&category%5B%5D=Printer&category%5B%5D=RTL&category%5B%5D=TAChart&category%5B%5D=Utilities&category%5B%5D=Virtual+Treeview&category%5B%5D=Web+site&category%5B%5D=Website&category%5B%5D=Widgetset&category%5B%5D=glscene&category%5B%5D=lNet&category%5B%5D=rx&status_id%5B%5D=10&status_id%5B%5D=20&status_id%5B%5D=30&status_id%5B%5D=40&status_id%5B%5D=50&status_id%5B%5D=80&sticky_issues=on&sortby=last_updated&dir=DESC&per_page=250&hide_status_id=-2 Search Mantis for text "stabs"]
  
=== Bugs in GDB ===
+
=== Баги в GDB ===
 
<table class="wikitable">
 
<table class="wikitable">
 
<tr valign="top">
 
<tr valign="top">
   <th>Description</th>
+
   <th>Описание</th>
   <th>OS</th>
+
   <th>ОС</th>
 
   <th>GDB Version(s)</th>
 
   <th>GDB Version(s)</th>
   <th>Reference</th>
+
   <th>Ссылка</th>
 
</tr>
 
</tr>
  
 
<tr valign="top">
 
<tr valign="top">
   <td> win64 crash with bad dwarf2 symbols </td>
+
   <td> Падение на win64 с неправильными символами dwarf2 </td>
 
   <td> win64 </td>
 
   <td> win64 </td>
   <td> GDB 7.4 (maybe higher) </td>
+
   <td> GDB 7.4 (может быть и выше) </td>
 
   <td> http://sourceware.org/bugzilla/show_bug.cgi?id=14014 </td>
 
   <td> http://sourceware.org/bugzilla/show_bug.cgi?id=14014 </td>
 
</tr>
 
</tr>
  
 
<tr valign="top">
 
<tr valign="top">
   <td> Debuggee doesn't see environment variables set with set environment </td>
+
   <td> Отладчик не видит переменные окружения, установленные в переменной окружения </td>
 
   <td> win </td>
 
   <td> win </td>
   <td> Solved in GDB 7.4 </td>
+
   <td> Решено в GDB 7.4 </td>
 
   <td> http://sourceware.org/bugzilla/show_bug.cgi?id=10989 </td>
 
   <td> http://sourceware.org/bugzilla/show_bug.cgi?id=10989 </td>
 
</tr>
 
</tr>
  
 
<tr valign="top">
 
<tr valign="top">
   <td> Win32 fails to continue with "winerr 5" (pc register not available) <br/> *apparently* not present in 7.0 to 7.2 </td>
+
   <td> Win32 падает с ошибкой "winerr 5" (реестр ПК недоступен) <br/> *очевидно* не проявляется от 7.0 до 7.2 </td>
 
   <td> win </td>
 
   <td> win </td>
   <td> GDB 7.3 and up (maybe 6.x too) <br/> Appears to be fixed in 7.7.1 </td>
+
   <td> GDB 7.3 и выше (может быть также в 6.x) <br/> Кажется, должно быть исправлено в 7.7.1 </td>
 
   <td> http://sourceware.org/bugzilla/show_bug.cgi?id=14018 </td>
 
   <td> http://sourceware.org/bugzilla/show_bug.cgi?id=14018 </td>
 
</tr>
 
</tr>
  
 
<tr valign="top">
 
<tr valign="top">
   <td> Wrong array index with dwarf </td>
+
   <td> Неверный индекс массива с dwarf </td>
 
   <td> * </td>
 
   <td> * </td>
   <td> GDB 7.3 to 7.5 (maybe 7.6.0) <br/> fixed in 7.6.1 </td>
+
   <td> GDB от 7.3 до 7.5 (может быть в 7.6.0) <br/> исправлено в 7.6.1 </td>
 
   <td> http://sourceware.org/bugzilla/show_bug.cgi?id=15102 </td>
 
   <td> http://sourceware.org/bugzilla/show_bug.cgi?id=15102 </td>
 
</tr>
 
</tr>
  
 
<tr valign="top">
 
<tr valign="top">
   <td> GDB crashes, if trying to inspect or watch resourcestrings <br/>only tested on win32, not known for other platforms only, if using dwarf </td>
+
   <td> GDB падает, если пытается проверить или просмотреть строки ресурсов <br/>протестировано только на win32, не известно только для других платформ, если используется dwarf</td>
 
   <td> * </td>
 
   <td> * </td>
   <td> GDB 7.0 to 7.2.xx </td>
+
   <td> GDB от 7.0 до 7.2.xx </td>
 
   <td>  </td>
 
   <td>  </td>
 
</tr>
 
</tr>
  
 
<tr  valign="top">
 
<tr  valign="top">
   <td> Records (especially: pointer to record) may be mistaken for classes/objects <br/> The data/values appear to be displayed correct / further tests pending<br />This also affect the ability to inspect shortstring </td>
+
   <td> Записи (особенно: указатель на запись) могут быть ошибочно приняты за classes/objects <br/> Данные/значения отображаются корректно / ожидаются дальнейшие тесты<br />Это также влияет на способность проверять короткие строки shortstring </td>
 
   <td> * </td>
 
   <td> * </td>
   <td> GDB 7.6.1 and up (tested and failing up to GDB 8.1) </td>
+
   <td> GDB 7.6.1 и выше (проверено и не работает до GDB 8.1) </td>
 
   <td> https://sourceware.org/bugzilla/show_bug.cgi?id=16016 </td>
 
   <td> https://sourceware.org/bugzilla/show_bug.cgi?id=16016 </td>
 
</tr>
 
</tr>
  
 
<tr  valign="top">
 
<tr  valign="top">
   <td> Object variables (Members) of the current methods class (self.xxx) can not be watched/inspected <br/> To work around use upper case or prefix with self. </td>
+
   <td> Объектные переменные (члены) методов текущего класса (self.xxx) не могут быть отслежены/проверены <br/> Чтобы обойти, используйте верхний регистр или префикс в виде self. </td>
 
   <td> * </td>
 
   <td> * </td>
   <td> GDB 7.7 up to 7.9.0 (incl) <br/> Workaround present in Lazarus 1.4 and up </td>
+
   <td> GDB от 7.7 до 7.9.0 (включительно) <br/> Обходной путь присутствует в Lazarus 1.4 и выше </td>
 
   <td> https://sourceware.org/bugzilla/show_bug.cgi?id=17835 </td>
 
   <td> https://sourceware.org/bugzilla/show_bug.cgi?id=17835 </td>
 
</tr>
 
</tr>
  
 
<tr  valign="top">
 
<tr  valign="top">
   <td> gdb cannot continue after SIGFPE or SIGSEGV happen on windows </td>
+
   <td> GDB не может продолжить работу после SIGFPE или SIGSEGV на Windows </td>
 
   <td> win </td>
 
   <td> win </td>
 
   <td> * </td>
 
   <td> * </td>
Line 669: Line 676:
  
 
<tr  valign="top">
 
<tr  valign="top">
   <td> GDB truncates values for "const x = qword(...)" </td>
+
   <td> GDB усекает значения для "const x = qword(...)" </td>
   <td> Win 64 bit <br/> maybe others </td>
+
   <td> Win х64 <br/> может быть и другие </td>
   <td> Fixed in GDB 7.7 and up, maybe fibed between 7.3 and 7.7 </td>
+
   <td> Исправлено в GDB 7.7 и выше, возможно, исправлено даже между 7.3 и 7.7 </td>
 
   <td> </td>
 
   <td> </td>
 
</tr>
 
</tr>
Line 677: Line 684:
 
</table>
 
</table>
  
=== Issues with GDB 7.5.9 or 7.6 ===
+
=== Проблемы с GDB 7.5.9 или 7.6 ===
  
There are various reports (not confirmed) for different platforms about crashes in gdb 7.5.9 or 7.6.
+
Существуют различные сообщения (не подтвержденные) для разных платформ о сбоях в gdb 7.5.9 или 7.6.
  
It is highly recommended not to use those versions.
+
Настоятельно рекомендуется не использовать эти версии.
  
 
* http://bugs.freepascal.org/view.php?id=24401
 
* http://bugs.freepascal.org/view.php?id=24401
Line 689: Line 696:
 
== Create a new Report (GDB and LLDB) ==
 
== Create a new Report (GDB and LLDB) ==
  
If you have at any time in the past updated, changed, reinstalled your Lazarus then please check the "Options" dialog ("Environment" or "Tools" Menu) for the version of GDB and FPC used. They may still point to old settings.
+
Если вы когда-либо в прошлом обновляли, изменяли, переустанавливали свой Lazarus, тогда, пожалуйста, проверьте диалоговое окно "Options"(Параметры) ("Environment"(Окружение) или меню "Tools"(Сервис)) для [проверки] версии используемых GDB и FPC. Они все еще могут указывать на старые настройки.
  
=== Basic Information ===
+
=== Основная информация ===
  
* Your Operating system and Version
+
* Ваша операционная система и версия
* Your CPU (Intel, Power, ...) <b>32 or 64 bit</b>
+
* Ваш CPU (Intel, Power, ...) <b>х32 или х64</b>
* Version of
+
* Версия...
** Lazarus (Latest Release or SVN revision) (Include setting used to recompile LCL, packages or IDE (if a custom compile Lazarus is used))
+
** Lazarus (последний стабильный релиз или ревизия SVN) (включите настройки, использующие перекомпиляцию LCL, пакетов или IDE (если используется пользовательская компиляция Lazarus))
** FPC, if different from default. Please check the "Options" dialog ("Environment" or "Tools" Menu)
+
** FPC, если отличается от значения по умолчанию. Пожалуйста, проверьте диалоговое окно "Options"(Настройки)("Environment"(Окружение) или меню "Tools"(Сервис))
** GDB, please check the "Options" dialog ("Environment" or "Tools" Menu)
+
** GDB, пожалуйста, проверьте диалоговое окно "Options"(Настройки)("Environment"(Окружение) или меню "Tools"(Сервис))
* Compiler Settings: (Menu: "Project", "Project Options", indicate all settings you used )
+
* Настройки компилятора: (меню: "Project"(Проект), "Project Options"(Настройки проекта), указать все настройки, которые вы использовали)
**Page "Code generation"
+
**Страница "Compilation and linking"(Компиляция и компоновка)
::Optimization settings (-O???): Level (-O1 / ...) Other (-OR -Ou -Os) (Please always test with all optimizations disabled, and -O1)
+
::фрейм "Optimization levels"(Уровни оптимизации) (-O???): Level (-O1 / ...) Other (-OR -Ou -Os) (Пожалуйста, всегда тестируйте с отключенной оптимизацией, и -O1)
:*Page "Linking"
+
::фрейм "Linking"(Компоновка)
::Debug Info: (-g -gl -gw) (<b>Please ensure that at least either -g or -gw is used</b>)
+
:::Smart Link(Умная компоновка) (-XX)<b>Должно быть отключено(снята галочка)</b>
::Smart Link (-XX)<b>This must be OFF</b>
+
**Страница "Debugging"(Отладка)
::Strip Symbols (-Xs); <b>This must be OFF</b>
+
::фрейм  "Debugger Info"(Отладочная информация): (-g -gl -gw) (<b>Пожалуйста, убедитесь, что используется как минимум -g или -gw</b>)
 +
:::Strip Symbols from executable(Вырезать символы из исполняемого файла) (-Xs); <b>Должно быть отключено (снята галочка)</b>
  
 
=== Логирование информации для сеанса отладки ===
 
=== Логирование информации для сеанса отладки ===
  
:Start Lazarus with the following options:
+
:Запустите Lazarus со следующими параметрами:
 
   --debug-log=LOG_FILE  --debug-enable=DBG_CMD_ECHO,DBG_STATE,DBG_DATA_MONITORS,DBGMI_QUEUE_DEBUG,DBGMI_TYPE_INFO,DBG_ERRORS
 
   --debug-log=LOG_FILE  --debug-enable=DBG_CMD_ECHO,DBG_STATE,DBG_DATA_MONITORS,DBGMI_QUEUE_DEBUG,DBGMI_TYPE_INFO,DBG_ERRORS
  
:;On Windows: you need to create a shortcut to the Lazarus exe (like the one on Desktop) and edit it's properties. Add " --debug-log=C:\laz.log --debug-enable=..." to the command line.
+
:;На Windows: вам нужно создать ярлык для Lazarus.exe (например, на рабочем столе) и отредактировать его свойства. Добавьте " --debug-log=C:\laz.log --debug-enable=..." в командную строку.
:;On Linux: start Lazarus from a shell and append  " --debug-log=/home/yourname/laz.log --debug-enable=..." to the command line
+
:;На Linux: запустите Lazarus из оболочки и добавьте " --debug-log=/home/yourname/laz.log --debug-enable=..." в командную строку
:;On Mac/OSX:start Lazarus from a shell /path/to/lazarus/lazarus.app/Contents/MacOS/lazarus --debug-log=/path/to/yourfiles/laz.log --debug-enable=...
+
:;На macOS: запустите Lazarus из оболочки /path/to/lazarus/lazarus.app/Contents/MacOS/lazarus --debug-log=/path/to/yourfiles/laz.log --debug-enable=...
 
 
Attach the log file after reproducing the error.
 
  
 +
Приложите файл журнала после воспроизведения ошибки.
  
If you can not generate a log file, you may try to open the "Debug output" window (from menu "View" -> "Ide Internals").<b>You must open this before you run your app (F9)</b>. And then run your app. Once the error occurs, copy, zip, and attach the content of the "debug output" window.
+
Если вы не можете сгенерировать файл журнала, попробуйте открыть окно "Debug output"(Вывод отладки) (из меню "View"(Вид) -> "Ide Internals"(Внутреннее состояние IDE)). <b>Вы должны открыть его перед запуском приложения (по F9)</b>. А затем запустите ваше приложение. После возникновения ошибки скопируйте, заархивируйте и прикрепите содержимое окна "Debug output"(Вывод отладки).
  
= Running the test-case =
+
= Тестовые запуски =
  
If you run a different version of GDB you may want to run the test case. Please note, that not all tests have yet the correct expectations for each possible setup. Therefore some tests may fail on some systems.
+
Если вы используете другую версию GDB, вы можете запустить тестовый пример. Обратите внимание, что не все тесты имеют правильные ожидания для каждой возможной установки. Поэтому некоторые тесты могут не работать на некоторых системах.
  
The debugger test are in the directory:
+
Тест отладчика находится в каталоге:
 
* Lazarus 1.2.x:  debugger\test\Gdbmi\
 
* Lazarus 1.2.x:  debugger\test\Gdbmi\
* Lazarus 1.3 and up: components\lazdebuggergdbmi\test\
+
* Lazarus 1.3 и выше: components\lazdebuggergdbmi\test\
In the below the 1.3 path is used. If using 1.2.x substitute as appropriate.
+
В приведенном ниже пути используется v.1.3. Если используется 1.2.x, замените его соответствующим образом.
  
  
; One time setup:
+
; Одноразовая настройка:
Create directory components\lazdebuggergdbmi\test\Logs:
+
Создайте каталог  components\lazdebuggergdbmi\test\Logs:
Optional, but helps keeping test result in one place
+
Необязательно, но помогает хранить результат теста в одном месте
  
Create config files:
+
Создайте конфигурационные файлы:
in components\lazdebuggergdbmi\test\
+
В каталоге components\lazdebuggergdbmi\test\
 
:copy fpclist.txt.sample to fpclist.txt
 
:copy fpclist.txt.sample to fpclist.txt
 
:copy gdblist.txt.sample to gdblist.txt
 
:copy gdblist.txt.sample to gdblist.txt
open the 2 txt files and edit the path to fpc/gdb, also edit the version (the test may run different test, for different versions).  
+
откройте 2 текстовых файла и отредактируйте путь к fpc/gdb, а также отредактируйте версию (тест может запускать разные тесты для разных версий).
It is possible to specify more than one gdb/fpc
+
Можно указать более одного GDB/FPC
  
  
; Running the test:
+
; Запуск теста:
* Open project: components\lazdebuggergdbmi\test\TestGdbmi.lpi
+
* Откройте проект: components\lazdebuggergdbmi\test\TestGdbmi.lpi
* Lazarus 1.2.x only: Rebuild the IDE wit option "Clean" (Menu Tools: "Configure build IDE" / Restart is not needed). If this is skipped, compilation of the project may fail. Once compilation failed, ALL *.ppu/*.o files in debugger\test must be deleted by hand.
+
* Только для Lazarus 1.2.x: пересоберите IDE с опцией "Clean"(Очистить) (Меню "Tools"(Сервис) --> "Configure build Lazarus"(Параметры сборки Lazarus) --> снять галочку с "Restart after building IDE"(Перезапускать после сборки IDE)). Если это пропущено, компиляция проекта может завершиться неудачно. Если компиляция не удалась, ВСЕ *.ppu/*.o файлы в [папке] lazdebuggergdbmi\test должны быть удалены вручную.
* Run the project (If a test failed, you may have to delete *.exe files in components\lazdebuggergdbmi\test\TestApps
+
* Запустите проект (если тест не прошел, возможно, вам придется удалить файлы *.exe в components\lazdebuggergdbmi\test\TestApps)
  
=Links=
+
=Ссылки=
  
==External Links==
+
==Внешние ссылки==
  
* [https://www.gnu.org/software/gdb/ Official GDB site]
+
* [https://www.gnu.org/software/gdb/ Официальный сайт GDB]
  
== Experimental Debuggers in pascal ==
+
== Экспериментальные отладчики в Паскале ==
  
Those are work in progress:
+
Это работа в процессе:
  
* http://sourceforge.net/projects/duby/
+
* [http://sourceforge.net/projects/duby/ duby]
* https://github.com/graemeg/fpdebug
+
* [https://github.com/graemeg/fpdebug fpdebug] от Graeme Geldenhuys
* https://code.google.com/p/vdbg/
+
* [https://code.google.com/p/vdbg/ vdbg]
* fpdebug in Lazarus/components/fpdebug and debugger/components/fpgdbmidebugger [http://lazarus-dev.blogspot.co.uk/2014/05/de-bug-wars-new-hope.html blog] [[FpGdbmiDebugger]]
+
* fpdebug in Lazarus/components/fpdebug and debugger/components/fpgdbmidebugger  
 +
* [http://lazarus-dev.blogspot.co.uk/2014/05/de-bug-wars-new-hope.html blog]  
 +
* [[FpGdbmiDebugger]]
  
* http://forum.lazarus.freepascal.org/index.php/topic,22252.0.html
+
* [http://forum.lazarus.freepascal.org/index.php/topic,22252.0.html How to register debugger from package?]
  
== Related forum topics ==
+
== Связанные темы форума ==
  
 
* [http://forum.lazarus.freepascal.org/index.php/topic,23221.0.html Issues (crash) with gdb 7.6.2 on arch linux]  
 
* [http://forum.lazarus.freepascal.org/index.php/topic,23221.0.html Issues (crash) with gdb 7.6.2 on arch linux]  

Latest revision as of 01:49, 16 February 2020

English (en) русский (ru)


Вступление

Lazarus поставляется с GDB в качестве отладчика по умолчанию. Начиная с Lazarus 2.0, это значение по умолчанию изменилось на LLDB на MacO.

  • Эта страница для Lazarus 1.0 и новее. Для более старых версий см. предыдущая версия этой страницы
  • Примечание по GDB 7.5: GDB 7.5 не поддерживается выпущенной версией 1.0. Исправления для поддержки были сделаны в 1.1.

См.также

Установка (GDB и LLDB)

Чтобы получить наилучшие результаты, вы должны убедиться, что ваша IDE и Project правильно настроены.

См. раздел установка отладчика, чтобы настроить IDE и ваш проект для использования отладчика.

Setup Video Tutorial

Другое

Debugging console applications

Основное

Тип отладочной информации (GDB и LLDB)

Light bulb  Примечание: Эти настройки применяются только к проекту или пакету, для которого они установлены. Если вы изменяете настройки в любом из параметров проекта или пакета, следует убедиться, что это сделано для всех пакетов и проекта.
В противном случае ваш проект будет иметь смешанную информацию отладки, что может привести к ухудшению процесса отладки.

Настройки могут быть применены к проекту или пакетам с использованием Additions and Overrides
Light bulb  Примечание: При компиляции 32-битных приложений (нативных или кросс) FPC по умолчанию имеет значение "Stabs" (по крайней мере, в некоторых ОС). Рекомендуется изменить вашу конфигурацию на "Dwarf".

Для 64-битных приложений FPC поддерживает только "Dwarf". (Старые FPC также поддерживают "Stabs", но это не рекомендуется)


Stabs (только GDB)

-g или -gs

Вы должны использовать только если ваша версия GDB не поддерживает [режим] dwarf. Есть очень мало других случаев, когда вам это нужно.

Вам может понадобиться это [в случае использования] «var param» (param by ref): procedure foo(var a: integer); Однако IDE имеет дело с этим в 99% всех случаев.

Отладчик на основе LLDB не поддерживает [режим] Stabs

Dwarf (GDB и LLDB)

Dwarf 2 (-gw)

Это устанавливает формат в Dwarf2. Это самая основная настройка dwarf.

Dwarf 2 с наборами (-gw -godwarfsets)

Этот параметр добавляет возможность проверки наборов: "type TFoo=set of (a,b,c);". Это заимствовано из спецификаций Dwarf 3, но поддерживается большинством версий GDB (любой GDB начиная с версии 7 и выше должен это делать).  Это рекомендуемая настройка.

Dwarf 3 (-gw3)

Dwarf 3 может кодировать дополнительную информацию для некоторых типов (таких как строки и массивы). Это также сохраняет регистр идентификаторов в отладочной информации.

Однако все еще есть проблемы с произведенной отладочной информацией. Некоторая информация может быть неправильно закодирована, а другая не понята GDB. В некоторых случаях это может привести к падению gdb. Этот параметр можно использовать при использовании отладчика на основе FpDebug (добавить пакет для IDE)


Различия

Этот список никоим образом не полон:

  • dwarf допускает некоторые свойства (те, которые непосредственно сопоставлены с полем)
  • stabs (и современный gdb) может делать -gp (сохранить регистр символов вместо того, чтобы получать все заглавные буквы).
  • stabs имеет проблемы с некоторыми типами классов. IDE исправляет это в некоторых случаях. (Влияет только на GDB 7.0 и выше) [1]

Проверка типов данных (Watch/Hint)

Строки

GDB не знает тип данных строк Паскаля. Информация о типе, которую возвращает GDB, в настоящее время не позволяет IDE различать PChar (индекс равен 0) и строку (индекс равен 1).

В результате "mystring[10]" может быть 10-ым символом в строке или 11-м в PChar

Поскольку среда IDE не может быть уверена, какая из них применима, она покажет оба варианта. 2 результата будут иметь префикс String/PChar.

Свойства

В настоящее время отладчик не поддерживает выполнение каких-либо методов. Поэтому могут быть проверены только те свойства, которые относятся непосредственно к переменной. (Это работает только при использовании dwarf).

TFoo = Class
private
  FBar: Integer;
  function GetValue: Integer;
public
  property Bar: Integer read FBar;        // Может быть проверено (если используется Dwarf)
  property Value: Integer read GetValue;  // *Не* может быть проверен
end;

Вложенные процедуры / функции

procedure SomeObject.Outer(NumText: string);
var 
  OuterVarInScope: Integer;

procedure Nested;
var 
  I: Integer;
begin
  WriteLn(OuterVarInScope);  
end;

var 
  OuterVarOutsideScope: Integer;

begin
  Nested;
end;

Если вы входите в «Nested», то IDE позволяет вам проверять переменные из обоих стековых фреймов.

Это вы можете проверить: I, OuterVarInScope, NumText (без необходимости изменять текущий фрейм стека, в окне стека)

Однако есть несколько оговорок:

Вы также можете проверить: OuterVarOutsideScope. Это против правил определения границ Паскаля. Это имеет значение, только если у вас есть несколько вложенных уровней, и все они содержат переменную с тем же именем, но область видимости Паскаля скрыла бы переменную из среднего фрейма. Тогда вы увидите неправильное значение.

Вы не можете оценить операторы по 2 фреймам: «OuterVarnScope-I» не работает.

Warning-icon.png

Предупреждение: Вы можете увидеть неправильное значение. Если в любом другом модуле есть глобальная (или иным образом видимая для правил области действия GDB) переменная с тем же именем, что и локальная переменная из внешнего фрейма, будет показана эта глобальная переменная. Там нет никакого предупреждения для этого. Безопасным способом является явный выбор внешнего стекового фрейма, в котором определен локальный var, и проверка значения.


Массивы

array [x..y] of Integer;

показывает как символы, а не int. Только GDB 7.2 или выше, кажется, справиться с этим правильно.

Кроме того, могут возникнуть проблемы при использовании массивов (неназванных) записей.

Динамические массивы будут показывать только ограниченный объем своих данных. Начиная с Lazarus 1.1, предел может быть указан.

Если значения Watches/Hint отображаются некорректно, отключите REGVARS. Установите -OoNOREGVAR в «Параметрах пользователя».

Указание GDB вида сборки

GDB позволяет указать вид сборки (стиль Intel или AT&T), который будет использоваться при отображении кода сборки. Если кто-то хочет перейти на конкретный вариант, это можно изменить в свойстве AssemblerStyle в параметрах отладчика Lazarus для GDB (функция доступна в Lazarus 2.0). Альтернативно (и единственный способ добиться этого внутри Lazarus в более старых версиях до Lazarus 2.0) можно указать эту опцию, передав команду set disassembly-flavor в Debugger_Startup_options. Можно использовать несколько вариантов синтаксиса (в зависимости от версии GDB), некоторые из которых показаны ниже:

 -ex "set disassembly-flavor intel"
 --eval-command="set disassembly-flavor intel"
 -eval-command="set disassembly-flavor intel"
 --eval-command "set disassembly-flavor intel"

Обратите внимание, что может потребоваться сбросить отладчик (Run | Reset Debugger) перед загрузкой GDB с новой настройкой.

Windows

Консольный вывод для GUI-приложений

В Windows в среде IDE нет окна «Отладчик - вывод на консоль». Это потому, что консольные приложения открывают свое собственное окно консоли. Приложения с графическим интерфейсом по умолчанию не имеют консоли. Чтобы иметь консоль для приложения с графическим интерфейсом, необходимо изменить настройки компилятора (Project options(Параметры проекта) / Compiler Options(Параметры компилятора) / Config and Target(Настройка и целевая платформа) / Win32 Gui Application(Графическое приложение Win32): -WC / -WG)

Отладка приложений с правами Администратора

В Windows Vista+ в разделе Project Options(Параметры проекта) при установке разрешений в файле манифеста для программы «от имени Администратора» программа будет запускаться с правами администратора. Если ваша IDE запущена не от имени Администратора, отладка будет запускаться нормально, программа будет отображаться в списке задач, но ее графический интерфейс не будет отображаться.

Поэтому имейте в виду, что вы должны сопоставить уровень привилегий между IDE (и gdb) и приложением, которое необходимо отладить.

Win 64 bit

  • Требуется Lazarus 1.0+ (с FPC 2.6+)
  • Рекомендуется использовать dwarf

Использование 32-битного Lazarus на 64-битной Windows

В качестве альтернативы можно отлаживать приложения как 32-разрядные приложения (используя 32-разрядную версию GDB). После успешной отладки:

  • приложение может быть кросс-скомпилировано до 64 бит или
  • можно использовать 2-ую установку Lazarus (используя другую конфигурационную опцию --primary-config-path из 32-битной Lazarus)

При установке 32-битного Lazarus убедитесь, что вы изменили конфигурацию, чтобы использовались правильные 32-битные FPC и GDB.

Больше проблем и решений Win 64 bit

См. также http://forum.lazarus.freepascal.org/index.php/topic,13188.0/topicseen.html

Win CE

Отладчик не находит никаких исходных файлов

Меню: "Tools"(Сервис) Страница: "Debugger"/"Generic" (Отладчик/Общее) Поле: "Additional search path" (Дополнительный путь поиска)

Введите в это поле букву вашего каталога проекта.

Linux

Известные проблемы

  • При использовании старой версии GDB могут возникнуть проблемы, по крайней мере, на некоторых процессорах (например, SPARC, с GDB 6.4, поставляемой Debian "Etch"). В частности, фоновые потоки могут блокироваться, даже если программа работает нормально автономно.
  • Если ваша программа блокируется при запуске, перейдите в Tools(Сервис) / Options(Настройки) / Debugger(Отладчик) / General(Общее) и установите DisableLoadSymbolsForLibraries=True

macOS

Под macOS вы обычно устанавливаете GDB с инструментами разработчика Apple. Версия GDB, доступная на момент написания, - 6.3.50.

Этот раздел - первый подход к сбору информации об известных проблемах и обходных путях. Информация, представленная здесь, во многом зависит от отзывов пользователей macOS.

Начиная с Lazarus 2.0, в среде IDE имеется отладчик на основе LLDB. Отладчик на основе GDB также может использоваться, но требует много работы по сборке и подписи кода GDB.

Известные проблемы (GDB)

Отладка 32-битного приложения на 64-битной архитектуре

IЭто возможно, а иногда и необходимо отладить 32-битный exe-файл в 64-битной системе.

Это возможно только с Lazarus 0.9.29 rev 28640 и выше.

TimeOuts (только 64 бит)

Похоже, что некоторые команды некорректно (или не полностью) обрабатываются GDB 6.3.50. Обычно GDB заканчивает каждую команду запросом "<gdb>" для следующей команды. Но версия, предоставляемая Apple, иногда не может этого сделать. В этом случае IDE придется использовать тайм-аут, чтобы избежать бесконечного ожидания.

Это было замечено с:

  • Определенными выражениями Watch (по крайней мере, если наблюдаемая переменная не была доступна в текущей выбранной функции)
  • Обработкой исключений
  • Вставленными точками останова (окончание последнего модуля / отсутствие кода)

Это не может быть гарантировано:

  • что GDB не будет позже возвращать некоторые результаты от такой команды
  • что внутреннее состояние GDB все еще действительно

Приглашение, отображаемое для тайм-аутов, может быть отключено в конфигурации отладчика:

Warn On Timeout
True/False. Автопродолжение, после тайм-аута не показывается предупреждение.
TimeOutForEval
Задайте [интервал] в миллисекундах, как долго не срабатывает обнаружение тайм-аута (само обнаружение может занять некоторое время).

Возможно, вам придется «СБРОСИТЬ» отладчик после внесения этих изменений.

Больше информации смотрите здесь:

Альтернативное решение, похоже, заключается в использовании более новой версии GDB (см. ниже).

Hardware exceptions under macOS

When a hardware exception occurs under macOS, such as an invalid pointer access (SIGSEGV) or an integer division-by-zero on Intel processors, the debugger will catch this exception at the Mach level. Normally, the system translates these Mach exceptions into Unix-style signals where the FPC run time library handles them. The debugger is however unable to propagate Mach exceptions in this way.

The practical upshot is that it is impossible under macOS to continue a program in the debugger once a hardware exception has been triggered. This is not FPC-specific, and cannot be fixed by us.

Использование альтернативных отладчиков (GDB)

Вы можете установить GDB 7.1 (или более позднюю версию), используя MacPorts, fink или homebrew.

Было замечено следующее:

  • GDB 7.1, похоже, имеет проблемы с отладочной информацией [режима] stabs из fpc.
Убедитесь, что вы выбрали "generate dwarf debug information (-gw)"(генерировать отладочную информацию dwarf (-gw)) на прилагаемой вкладке project options(параметры проекта)
Следите за предупреждениями компоновщика "unknown stabs"
Если у вас все еще есть проблемы, убедитесь, что никакой код вообще не скомпилирован [в режиме] stabs. Ваш LCL может содержать [код, скомпилированный в режиме] stabs, и это закончится в вашем приложении, даже если вы скомпилируете приложение с -gw. Поэтому вам, возможно, придется перекомпилировать LCL с помощью -gw (или без какой-либо отладочной информации). То же самое для любого другого модуля, пакета, RTL, ...., которые могут иметь [код, скомпилированный в режиме] stabs.

Даже при соблюдении этих правил GDB не всегда работает с приложениями, скомпилированными в fpc.


Эти наблюдения могут быть неполными или неправильными, пожалуйста, обновите их, если у вас есть дополнительная информация.

Lazarus версии от 1.0 до 1.0.12

В настройках отладчика сконфигурируйте

 EncodeCurrentDirPath = gdfeNone
 EncodeExeFilename = gdfeNone

И вы должны использовать "run param", чтобы указать фактический исполняемый файл внутри пакета приложения (project.app/Content/MacOS/project или аналогичный)

В Lazarus версии от 1.0.14 до 1.2 и выше эти шаги больше не требуются.

Xcode 5

Начиная с Mavericks 10.9, Xcode 5 больше не устанавливает GDB по умолчанию и не [делает его] глобальным.

  • Для 10.9 вы можете установить старый Xcode 4 параллельно. Это не поддерживается Apple, поэтому он может порвать с одной из следующих версий.

См., пожалуйста, issue 25157 on mantis

Тема "[Lazarus] Help: Проблемы macOS" на

Замороженный UI с GDB

Чтобы запустить программу из оболочки, вам нужно запустить «open <program1>.app», прямой доступ к ./program1 не даст вам доступа к пользовательскому интерфейсу. Чтобы заставить GDB работать изнутри вашей IDE, вы должны указать этот путь в качестве параметра run. Выберите в меню Run > Run parameter и введите полный путь к хост-приложению. Например, /User/<yourid>/sources/myproject/project1.app/Content/MacOS/project1

Ссылки

  • macOS поставляется с множеством полезных инструментов для отладки и профилирования. Просто запустите /Developer/Applications/Instruments.app и попробуйте их.

FreeBSD

GDB, предоставляемый системой, является древним (версия 6.1.1 во FreeBSD 9) и не очень хорошо работает с Lazarus.

Вы можете установить более новый GDB из дерева портов, например,

cd /usr/ports/devel/gdb
make -DBATCH install clean

Новый GDB находится в /usr/local/bin/gdb

Использование переведенного GDB (неанглийские сообщения от GDB)

  • Это относится только к Lazarus *до* 1.2 или *до* 1.0.14.
    В этом больше нет необходимости.

IDE ожидает ответов на английском языке. Если GDB переведен, это может повлиять на то, насколько хорошо IDE может его использовать.

Во многих случаях это все еще будет работать, но с ограничениями, такими как:

  • Нет сообщений или класса для исключений
  • Нет живого обновления потоков, пока приложение работает
  • Сообщение об ошибке отладчика после остановки приложения (в конце отладки)
  • другое ...

Пожалуйста, прочитайте всю ветку: [http://forum.lazarus.freepascal.org/index.php/topic,20756.msg120720]

Попробуйте запустить lazarus с

 export LANG=en_US.UTF-8
 lazarus

Известные проблемы/ошибки, о которых сообщает IDE

Сообщения     Описание  

During startup program exited normally

 
  Все

В редких случаях в среде IDE появляется сообщение "During startup program exited normally"(Во время запуска программа завершается нормально). Это сообщение появляется, когда отлаженное приложение закрыто. Если это произойдет, никакие точки останова в приложении не будут запущены, и приложение будет работать так, как если бы не было отладчика.

Эта ошибка может произойти по разным причинам. Есть как минимум 2 известных:

  • не зависящий от позиции exe (PIE): GDB не может переместить определенные точки останова, которые Lazarus использует для запуска exe (это происходит до того, как будут установлены какие-либо точки останова пользователя)
  • определенные библиотеки dll/so, которые определяют те же символы, что и основной exe.

Причин может быть еще больше. Второе происходит только при повторных запусках отладчика.

IDE пытается обойти это, но это не всегда удается. Вполне вероятно, что в тех случаях, когда в данный момент происходит сбой, это необходимо обойти с помощью пользовательского набора настроек (см. ниже).

Даже если вы можете обойти это, рассмотрите возможность отправки файла журнала: логирование информации для сеанса отладки

Способы обхода: (все на странице options / debugger)

Lazarus 1.2.2 и более ранние версии
перейдите к параметрам отладчика и в поле «debugger_startup_options» введите:
--eval-command="set auto-solib-add off"
Lazarus 1.2.4 и выше
перейдите к параметрам отладчика и установите для поля "DisableLoadSymbolsForLibraries" значение "True".

Это можно использовать, только если вы не отлаживаете библиотеки (если вы не написали свою собственную библиотеку)

  • Только в случае 2: проверьте "reset debugger after each run"(сбрасывать отладчик после каждого запуска)

Это добавляет очень небольшое увеличение времени, необходимого для запуска отладчика, так как GDB должен каждый раз перезагружаться.

  • Во всех случаях:

Попробуйте любое из значений, доступных для «InternalStartBreak» (в сетке свойств параметров)

SIGFPE

 
  Все

SIGFPE является исключением операций с плавающей точкой.

Источник: [forum thread]

Исключения SIGFPE возникают в следующей инструкции FPU; поэтому строка ошибки, которую вы получаете от Lazarus, может быть отключена/неверна.

Delphi, а, следовательно, и Freepascal, имеют нестандартную FPEMask. Многие библиотеки C не используют исключения для проверки проблем FPU, но проверяют состояние FPU.

Обходной путь: попробуйте изменить маску с помощью SetExceptionMask как можно раньше в вашей программе:

uses  math;
...
 SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, 
                   exOverflow, exUnderflow, exPrecision])

Если вы считаете, что в коде FPC что-то не так, вы можете использовать директиву $ SAFEFPUEXCEPTIONS. Это добавит FWAIT после каждого сохранения значения FPU в памяти. Большинство операций FPC с плавающей запятой и двойных операций заканчиваются сохранением результата где-то в памяти, поэтому в результате отладчик останавливается на правильной строке FPC. FWAIT - недопустимая задача для FPU, но она вызовет немедленное возникновение исключения, а не где-то дальше по вашему коду. Это не делается по умолчанию, потому что это сильно замедляет операции с плавающей запятой.

Error 193 (Error creating process / Exe not found)

 
  Windows

Подробнее см. здесь.

Эта проблема наблюдалась в Win XP и, по-видимому, вызвана самой Windows. Проблема возникает, если путь к вашему приложению имеет пробел, и существует второй путь/файл, имя которого совпадает с частью пути перед пробелом, например:

Ваше приложение: C:\test folder\project1.exe
Какой-то файл: C:\test

SigSegV - даже с новым пустым приложением

 
  Windows
Примечание
в большинстве случаев SigSegV - просто ошибка в вашем коде.

Нижеследующее применимо только [в том случае], если вы получаете SigSegv даже с новым пустым приложением (пустая форма и никаких изменений, внесенных в unit1).

Иногда SigSegV может быть вызван несовместимостью между GDB и некоторыми другими продуктами. Не известно, является ли это проблемой GDB или вызвано другим продуктом. Нет никаких признаков того, что какой-либо из перечисленных продуктов каким-либо образом виноват. Предоставленная информация может относиться только к некоторым версиям названных продуктов:

Comodo firewall
Lazarus cant run with comodo firewall
BitDefender
включен режим игры

SigSegV - и продолжить отладку

 
  Windows, Mac

Bug 10004 - gdb cannot continue after SIGFPE or SIGSEGV happen on windows

Workaround for SIGFPE bug in GDB for Windows?

На Windows Open/Save/File или System Dialog вызывает сбой GDB

См. следующую запись перестал работать gdb.exe

Или загрузите "alternative GDB"(альтернативный GDB) 7.7.1 (Win32) с сайта Lazarus SourceForge.

"Step over" шаги внутри функции (Win 64)

 
  Windows 64

Иногда нажатие клавиши F8 не переходит [мимо] функции, а входит в нее.

Можно продолжить с F8, и иногда GDB возвращается в вызывающую функцию после 1-го или 2-ого дальнейших шагов (переступая через оставшуюся часть функции).

В Lazarus 2.0 обходной путь был добавлен, но его необходимо включить. Перейдите в Tools(Сервис) > Options(Настройки) > Debugger(Отладчик) и включите (в сетке свойств) «FixIncorrectStepOver».

Перестал работать gdb.exe

 
  Windows

Поврежден сам GDB. Это будет связано с ошибкой в GDB и может быть невозможно исправить в Lazarus. Тем не менее, возможно, стоит отправить информацию (см. Раздел «Сообщения об ошибках» ниже). Возможно, Лазарус может избежать вызова неисправной функции.

Есть одна уже известная ситуация. GDB (от 6,6 до 7,4 (последний на момент тестирования)) может аварийно завершить работу во время запуска вашего приложения или сразу после его остановки. Это происходит во время загрузки библиотек (DLL) для вашего приложения (смотрите окно «Debug output»).

Lazarus 1.2.2 и более ранние версии
перейдите к параметрам отладчика и в поле «debugger_startup_options» введите:
--eval-command="set auto-solib-add off"
Lazarus 1.2.4 и выше
перейдите к параметрам отладчика и установите для поля «DisableLoadSymbolsForLibraries» значение «True».

Это можно использовать, только если вы не отлаживаете в библиотеках (если вы не написали свою собственную библиотеку) gdb start opt nolib.png

internal-error: clear_dangling_display_expressions

 
  Windows, может быть другая ОС

В конце сеанса отладки отладчик сообщает:

internal-error: clear_dangling_display_expressions: 
Assertion `objfile->pspace == solib->pspace' failed.

Это ошибка в GDB, и иногда решается так:

Lazarus 1.2.2 и более ранние версии
перейдите к параметрам отладчика и в поле "debugger_startup_options" введите:
--eval-command="set auto-solib-add off" 
Lazarus 1.2.4 и выше
перейдите к параметрам отладчика и установите для поля "DisableLoadSymbolsForLibraries" значение "True"

Это можно использовать, только если вы не отлаживаете библиотеку (если вы не пишете свою собственную библиотеку)

"PC register is not available" ("SuspendThread failed. (winerr 5)")

 
  Windows

GDB может упасть с этим сообщением. Это связано с Bug 14018. Если вы получаете эту проблему, вы можете при желании перейти с GDB 7.4 на GDB 7.2

Can not insert breakpoint (Не могу вставить точку останова)

 
  Все

Для точек останова с отрицательными числами: См. сюда, плз: How to reset gdb settings

Вы также можете попробовать:

Lazarus 1.2.2 и более ранние версии
перейдите к параметрам отладчика и в поле «debugger_startup_options» введите:
--eval-command="set auto-solib-add off"
Lazarus 1.2.4 и выше
перейдите к параметрам отладчика и установите для поля «DisableLoadSymbolsForLibraries» значение «True».

Это можно использовать, только если вы не отлаживаете библиотеку (если вы не пишете свою собственную библиотеку)

Для точек останова с положительными числами Это может произойти из-за неправильных настроек отладчика. Убедитесь, что интеллектуальные ссылки отключены. Обычно это означает, что точка останова находится в процедуре, которая не вызывается и не включается в ваш исполняемый файл.

В Windows, если это происходит несмотря на правильную настройку, добавьте -Xe (внешний компоновщик) к пользовательским параметрам.

Сообщения об ошибках

Проверьте существующие отчеты

Пожалуйста, проверьте каждую из следующих ссылок

Баги в GDB

Описание ОС GDB Version(s) Ссылка
Падение на win64 с неправильными символами dwarf2 win64 GDB 7.4 (может быть и выше) http://sourceware.org/bugzilla/show_bug.cgi?id=14014
Отладчик не видит переменные окружения, установленные в переменной окружения win Решено в GDB 7.4 http://sourceware.org/bugzilla/show_bug.cgi?id=10989
Win32 падает с ошибкой "winerr 5" (реестр ПК недоступен)
*очевидно* не проявляется от 7.0 до 7.2
win GDB 7.3 и выше (может быть также в 6.x)
Кажется, должно быть исправлено в 7.7.1
http://sourceware.org/bugzilla/show_bug.cgi?id=14018
Неверный индекс массива с dwarf * GDB от 7.3 до 7.5 (может быть в 7.6.0)
исправлено в 7.6.1
http://sourceware.org/bugzilla/show_bug.cgi?id=15102
GDB падает, если пытается проверить или просмотреть строки ресурсов
протестировано только на win32, не известно только для других платформ, если используется dwarf
* GDB от 7.0 до 7.2.xx
Записи (особенно: указатель на запись) могут быть ошибочно приняты за classes/objects
Данные/значения отображаются корректно / ожидаются дальнейшие тесты
Это также влияет на способность проверять короткие строки shortstring
* GDB 7.6.1 и выше (проверено и не работает до GDB 8.1) https://sourceware.org/bugzilla/show_bug.cgi?id=16016
Объектные переменные (члены) методов текущего класса (self.xxx) не могут быть отслежены/проверены
Чтобы обойти, используйте верхний регистр или префикс в виде self.
* GDB от 7.7 до 7.9.0 (включительно)
Обходной путь присутствует в Lazarus 1.4 и выше
https://sourceware.org/bugzilla/show_bug.cgi?id=17835
GDB не может продолжить работу после SIGFPE или SIGSEGV на Windows win * https://sourceware.org/bugzilla/show_bug.cgi?id=10004
GDB усекает значения для "const x = qword(...)" Win х64
может быть и другие
Исправлено в GDB 7.7 и выше, возможно, исправлено даже между 7.3 и 7.7

Проблемы с GDB 7.5.9 или 7.6

Существуют различные сообщения (не подтвержденные) для разных платформ о сбоях в gdb 7.5.9 или 7.6.

Настоятельно рекомендуется не использовать эти версии.

Create a new Report (GDB and LLDB)

Если вы когда-либо в прошлом обновляли, изменяли, переустанавливали свой Lazarus, тогда, пожалуйста, проверьте диалоговое окно "Options"(Параметры) ("Environment"(Окружение) или меню "Tools"(Сервис)) для [проверки] версии используемых GDB и FPC. Они все еще могут указывать на старые настройки.

Основная информация

  • Ваша операционная система и версия
  • Ваш CPU (Intel, Power, ...) х32 или х64
  • Версия...
    • Lazarus (последний стабильный релиз или ревизия SVN) (включите настройки, использующие перекомпиляцию LCL, пакетов или IDE (если используется пользовательская компиляция Lazarus))
    • FPC, если отличается от значения по умолчанию. Пожалуйста, проверьте диалоговое окно "Options"(Настройки)("Environment"(Окружение) или меню "Tools"(Сервис))
    • GDB, пожалуйста, проверьте диалоговое окно "Options"(Настройки)("Environment"(Окружение) или меню "Tools"(Сервис))
  • Настройки компилятора: (меню: "Project"(Проект), "Project Options"(Настройки проекта), указать все настройки, которые вы использовали)
    • Страница "Compilation and linking"(Компиляция и компоновка)
фрейм "Optimization levels"(Уровни оптимизации) (-O???): Level (-O1 / ...) Other (-OR -Ou -Os) (Пожалуйста, всегда тестируйте с отключенной оптимизацией, и -O1)
фрейм "Linking"(Компоновка)
Smart Link(Умная компоновка) (-XX); Должно быть отключено(снята галочка)
    • Страница "Debugging"(Отладка)
фрейм "Debugger Info"(Отладочная информация): (-g -gl -gw) (Пожалуйста, убедитесь, что используется как минимум -g или -gw)
Strip Symbols from executable(Вырезать символы из исполняемого файла) (-Xs); Должно быть отключено (снята галочка)

Логирование информации для сеанса отладки

Запустите Lazarus со следующими параметрами:
 --debug-log=LOG_FILE  --debug-enable=DBG_CMD_ECHO,DBG_STATE,DBG_DATA_MONITORS,DBGMI_QUEUE_DEBUG,DBGMI_TYPE_INFO,DBG_ERRORS
На Windows
вам нужно создать ярлык для Lazarus.exe (например, на рабочем столе) и отредактировать его свойства. Добавьте " --debug-log=C:\laz.log --debug-enable=..." в командную строку.
На Linux
запустите Lazarus из оболочки и добавьте " --debug-log=/home/yourname/laz.log --debug-enable=..." в командную строку
На macOS
запустите Lazarus из оболочки /path/to/lazarus/lazarus.app/Contents/MacOS/lazarus --debug-log=/path/to/yourfiles/laz.log --debug-enable=...

Приложите файл журнала после воспроизведения ошибки.

Если вы не можете сгенерировать файл журнала, попробуйте открыть окно "Debug output"(Вывод отладки) (из меню "View"(Вид) -> "Ide Internals"(Внутреннее состояние IDE)). Вы должны открыть его перед запуском приложения (по F9). А затем запустите ваше приложение. После возникновения ошибки скопируйте, заархивируйте и прикрепите содержимое окна "Debug output"(Вывод отладки).

Тестовые запуски

Если вы используете другую версию GDB, вы можете запустить тестовый пример. Обратите внимание, что не все тесты имеют правильные ожидания для каждой возможной установки. Поэтому некоторые тесты могут не работать на некоторых системах.

Тест отладчика находится в каталоге:

  • Lazarus 1.2.x: debugger\test\Gdbmi\
  • Lazarus 1.3 и выше: components\lazdebuggergdbmi\test\

В приведенном ниже пути используется v.1.3. Если используется 1.2.x, замените его соответствующим образом.


Одноразовая настройка

Создайте каталог components\lazdebuggergdbmi\test\Logs: Необязательно, но помогает хранить результат теста в одном месте

Создайте конфигурационные файлы: В каталоге components\lazdebuggergdbmi\test\

copy fpclist.txt.sample to fpclist.txt
copy gdblist.txt.sample to gdblist.txt

откройте 2 текстовых файла и отредактируйте путь к fpc/gdb, а также отредактируйте версию (тест может запускать разные тесты для разных версий). Можно указать более одного GDB/FPC


Запуск теста
  • Откройте проект: components\lazdebuggergdbmi\test\TestGdbmi.lpi
  • Только для Lazarus 1.2.x: пересоберите IDE с опцией "Clean"(Очистить) (Меню "Tools"(Сервис) --> "Configure build Lazarus"(Параметры сборки Lazarus) --> снять галочку с "Restart after building IDE"(Перезапускать после сборки IDE)). Если это пропущено, компиляция проекта может завершиться неудачно. Если компиляция не удалась, ВСЕ *.ppu/*.o файлы в [папке] lazdebuggergdbmi\test должны быть удалены вручную.
  • Запустите проект (если тест не прошел, возможно, вам придется удалить файлы *.exe в components\lazdebuggergdbmi\test\TestApps)

Ссылки

Внешние ссылки

Экспериментальные отладчики в Паскале

Это работа в процессе:

Связанные темы форума