Вы, вероятно, используете nexti
или next
, что делает более вызовами, а не на них.
Установите точку останова на mov rdi, 12
внутри вашей функции или на один шаг на вызовы, используя stepi
(или si
для краткости).
Или, если вы не доверяете GDB, напишите программу, состояние выхода которой зависит от того, выполняется функция или нет.
testFunctionName:
mov ebx, 12
ret
_start:
xor ebx, ebx ; ebx=0
call testFunctionName
mov eax, 1
int 0x80 ; sys_exit(ebx), 32-bit ABI
Запустите это и echo $?
, чтобы увидеть, что состояние выхода равно 12, а не 0, потому что функция выполняет , если не работает ваш ЦП, не работает NASM или компоновщик.
Вы также можете поместить недопустимую инструкцию в вашу тестовую функцию, например ud2
. Или программная точка останова: int3
. Или делить на ноль. Что-то, что вызовет исключение вместо того, чтобы позволить вашему процессу сделать системный вызов выхода. Тогда вы точно заметите, называется он или нет.
См. Также Что произойдет, если вы используете 32-битный int 0x80 Linux ABI в 64-битном коде? Чтобы сделать собственный 64-битный системный вызов exit (0) таким же образом, как у glibc _exit()
Функция делает,
xor edi, edi ; rdi=0
mov eax, 231 ; __NR_exit_group from <asm/unistd_64.h>
syscall ; sys_exit_group(edi)