Как отлаживать функцию с помощью gdb - PullRequest
0 голосов
/ 27 мая 2020

Используя gdb, я могу поставить точку останова в любом месте, где вызывается функция, и пройти через оценку функции. Я также могу оценить функцию с помощью команды печати. При остановке в любой точке останова я хотел бы отладить конкретную функцию c, пошагово выполняя ее с использованием разных аргументов. Однако, когда я пытаюсь установить точку останова на функции и дать gdb подходящую команду печати, gdb объекты с сообщением «Отлаживаемая программа остановлена, пока находится в функции, вызываемой gdb. Оценка выражения, содержащего функцию MyClass :: mysize (int, int) будет оставлено ". Есть ли способ выполнить sh это без перезапуска программы?

1 Ответ

1 голос
/ 28 мая 2020

Вам удалось пропустить часть сообщения от GDB. Вот мой пример программы:

int
foo (int arg)
{
  return arg + 3;
}

int
main ()
{
  return foo (-3);
}

А вот мой сеанс GDB:

(gdb) start
Temporary breakpoint 1 at 0x401119: file eval.c, line 10.
Starting program: eval.x 

Temporary breakpoint 1, main () at eval.c:10
10    return foo (-3);
(gdb) break foo
Breakpoint 2 at 0x40110d: file eval.c, line 4.
(gdb) print foo (2)

Breakpoint 2, foo (arg=2) at eval.c:4
4     return arg + 3;
The program being debugged stopped while in a function called from GDB.
Evaluation of the expression containing the function
(foo) will be abandoned.
When the function is done executing, GDB will silently stop.
(gdb) bt
#0  foo (arg=2) at eval.c:4
#1  <function called from gdb>
#2  main () at eval.c:10
(gdb) 

Обратите внимание на последнюю строку сообщения от GDB: When the function is done executing, GDB will silently stop. Итак, GDB все еще находится внутри Вызванная функция с переданными вами аргументами. Это можно увидеть на трассировке с помощью <function called from GDB>.

Таким образом, вы можете продолжить пошаговое выполнение функции, чтобы увидеть, как она себя ведет. Чего вы не получаете, так это печати результата при возврате функции, GDB потерял понимание того факта, что это то, что вы хотели, поэтому вместо этого, когда функция вернет, GDB просто вернет вас обратно в приглашение. Это означает, что вы должны проверить возвращаемое значение внутри функции, прежде чем она вернется.

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