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 ничего не знает

Другие вопросы по тегам