Проблема отладки NASM DWARF с gdb

Вопрос или проблема

Я столкнулся с проблемой при отладке кода сборки NASM с использованием gdb. Сообщение об ошибке, которое я получаю:

(gdb) print num 
'num' имеет неизвестный тип; приведите его к объявленному типу 
(gdb) print &num 
$1 = (<переменная данных, нет отладочной информации> *) 0x402000 <num>

Однако, когда я привожу переменную к типу, я получаю правильное значение:

(gdb) print (short)num 
$2 = 5

Вот детали моей конфигурации:

Версия NASM: 2.16.01

Версия GNU ld: 2.42

Версия GNU gdb: 15.0.50.20240403-0ubuntu1

Операционная система: Ubuntu 24.04.1 LTS

фрагмент кода

section .data
    num: dd 5  ; Объявляем переменную двойного слова (32-бит)

section .text
    global _start

_start:
    ; Перемещаем значение 123 в регистр EAX
    mov eax, 123
    ; Сохраняем значение EAX в памяти по метке 'num'
    mov [num], eax

    ; Завершаем программу
    mov ebx, 0
    mov eax, 1
    int 0x80

Я выполнил эти шаги, чтобы сгенерировать и связать отладочную информацию DWARF:

Сборка с отладочной информацией DWARF:

nasm -f elf64 -F dwarf -g -o main.o main.asm
ld -m elf_x86_64 -g -o main

Тем не менее, gdb по-прежнему не может определить тип переменной num. Вот соответствующий раздел отладочной информации DWARF из objdump:

main.o:     формат файла elf64-x86-64

Содержимое раздела .debug_info:

  Единица компиляции @ смещение 0:
   Длина:        0x5b (32-бит)
   Версия:       3
   Смещение аббревиатуры: 0
   Размер указателя:  8
 <0><b>: Номер аббревиатуры: 1 (DW_TAG_compile_unit)
    <c>   DW_AT_low_pc      : 0
    <14>   DW_AT_high_pc     : 0x18
    <1c>   DW_AT_stmt_list   : 0
    <20>   DW_AT_name        : main.asm
    <29>   DW_AT_comp_dir    : /home/userName/assembly/
    <3e>   DW_AT_producer    : NASM 2.16.01
    <4b>   DW_AT_language    : 32769    (ассемблер MIPS)
 <1><4d>: Номер аббревиатуры: 2 (DW_TAG_subprogram)
    <4e>   DW_AT_low_pc      : 0
    <56>   DW_AT_frame_base  : 0 (список местоположений)
 <1><5a>: Номер аббревиатуры: 0

Кто-нибудь еще сталкивался с этой проблемой? Есть ли дополнительные шаги или конфигурации, которые я мог пропустить? Любая помощь будет очень признательна!

Спасибо!

Ответ или решение

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

Описание Проблемы

Вы получаете сообщение об ошибке от GDB, которое говорит о том, что переменная num имеет неизвестный тип. При этом, когда вы явно приводите значение num к типу short, отладчик успешно отображает ожидаемое значение. Основные команды, которые вы выполняете, включают:

print num
print (short)num

Это указывает на то, что GDB может видеть значение переменной, но не распознает её тип из-за недостаточной информации в отладочных данных.

Возможные Причины Проблемы

  1. Отсутствие DWARF информации: Похоже, что сгенерированная DWARF информация не соответствует ожиданиям для переменной num. Исходя из выводов objdump, в секции .debug_info не содержится необходимой информации для описания ваших данных.

  2. Неправильные флаги сборки: Несмотря на использование флагов, генерирующих отладочную информацию, возможно, что они не соответствуют архитектуре или типу используемого кода. Важно удостовериться, что флаги и параметры компиляции корректны.

Рекомендации по Решению Проблемы

  1. Корректировка команд сборки:

    • Убедитесь, что вы используете правильные флаги при сборке. Например, для 64-битного кода используйте -f elf64. Ваши команды сборки выглядят правильно, но стоит проверить совместимость версии NASM с используемыми флагами.

    Попробуйте использовать следующую команду для ассемблирования:

    nasm -f elf64 -g -F dwarf -o main.o main.asm
  2. Изменение типа данных: Если вы просто хотите, чтобы GDB распознавал переменные, возможно, стоит рассмотреть вариант использования других определения типа при создании переменных. Например, можно попробовать dq (для 64-бит) или указать более конкретные типы.

  3. Проверка версий инструментов: Вы используете NASM версии 2.16.01 и GDB версии 15.0.50.20240403. Убедитесь, что эти версии работают совместно. Иногда обновление до более свежей версии может решить проблемы с отладкой и совместимостью.

  4. Создание минимального примера: Попробуйте создать минимальный код, который послужит простым примером для тестирования. Иногда выявление проблемы через упрощение кода помогает быстрее её решить.

  5. Использование другой отладочной информации: В случае, если проблема продолжает сохраняться, можно попробовать другие инструменты, такие как lldb, для тестирования и диагностики.

Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...