Как запустить отладчик на сборке - PullRequest
0 голосов
/ 09 октября 2019

У меня есть следующая программа, max.s, которая находит максимум списка чисел:

$ as max.s -g -o max.o && ld max.o -g -o max && ./max
ubuntu$ echo $?
222

Код программы следующий:

.section .data
data_items:
    .long 2,45,222,22,11,22,33,44,5,0   

.section .text

.globl _start
_start:
    movl $0, %edi                   
    movl data_items(,%edi,4), %eax  
    movl %eax, %ebx                 

start_loop:
    cmpl $0, %eax                   
    je loop_exit                    
    incl %edi                       
    movl data_items(,%edi,4), %eax  
    cmpl %ebx, %eax                 
    jle start_loop                  
    movl %eax, %ebx                 
    jmp start_loop                  

loop_exit:
    movl $1, %eax                   
    int $0x80                       

Как правильно запустить gdb в этой программе? Другими словами:

  1. Буду ли я запускать gdb max.s или gdb max.o или gdb max?
  2. Если я наберу "layout src", будет написано "Источник недоступен",Однако, если я тогда наберу l и снова наберу layout src, он покажет источник. Почему это так?

enter image description here

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Запустил бы я gdb max.s или gdb max.o или gdb max?

Попробуйте? Фактически сработает только последняя команда.

Для отладки программы вам нужна программа, которая может работать. Поскольку ни max.s, ни max.o не являются работоспособными , попытка их отладки приведет к некоторой ошибке, когда GDB попытается execve(2) данной программы.

Для max.s, вы также, вероятно, получите сообщение от GDB о том, что он не понимает, что делать с этим файлом.

Если я наберу «layout src», он скажет «No Source Available»,Однако, если я тогда наберу l и снова выполню layout src, он покажет источник. Почему это так?

Эту часть я не знаю. Это может быть ошибка в GDB TUI.

0 голосов
/ 09 октября 2019

Если я наберу «layout src», он скажет «Нет доступного источника»

Вы всегда можете использовать layout reg, чтобы показать регистры + разборка . Тогда вам не нужно заботиться о вашем ассемблере + компоновщике, включая номера строк, только символы для ваших меток. (Символы помогают GDB знать, с чего начать разборку, когда вы остановились на инструкции, которая не является первой после метки. Машинный код x86 не может быть однозначно декодирован назад).

Единственная причина, по которой выВы хотите, чтобы исходные строки видели ваши комментарии, но обычно у вас есть редактор в другом окне, и для небольшого цикла или блока вы знаете, что вы ожидаете. Эти комментарии позволят вам быстрее представить эту картинку в голову, когда вы какое-то время отсутствовали в коде, а не так много, когда вы только что написали / все еще работаете над ней. Но если вам нужно напоминание о том, что должно быть в каком регистре в определенный момент, вы можете просто перейти к источнику в вашем редакторе.

Разборка часто более полезна, чем источник. И это исключает классы ошибок, такие как макроопределение, которое не работает так, как вы думали, или опечатка, которая становится очевидной после сборки + разборки.

Использование si и ni для одношаговогоинструкциями, а не исходными строками.

b *0x1234 устанавливает точку останова по числовому адресу (который вы можете скопировать / вставить из разборки), или просто пошагово туда, где вы хотите установить точку останова и использовать b Там.


См. также нижнюю часть тега x86 вики для получения дополнительных советов по отладке asm. Особенно используйте strace для любого кода, который выполняет системные вызовы.


as max.s -g -o max.o && ld max.o -g -o max

Вы можете сделать это одной командой: gcc -nostdlib -static -g max.s -o max. Вы можете или не можете найти это проще. Но если у вас есть что-то, что может быть собрано как 32- или 64-битное, удобно добавить один -m32 вместо добавления различных опций для as и ld. Или, если вы хотите вызвать ту же команду и использовать ее в другом исходном файле, max.s появляется только один раз. Самым большим преимуществом является то, что если вы хотите написать тестовый набор C для вашей функции asm, gcc -no-pie -fno-pie foo.c foo.S Just Works.

(лично я обычно пропускаю часть -o max и просто отлаживаю gdb ./a.out. Но этоможно перепутать, из какого источника получен ваш a.out.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...