Как отладить собранную программу? - PullRequest
1 голос
/ 09 сентября 2010

У меня есть программа, написанная на ассемблере, которая вылетает из-за ошибки сегментации. (Код не имеет значения, но здесь .)

У меня вопрос, как отладить программу на ассемблере с помощью GDB?

Когда я пытаюсь запустить его в GDB и выполнить возврат, я не получаю значимой информации. (Только шестнадцатеричные смещения.)

Как мне отладить программу?

(кстати, я использую NASM в Ubuntu, если это как-то помогает)

Ответы [ 2 ]

2 голосов
/ 09 сентября 2010

Я бы просто загрузил его прямо в gdb и пошагово выполнял инструкцию по инструкции, следя за ходом всех регистров и содержимого памяти.

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

Что касается конкретной проблемы (код перефразирован ниже):

        extern   printf

        SECTION  .data
format: db       "%d",0

        SECTION  .bss
v_0:    resb      4

        SECTION  .text
        global main
main:
        push      5
        pop       eax
        mov       [v_0], eax
        mov       eax, v_0
        push      eax
        call      printf

Вы, кажется, просто нажимаете5 в стек, за которым следует адрес 5 в памяти (v_0).Я почти уверен, что вам нужно будет нажать адрес строки формата в какой-то момент, если вы хотите вызвать printf.Не будь любезен, если тебе дадут мошенническую строку формата.

Вполне вероятно, что твое:

mov eax, v_0

должно быть:

mov eax, format

и я 'm при условии , что после этого вызова к printf появилось больше кода, который вы просто остановили как неважный (иначе вы вернетесь, чтобы никогда не приземлиться, когда он вернется).

1 голос
/ 09 сентября 2010

Вы по-прежнему сможете собираться с маркерами Stabs при связывании кода (с gcc).

Я рекомендую использовать YASM и сборку с -dstabs, опции:

$ yasm -felf64 -mamd64 -dstabs file.asm

Вот как я собираю свои программы сборки.

Код NASM и YASM по большей части взаимозаменяемы (YASM имеет некоторые расширения, которых нет в NASM, но каждый код NASM хорошо собран сYASM).

Я использую gcc, чтобы связать мои собранные объектные файлы вместе или во время компиляции с кодом C или C ++.При использовании gcc я использую -gstabs+ для компиляции с маркерами отладки.

...