Я хотел бы иметь возможность установить контрольную точку в 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)
В этот момент я могу, например, нажать continue (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 нажатой, и последняя введенная команда (шаг или следующий) будет повторяться (оставшийся бит более длинный сеанс во втором случае, чтобы показать, что "следующий" остается на том же уровне, шаги "шаг" внутри вызываемых функций). Однако, как видно, в зависимости от того, будет ли шаг или следующий запуск, это может занять некоторое время, пока не будет достигнут результат - и поэтому я не хочу сидеть в течение 10 минут, когда моя рука застряла на кнопке Enter:)
Итак, мой вопрос: могу ли я как-то проинструктировать gdb
работать с "точкой останова 2" без дополнительного вмешательства пользователя - при распечатке строк, через которые он проходит, как будто нажата кнопка (или следующая)?