Я хотел бы иметь возможность установить точку останова в GDB и заставить ее работать до этой точки - и в процессе распечатывать строки, которые он "прошел".
Вот пример, основанный на этом простом файле с main
и функцией и двумя точками останова для каждого:
$ cat > test.c <<EOF
#include "stdio.h"
int count=0;
void doFunction(void) {
// two steps forward
count += 2;
// one step back
count--;
}
int main(void) {
// some pointless init commands;
count = 1;
count += 2;
count = 0;
//main loop
while(1) {
doFunction();
printf("%d\n", count);
}
}
EOF
$ gcc -g -Wall test.c -o test.exe
$ chmod +x test.exe
$ gdb -se test.exe
...
Reading symbols from /path/to/test.exe...done.
(gdb) b main
Breakpoint 1 at 0x80483ec: file test.c, line 14.
(gdb) b doFunction
Breakpoint 2 at 0x80483c7: file test.c, line 7.
Чтобы начать сеанс, мне нужно запустить (r
) программу, которая затем остановится на первой точке останова (main
):
(gdb) r
Starting program: /path/to/test.exe
Breakpoint 1, main () at test.c:14
14 count = 1;
(gdb)
На данный момент - я могу, например, нажать продолжить (c
); и процесс будет проходить, ничего не выводя, и прерываться на запрошенную строку:
(gdb) c
Continuing.
Breakpoint 2, doFunction () at test.c:7
7 count += 2;
(gdb)
С другой стороны, вместо продолжения - я могу переходить от строки к строке, используя шаг (s
) или следующий (n
); например:
14 count = 1;
(gdb) n
15 count += 2;
(gdb) s
16 count = 0;
(gdb) s
19 doFunction();
(gdb) s
Breakpoint 2, doFunction () at test.c:7
7 count += 2;
(gdb) s
9 count--;
(gdb) s
10 }
(gdb) s
main () at test.c:20
20 printf("%d\n", count);
(gdb) s
...
(gdb) s
_IO_vfprintf_internal (s=Cannot access memory at address 0xe5853361
) at vfprintf.c:210
210 vfprintf.c: No such file or directory.
in vfprintf.c
(gdb) s
245 in vfprintf.c
(gdb) s
210 in vfprintf.c
(gdb) n
245 in vfprintf.c
...
(gdb) n
2006 in vfprintf.c
(gdb) n
__printf (format=0x80484f0 "%d\n") at printf.c:39
39 printf.c: No such file or directory.
in printf.c
(gdb) n
main () at test.c:21
21 }
(gdb) n
19 doFunction();
(gdb) n
Breakpoint 2, doFunction () at test.c:7
7 count += 2;
(gdb)
В любом случае, я знаю, что могу удерживать нажатой Enter , и последняя введенная команда (шаг или следующая) будет повторяться ( во втором случае оставил сеанс немного длиннее, чтобы показать, что «next» остается на том же уровне, «step» входит внутрь функций, вызываемых ). Однако, как видно, в зависимости от того, выполняется ли шаг или следующий шаг, может потребоваться некоторое время, пока не будет достигнут результат - и поэтому я не хочу сидеть 10 минут, держа руку на кнопке «Ввод» :)
Итак, мой вопрос - могу ли я как-то проинструктировать gdb
для перехода к «точке останова 2» без дальнейшего вмешательства пользователя - при печати строк, через которые он проходит, как если бы был нажат шаг (или следующий)?