Я работаю над обновлением моей сборки gdb до более поздней версии, и (на удивление) тестирование с использованием тривиальной программы завершается неудачей.
#include <stdio.h>
int main()
{
int a;
for ( a = 10; a < 20; a = a + 1) {
printf("value of a: %d\n", a);
printf("another value of a: %d\n", a);
}
return 0;
}
Сессия GDB
[root@localhost ~]# gcc -g main.c
[root@localhost ~]# gdb a.out
GNU gdb (GDB) 7.12.1
Copyright (C) 2017 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-redhat-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.out...done.
(gdb) l
1 #include <stdio.h>
2
3 int main()
4 {
5 int a;
6 for ( a = 10; a < 20; a = a + 1) {
7 printf("value of a: %d\n", a);
8 printf("another value of a: %d\n", a);
9 }
10 return 0;
(gdb) b 8
Breakpoint 1 at 0x4004ed: file main.c, line 8.
(gdb) r
Starting program: /root/a.out
value of a: 10
another value of a: 15
value of a: 11
another value of a: 15
value of a: 12
another value of a: 15
value of a: 13
another value of a: 15
value of a: 14
another value of a: 15
value of a: 15
another value of a: 15
value of a: 16
another value of a: 15
value of a: 17
another value of a: 15
value of a: 18
another value of a: 15
value of a: 19
another value of a: 15
[Inferior 1 (process 6083) exited normally]
(gdb)
Как вы можете сказать, точка останова, которую я помещаю в строку 8 , никогда не срабатывает.Что дает?Это похоже на то, что таблица символов не синхронизирована с реальным стеком или чем-то в этом роде.
Есть идеи, какие флаги нужно установить?Точки останова работают, если я использую более старую сборку GDB из CentOS 6, но неясно, почему новая сборка будет другой.
This GDB was configured as follows:
configure --host=x86_64-redhat-linux-gnu --target=x86_64-redhat-linux-gnu
--with-auto-load-dir=$debugdir:$datadir/auto-load
--with-auto-load-safe-path=$debugdir:$datadir/auto-load
--with-expat
--with-gdb-datadir=/usr/share/gdb (relocatable)
--with-jit-reader-dir=/usr/lib64/gdb (relocatable)
--without-libunwind-ia64
--without-lzma
--with-python=/usr (relocatable)
--without-guile
--with-separate-debug-dir=/usr/lib64/debug (relocatable)
--without-babeltrace
disas main
Dump of assembler code for function main:
0x00000000004004c8 <+0>: push %rbp
0x00000000004004c9 <+1>: mov %rsp,%rbp
0x00000000004004cc <+4>: sub $0x10,%rsp
0x00000000004004d0 <+8>: movl $0xa,-0x4(%rbp)
0x00000000004004d7 <+15>: jmp 0x400505 <main+61>
0x00000000004004d9 <+17>: mov -0x4(%rbp),%eax
0x00000000004004dc <+20>: mov %eax,%esi
0x00000000004004de <+22>: mov $0x4005d8,%edi
0x00000000004004e3 <+27>: mov $0x0,%eax
0x00000000004004e8 <+32>: callq 0x4003b0 <printf@plt>
0x00000000004004ed <+37>: mov -0x4(%rbp),%eax
0x00000000004004f0 <+40>: mov %eax,%esi
0x00000000004004f2 <+42>: mov $0x4005e8,%edi
0x00000000004004f7 <+47>: mov $0x0,%eax
0x00000000004004fc <+52>: callq 0x4003b0 <printf@plt>
0x0000000000400501 <+57>: addl $0x1,-0x4(%rbp)
0x0000000000400505 <+61>: cmpl $0x13,-0x4(%rbp)
0x0000000000400509 <+65>: jle 0x4004d9 <main+17>
0x000000000040050b <+67>: mov $0x0,%eax
0x0000000000400510 <+72>: leaveq
0x0000000000400511 <+73>: retq
End of assembler dump.
objdump
00000000004004c8 <main>:
4004c8: 55 push %rbp
4004c9: 48 89 e5 mov %rsp,%rbp
4004cc: 48 83 ec 10 sub $0x10,%rsp
4004d0: c7 45 fc 0a 00 00 00 movl $0xa,-0x4(%rbp)
4004d7: eb 2c jmp 400505 <main+0x3d>
4004d9: 8b 45 fc mov -0x4(%rbp),%eax
4004dc: 89 c6 mov %eax,%esi
4004de: bf d8 05 40 00 mov $0x4005d8,%edi
4004e3: b8 00 00 00 00 mov $0x0,%eax
4004e8: e8 c3 fe ff ff callq 4003b0 <printf@plt>
4004ed: 8b 45 fc mov -0x4(%rbp),%eax
4004f0: 89 c6 mov %eax,%esi
4004f2: bf e8 05 40 00 mov $0x4005e8,%edi
4004f7: b8 00 00 00 00 mov $0x0,%eax
4004fc: e8 af fe ff ff callq 4003b0 <printf@plt>
400501: 83 45 fc 01 addl $0x1,-0x4(%rbp)
400505: 83 7d fc 13 cmpl $0x13,-0x4(%rbp)
400509: 7e ce jle 4004d9 <main+0x11>
40050b: b8 00 00 00 00 mov $0x0,%eax
400510: c9 leaveq
400511: c3 retq
400512: 90 nop
400513: 90 nop
400514: 90 nop
400515: 90 nop
400516: 90 nop
400517: 90 nop
400518: 90 nop
400519: 90 nop
40051a: 90 nop
40051b: 90 nop
40051c: 90 nop
40051d: 90 nop
40051e: 90 nop
40051f: 90 nop
Информация о версии GCC: gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)
Выход за пределы gdb:
[root@localhost ~]# ./a.out
value of a: 10
another value of a: 10
value of a: 11
another value of a: 11
value of a: 12
another value of a: 12
value of a: 13
another value of a: 13
value of a: 14
another value of a: 14
value of a: 15
another value of a: 15
value of a: 16
another value of a: 16
value of a: 17
another value of a: 17
value of a: 18
another value of a: 18
value of a: 19
another value of a: 19
Установка точки останова на главном не срабатывает, но вывод становится (как-то) даже страннее:
[root@localhost ~]# gdb a.out
GNU gdb (GDB) 7.12.1
Copyright (C) 2017 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-redhat-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.out...done.
(gdb) b main
Breakpoint 1 at 0x4004d0: file main.c, line 6.
(gdb) r
Starting program: /root/a.out
value of a: 0
another value of a: 0
value of a: 1
another value of a: 1
value of a: 2
another value of a: 2
value of a: 3
another value of a: 3
value of a: 4
another value of a: 4
value of a: 5
another value of a: 5
value of a: 6
another value of a: 6
value of a: 7
another value of a: 7
value of a: 8
another value of a: 8
value of a: 9
another value of a: 9
value of a: 10
another value of a: 10
value of a: 11
another value of a: 11
value of a: 12
another value of a: 12
value of a: 13
another value of a: 13
value of a: 14
another value of a: 14
value of a: 15
another value of a: 15
value of a: 16
another value of a: 16
value of a: 17
another value of a: 17
value of a: 18
another value of a: 18
value of a: 19
another value of a: 19
[Inferior 1 (process 2484) exited normally]
Установка точки останова на правильном адресе работает, но запускает SIGILLпри продолжении:
[root@localhost ~]# gdb a.out
GNU gdb (GDB) 7.12.1
Copyright (C) 2017 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-redhat-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.out...done.
(gdb) disas main
Dump of assembler code for function main:
0x00000000004004c8 <+0>: push %rbp
0x00000000004004c9 <+1>: mov %rsp,%rbp
0x00000000004004cc <+4>: sub $0x10,%rsp
0x00000000004004d0 <+8>: movl $0xa,-0x4(%rbp)
0x00000000004004d7 <+15>: jmp 0x400505 <main+61>
0x00000000004004d9 <+17>: mov -0x4(%rbp),%eax
0x00000000004004dc <+20>: mov %eax,%esi
0x00000000004004de <+22>: mov $0x4005d8,%edi
0x00000000004004e3 <+27>: mov $0x0,%eax
0x00000000004004e8 <+32>: callq 0x4003b0 <printf@plt>
0x00000000004004ed <+37>: mov -0x4(%rbp),%eax
0x00000000004004f0 <+40>: mov %eax,%esi
0x00000000004004f2 <+42>: mov $0x4005e8,%edi
0x00000000004004f7 <+47>: mov $0x0,%eax
0x00000000004004fc <+52>: callq 0x4003b0 <printf@plt>
0x0000000000400501 <+57>: addl $0x1,-0x4(%rbp)
0x0000000000400505 <+61>: cmpl $0x13,-0x4(%rbp)
0x0000000000400509 <+65>: jle 0x4004d9 <main+17>
0x000000000040050b <+67>: mov $0x0,%eax
0x0000000000400510 <+72>: leaveq
0x0000000000400511 <+73>: retq
End of assembler dump.
(gdb) b *0x00000000004004fc
Breakpoint 1 at 0x4004fc: file main.c, line 8.
(gdb) r
Starting program: /root/a.out
value of a: 10
Program received signal SIGILL, Illegal instruction.
0x00000000004004fe in main () at main.c:8
8 printf("another value of a: %d\n", a);
(gdb) print {a}
$1 = {10}
(gdb) c
Continuing.
Program terminated with signal SIGILL, Illegal instruction.
The program no longer exists.
Точки останова на main вызывают еще более странное поведение:
(gdb) break main
Breakpoint 1 at 0x40113f: file main.c, line 6.
(gdb) run
Starting program: /root/gcc731-updated-binutils-a.out
value of a: 0
another value of a: 0
value of a: 1
another value of a: 1
value of a: 2
another value of a: 2
value of a: 3
another value of a: 3
value of a: 4
another value of a: 4
value of a: 5
another value of a: 5
value of a: 6
another value of a: 6
value of a: 7
another value of a: 7
value of a: 8
another value of a: 8
value of a: 9
another value of a: 9
value of a: 10
another value of a: 10
value of a: 11
another value of a: 11
value of a: 12
another value of a: 12
value of a: 13
another value of a: 13
value of a: 14
another value of a: 14
value of a: 15
another value of a: 15
value of a: 16
another value of a: 16
value of a: 17
another value of a: 17
value of a: 18
another value of a: 18
value of a: 19
another value of a: 19
[Inferior 1 (process 1275) exited normally]