Отслеживать все переменные для выполнения функции в GDB - PullRequest
2 голосов
/ 25 марта 2020

Я хочу отслеживать состояние всех переменных в функции в C.

Я знаю, что могу использовать информационные команды в gdb для получения состояния всех переменных в текущем контексте.

И я могу использовать gdbinit для автоматизации gdb.

Но что Я хочу сделать, это установить точку останова на функцию, а затем после выполнения каждой строки печати выполнить команду info.

В основном, я хочу установить 2 точки останова: одну в начале функции и одну в конце одной и той же функции (я не знаю, как это сделать) и выполнять построчно между этими двумя точками.

Я хочу что-то подобное в моем gdbinit:

b <func_name>
commands
while <inside the function>:
   info locals
   next
end
run

Есть ли способ показать время l oop, показанное выше?

1 Ответ

3 голосов
/ 26 марта 2020

По сути, я хочу установить 2 точки останова: одну в начале функции и одну в конце той же самой функции (я не знаю, как это сделать) и выполнять построчно между этими 2 балла.

Вы можете найти, как установить точку останова в конце функции здесь . Однако в этом нет необходимости.

Вы можете использовать удобную функцию $_caller_is() GDB для завершения sh выполнения текущей подпрограммы и остановки после ее возврата.

Пример:

int fn()
{
  int sum = 0;
  for (int j = 0; j < 5; j++) {
    sum += j;
  }
  return sum;
}

int main()
{
  return fn() - 10;
}

А теперь сеанс GDB:

gdb -q ./a.out
Reading symbols from ./a.out...
(gdb) b 4
Breakpoint 1 at 0x1130: file t.c, line 4.
(gdb) run
Starting program: /tmp/a.out

Breakpoint 1, fn () at t.c:4
4     for (int j = 0; j < 5; j++) {
(gdb) while $_caller_is("main")
 >info locals
 >next
 >end
j = 1431654464
sum = 0
5       sum += j;
j = 0
sum = 0
4     for (int j = 0; j < 5; j++) {
j = 0
sum = 0
5       sum += j;
j = 1
sum = 0
4     for (int j = 0; j < 5; j++) {
j = 1
sum = 1
5       sum += j;
j = 2
sum = 1
4     for (int j = 0; j < 5; j++) {
j = 2
sum = 3
5       sum += j;
j = 3
sum = 3
4     for (int j = 0; j < 5; j++) {
j = 3
sum = 6
5       sum += j;
j = 4
sum = 6
4     for (int j = 0; j < 5; j++) {
j = 4
sum = 10
7     return sum;
sum = 10
8   }
sum = 10
main () at t.c:12
12    return fn() - 10;
(gdb) q

PS Для всех проблем, кроме игрушек, этот метод отладки будет крайне неэффективным и недостаточным (это редко случается для интересное состояние, которое должно быть захвачено локальными переменными).

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