GDB

Рассмотрим код

;Точка входа "_start" на самом деле находится ;в подключаемом *.o файле стандартной библиотеки Си ;Она передает управление на функцию "main", ;которая должна находиться в нашей программе global main ;Сегмент кода: section .text ;Функция main: main: mov rax,6 mov rbx,3 add rax,rbx the_end: mov rax,1 int 0x80 ret

Ассемблируем и собираем программу:

user@host ~/asm/example $ nasm -felf64 example.s -g user@host ~/asm/example $ gcc example.o -o example -g user@host ~/asm/example $

Запускаем gdb:

user@host ~/asm/example $ gdb ./example GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08 Copyright (C) 2011 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 "x86_64-linux-gnu". For bug reporting instructions, please see: <http://bugs.launchpad.net/gdb-linaro/>... Reading symbols from /home/user/asm/example/example...done. (gdb)

Устанавливаем точки останова:

(gdb) b main
Breakpoint 1 at 0x4004c0
(gdb) b the_end
Breakpoint 2 at 0x4004d7
(gdb)

Далее можно использовать следующие команды:

r – выполнение до точки останова

n – пошаговое выполнение

p $rax – показать содержимое регистра rax

info registers – показать информацию обо всех регистрах

Кроме регистров у нас есть память, и частный случай памяти — стек. Как их посмотреть? Команда x/формат адрес отображает содержимое памяти, расположенной по адресу в заданном формате. Формат это (в таком порядке) количество элементов, буква формата, и размер элемента. Буквы формата: o(octal), x(hex), d(decimal), u(unsigned decimal), t(binary), f(float), a(address), i(instruction), c(char) and s(string). Размер: b(byte), h(halfword), w(word), g(giant, 8 bytes).