Linux (64-разрядная версия), nasm и gdb - PullRequest
3 голосов
/ 18 сентября 2011

Я искал другие темы, но безуспешно. Моя проблема, возможно, проста, но расстраивает меня. Я собираю два файла на 64-битной Ubuntu 11.04:

  1. nasm -f elf64 -g file64.asm
  2. gcc -g -o file file.c file64.o

И я отлаживаю полученный исполняемый файл с помощью gdb. С C-частью все в порядке, но исходный код на ассемблере «не виден» отладчику. Я получаю вывод как:

(gdb) step
Single stepping until exit from function line,
which has no line number information.
0x0000000000400962 in convert ()

Мое быстрое расследование с:

objdump --source file64.o

показывает, что исходный код сборки (и информация о строке) содержится в файле.

Почему я не вижу его в сеансе отладки? Что я делаю не так? Надо сказать, что эти проблемы возникли после перехода на 64-битную Ubuntu. В 32-битном Linux это работает (как и должно быть). Это просто забавно для меня, но в любом случае очень расстраивает.

Ответы [ 4 ]

2 голосов
/ 21 июня 2013

С NASM у меня гораздо лучший опыт работы с gdb при использовании формата отладки dwarf. Затем GDB обрабатывает исходный код сборки, как если бы это был какой-либо другой язык (т. е. команды дизассемблирования не нужны)

nasm -f elf64 -g -F dwarf file64.asm

(версии 2.03.01 и более поздние автоматически включают -g, если указано -F.)

Я использую NASM версии 2.10.07. Я не уверен, имеет ли это значение или нет.

1 голос
/ 24 апреля 2014

Для всех, кто застрял в NASM с ошибками (ошибка пока не устранена): просто загрузите репозиторий git NASM и переключитесь на версию 2.7, которая, вероятно, является последней версией, которая работает нормально, т.е. поддерживает gdb.Сборка из исходного кода этой устаревшей версии - это только обходной путь (например, у вас нет поддержки последнего ISA), но этого достаточно для большинства студентов.

1 голос
/ 21 сентября 2011

GDB является отладчиком исходного (или символического) уровня, что означает, что предполагается для работы с «языками программирования высокого уровня» ... что не так!

Но подождите секунду, потому что, с точки зрения отладчика, отладка программ ASM намного проще, чем языки более высокого уровня: делать практически нечего! Двоичный файл программы всегда содержит инструкцию по сборке, там просто написано в машинном формате, а не в формате ascii.

И у GDB есть возможность конвертировать его для вас. Вместо выполнения list для просмотра кода используйте disassemble для просмотра кода функции:

(gdb) disassemble <your symbol>
Dump of assembler code for function <your symbol>:
   0x000000000040051e <+0>: push   %rbp
   0x000000000040051f <+1>: mov    %rsp,%rbp
=> 0x0000000000400522 <+4>: mov    0x20042f(%rip),%rax        
   0x0000000000400529 <+11>:    mov    %rax,%rdx
   0x000000000040052c <+14>:    mov    $0x400678,%eax
   0x0000000000400531 <+19>:    mov    %rdx,%rcx

или x/5i $pc, чтобы увидеть 5 i инструкцию после $ pc

(gdb) x/5i $pc
=> 0x400522 <main+4>:   mov    0x20042f(%rip),%rax
   0x400529 <main+11>:  mov    %rax,%rdx
   0x40052c <main+14>:  mov    $0x400678,%eax
   0x400531 <main+19>:  mov    %rdx,%rcx
   0x400534 <main+22>:  mov    $0xc,%edx

затем используйте stepi (si) instread из step и nexti (ni) вместо next.

display $pc также может быть полезно для печати текущего pc всякий раз, когда нижний останавливается (т. Е. После каждого nexti / stepi.

0 голосов
/ 23 октября 2011

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

...