GDB не устанавливает точку останова на нужной строке

В 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? В чем может быть причина? И как мне это исправить?

🤔 А знаете ли вы, что...
C является компилируемым языком, что означает, что программа на C должна быть скомпилирована перед выполнением.


3
59
1

Ответ:

Решено

Вы не можете установить точку останова в строке 4, поскольку это объявление без инициализатора, а не инструкция, поэтому с ней не связана никакая ассемблерная инструкция.

Если вы инициализируете i, к нему будет прилагаться инструкция по сборке, поэтому после этого вы сможете установить точку останова.