Функция перезаписи GDB (следующая) не работает - PullRequest
7 голосов
/ 17 сентября 2010

Я пытаюсь отладить программу, написанную на C ++.Вот код:

void a() { }
void b() { a(); }
int main() { b(); return 0; }

Я скомпилировал его, используя: g++ -g3 -O0 -o cards.exe cards.cpp.

Вот вывод моей сессии GDB:

(gdb) b main
Breakpoint 1 at 0x401421: file cards.cpp, line 10.
(gdb) r
Starting program: C:\workspace\Cards\src/cards.exe
[New thread 1624.0xa28]
Breakpoint 1, main () at cards.cpp:10
10    int main()
(gdb) n
12        b();
(gdb) n
b () at cards.cpp:5 5
void b()
(gdb) n
7        a();
(gdb) quit
The program is running.  Exit anyway? (y or n)

Почему отправкаследующая команда GDB все еще входит в функцию?

Я использую g ++ 4.2.1-sjlj и GDB 6.8.

Ответы [ 2 ]

5 голосов
/ 17 сентября 2010

Команды step и next работают по одной исходной строке за раз, поэтому, когда все все в одной строке, одна next выводит меня прямо в конец main().

3   int main() { b(); return 0; }
(gdb) n
0x00001faa in start ()

С кодом, отформатированным менее плотно, я все еще не вижу результатов, которые вы видите. Я помещаю вызовы функций в отдельные строки, чтобы заставить GDB перешагивать их по одному. Вот что я тогда получу:

jkugelman$ cat cards.cpp
void a() {
}

void b() {
    a();
}

int main() {
    b();
    return 0;
}
jkugelman$ g++ -g3 -O0 -o cards cards.cpp
jkugelman$ gdb ./cards
GNU gdb 6.3.50-20050815 (Apple version gdb-960) (Sun May 18 18:38:33 UTC 2008)
<snip>
Reading symbols for shared libraries .... done

(gdb) b main
Breakpoint 1 at 0x1ff2: file cards.cpp, line 9.
(gdb) r
Starting program: /Users/jkugelman/Development/StackOverflow/cards 
Reading symbols for shared libraries +++. done

Breakpoint 1, main () at cards.cpp:9
9       b();
(gdb) n
10      return 0;
(gdb) n
11  }
(gdb) n
0x00001faa in start ()

У меня нет ответа, но я просто хотел поделиться, что GDB ведет себя так, как и ожидалось на моем iMac. В любом случае GDB обрабатывал вызов b() как одну инструкцию и никогда не входил в вызов функции.

0 голосов
/ 17 сентября 2010

'n' является оператором next и не входит в функцию.

Для входа в функцию используйте «s». Это step.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...