Как передать аргументы в функцию, пока GDB - PullRequest
2 голосов
/ 25 сентября 2019

Я пытаюсь использовать GDB для отладки моей программы на C ++.

Я думаю, можно ли передать аргументы функции при использовании GDB?

Например, у меня естьтакая программа как ниже:

#include <iostream>

void func(int a)
{
    std::cout << a << std::endl;
}

int main(int argc, char **argv)
{
    func(2222);

    return EXIT_SUCCESS;
}

Я установил точку останова на линии func(2222) в функции main.Мой вопрос: возможно ли установить другой аргумент для функции func вместо 2222 при использовании GDB в этой программе?

Ответы [ 3 ]

2 голосов
/ 25 сентября 2019

Да.Вы можете оценить выражения во время отладки.Вы можете использовать call <expr> или print <expr>, но выражение должно быть известно во время точки останова.

В вашем примере вы можете сделать:

gdb ./test
(gdb) b main
...
(gdb) r
...
(gdb) call func(11)
11

Подробнее озвонок / печать: https://sourceware.org/gdb/onlinedocs/gdb/Calling.html

2 голосов
/ 25 сентября 2019

Вы можете изменить значение a внутри функции func()).
. Для этого вы можете использовать:

assign a = $value_you_want 

Пример

b func # set breakpoint
c      # continue
assign a = 2  # breakpoint gets hit, change value from a = 222 to a = 2
0 голосов
/ 25 сентября 2019

Не думаю, что можно изменить значение, переданное функции до вызова func(2222).Тем не менее, вы можете изменить значения параметра после того, как GDB вступил в функцию, перед другим выполнением кода.

Мой любимый способ отладки с помощью GDB - это код Visual Studio, он предоставляет графический интерфейс поверхиз всех команд GDB, и делает использование расширенной отладки GDB намного проще.И вы можете установить новое значение для переменной, просто нажав на нее.Вы можете увидеть пример ниже.

enter image description here enter image description here

...