Непонятно, что именно вы спрашиваете, поскольку адрес машинной инструкции и номер строки исходного кода напрямую не связаны.Возможно, в соответствии с вашими потребностями стоит использовать смешанный источник / разборка.Например:
(gdb) disassemble /m main
Dump of assembler code for function main:
5 {
0x08048330 <+0>: push %ebp
0x08048331 <+1>: mov %esp,%ebp
0x08048333 <+3>: sub $0x8,%esp
0x08048336 <+6>: and $0xfffffff0,%esp
0x08048339 <+9>: sub $0x10,%esp
6 printf ("Hello.\n");
0x0804833c <+12>: movl $0x8048440,(%esp)
0x08048343 <+19>: call 0x8048284 <puts@plt>
7 return 0;
8 }
0x08048348 <+24>: mov $0x0,%eax
0x0804834d <+29>: leave
0x0804834e <+30>: ret
End of assembler dump.
Здесь показана каждая строка исходного кода перед разборкой машинного кода, связанной с ним.Отображаются как номера строк источника, так и адреса команд и смещения.Обратите внимание, что, вероятно, будет гораздо менее понятным, если вы применяете оптимизацию, так как часто код удаляется или переупорядочивается так, что он больше не имеет прямого соответствия порядку исходного кода.
Если вы хотите показатьтекущий адрес счетчика программы / смещение при шаге, тогда это можно сделать с помощью команды display /i $pc
:
(gdb) display /i $pc
(gdb) run
Starting program: /home/a.out
Breakpoint 2, main () at main.c:13
13 printf("Hello World");
1: x/i $pc
=> 0x40053a <main+4>: mov $0x4005d4,%edi
(gdb) step
__printf (format=0x4005d4 "Hello World") at printf.c:28
28 printf.c: No such file or directory.
1: x/i $pc
=> 0x7ffff7a686b0 <__printf>: sub $0xd8,%rsp
(gdb)