В GDB я пытаюсь установить точку останова в строке 4, но он всегда ставит точку останова в строке 5. Даже если я ставлю точку останова main, она ставит точку в строке 5, тогда как строка 4 является первой строкой. Почему и как я могу это исправить?
В моем каталоге coding
есть файл main.c
со следующим содержимым:
#include <stdio.h>
int main() {
int i; // line 4
for (i = 0; i < 10; i++) {
printf("Hello world!\n");
}
return 0;
}
Теперь я скомпилировал его с помощью gcc для архитектуры x86 и добавил дополнительную информацию для отладки...
gcc -m32 -g main.c
И я использую GDB для проверки a.out:
gdb -q ./a.out
И когда я ставлю break main
, он устанавливает точку останова в строке 5, строке for (i = 0; i < 10; i++) {
. Даже если я явно поставлю точку останова в строке 4 с помощью break 4
, точка останова все равно будет установлена в строке 5 с помощью кода for (i = 0; i < 10; i++) {
. Вот пример:
$ gdb -q a.out
Reading symbols from a.out...
(gdb) break 4
Breakpoint 1 at 0x11aa: file main.c, line 5.
(gdb)
Почему здесь не устанавливается точка останова в строке 4? В чем может быть причина? И как мне это исправить?
Строка 4 не является исполняемым оператором. Он просто выделяет место в стеке. Если бы вы использовали b *main
, звездочка должна была бы указать на остановку в самом начале функции перед прологом функции. Если вы пройдете по ассемблерному коду, вы увидите, как меняется поведение со звездочкой и без нее (b main
против b *main
).
Вы не можете установить точку останова в строке 4, поскольку это объявление без инициализатора, а не инструкция, поэтому с ней не связана никакая ассемблерная инструкция.
Если вы инициализируете i
, к нему будет прилагаться инструкция по сборке, поэтому после этого вы сможете установить точку останова.
Строка 4 — это
int i;
. Там нечего выполнять.