GDB-адрес разрыва отличается, когда break (имя функции) / break *(имя функции)
#include <stdio.h>
int main(void){
int sum = 0;
sum += 0xabcd;
printf(“%x”, sum);
return 0;
}
Это мой код, и когда я использую GDB, я могу найти другой адрес, когда прервать main / break *main.
Когда я просто набираю дизассемблирование main, это выглядит так:
Dump of assembler code for function main:
0x080483c4 <+0>: push %ebp
0x080483c5 <+1>: mov %esp,%ebp
0x080483c7 <+3>: and $0xfffffff0,%esp
0x080483ca <+6>: sub $0x20,%esp
0x080483cd <+9>: movl $0x0,0x1c(%esp)
0x080483d5 <+17>:addl $0xabcd,0x1c(%esp)
0x080483dd <+25>:mov $0x80484c0,%eax
0x080483e2 <+30>:mov 0x1c(%esp),%edx
0x080483e6 <+34>:mov %edx,0x4(%esp)
0x080483ea <+38>:mov %eax,(%esp)
0x080483ed <+41>:call 0x80482f4 <printf@plt>
0x080483f2 <+46>:mov $0x0,%eax
0x080483f7 <+51>:leave
0x080483f8 <+52>:ret
End of assembler dump.
Поэтому, когда я набираю [break *main], он начинает 0x080483c4, но набирает [break main], он начинает 0x080483cd
Почему начальный адрес отличается?
2 ответа
Почему адрес отличается.
Так как break function
а также break *address
не одно и то же(*address
указывает адрес первой инструкции функции до того, как будут установлены кадр стека и аргументы).
В первом случае GDB пропускает функцию пролога (настройка текущего кадра).
Полное предположение - и готов быть полностью неправым.
* основной, если адрес функции
Разрыв внутри main - это первый доступный адрес, который останавливается внутри функции, когда она выполняется.
Обратите внимание, что 0x080483cd - это первое место, которое может остановить отладчик при изменении переменной (т. Е. Присвоение нуля сумме)
Когда вы ломаетесь в 0x080483c4, это перед сборщиком установки, о котором C ничего не знает