Как заставить gdb работать с программами D под Linux?

У меня есть пропатченная версия gdb 6.8, но я не могу заставить работать отладку. Учитывая этот тестовый файл:

import std.stdio;

void main()
{
    float f = 3.0;
    int i = 1;
    writeln(f, " ", i);
    f += cast(float)(i / 10.0);
    writeln(f, " ", i);
    i++;
    f += cast(float)(i / 10.0);
    writeln(f, " ", i);
    i += 2;
    f += cast(float)(i / 5.0);
    writeln(f, " ", i);
}

И попытка отладки в командной строке:

bash-4.0 [d]$ dmd -g test.d  # '-gc' shows the same behaviour.
bash-4.0 [d]$ ~/src/gdb-6.8/gdb/gdb test
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...
(gdb) list
1 ../sysdeps/i386/elf/start.S: No such file or directory.
 in ../sysdeps/i386/elf/start.S

И отладка проекта с Eclipse

Использование -gc:

Dwarf Error: Cannot find DIE at 0x134e4 referenced from DIE at 0x12bd4 [in module /home/bernard/projects/drl/drl.i386]
(gdb) Dwarf Error: Cannot find DIE at 0x1810 referenced from DIE at 0x1b8 [in module /home/bernard/projects/drl/drl.i386]

Использование -g:

(gdb) Die: DW_TAG_<unknown> (abbrev = 7, offset = 567)
 has children: FALSE
 attributes:
  DW_AT_byte_size (DW_FORM_data1) constant: 4
  DW_AT_type (DW_FORM_ref4) constant ref: 561 (adjusted)
  DW_AT_containing_type (DW_FORM_ref4) constant ref: 539 (adjusted)
Dwarf Error: Cannot find type of die [in module /home/bernard/projects/drl/drl.i386]

Я видел довольно много подобных сообщений в группе новостей Digital Mars, но, похоже, все они были проигнорированы. Кто-нибудь может пролить свет на ситуацию?

Я знаю о ZeroBUGS, но очень хочу, чтобы gdb заработало.

Обновление:

Благодаря luca_ в IRC (freenode, #D) у меня работает простой кейс (один файл):

(gdb) list Dmain
1 void main()
2 {
3     float f = 3.0;
4     int i = 1;
5     f += cast(float)(i / 10.0);
6     i++;
7     f += cast(float)(i / 10.0);
8     i += 2;
9     f += cast(float)(i / 5.0);
10 }
(gdb) break  3

К сожалению, мой проект, состоящий из нескольких файлов, умирает с ошибкой DWARF.

РЕДАКТИРОВАТЬ:

Начиная с версии 2.036 (я думаю), отладочная информация GDB, созданная DMD, верна и должна работать так, как ожидалось.


person Bernard    schedule 17.10.2009    source источник


Ответы (2)


Возможно, вы наткнулись на ошибку GDB, которая недавно была исправлена ​​здесь.

Чтобы получить исправление, вам нужно собрать GDB из CVS Head. Инструкции по его получению находятся здесь.

Если это не решит проблему, это может быть связано с другой ошибкой в ​​GDB или может быть из-за того, что dmd выдает неверную DWARF информацию об отладке. Я предлагаю открыть ошибку в GDB bugzilla и прикрепить к ней небольшой исполняемый файл (и все требуемые библиотеки времени выполнения).

person Employed Russian    schedule 17.10.2009
comment
К сожалению, CVS Head имеет те же проблемы. Это: d.puremagic.com/issues/show_bug.cgi?id=1079 заставляет меня думать, что это может быть проблема с gdb. Тем не менее, ZeroBUGS работает (или работал - он не будет работать на этой машине (и, кроме того, Descent не поддерживает его, поэтому хочет, чтобы gdb работал)), так что это все равно может быть gdb. Возможно, мне придется изучить DWARF, dmd и gdb и посмотреть, что я могу сделать. Никакая отладка не укусит большой. Я даже не могу получить трассировку стека (если мне повезет, может появиться самая верхняя функция)! Спасибо за информацию. Дает мне больше мест для поиска. - person Bernard; 18.10.2009

Похоже, что ответ заключается в использовании GDC, если вы готовы вернуться к D 2.015 (это для D2, понятия не имею, сколько лет D1). ГБД работает отлично.

person Bernard    schedule 23.11.2009