Подтвердить что ты не робот

Создание строки С++ в GDB

Мне сложно создавать std::string (или любой объект С++, я думаю) в GDB. Я пробовал много вариантов для следующего, и никто из них, похоже, не работает:

(gdb) p std::string("hello")
A syntax error in expression, near `"hello")'.

Есть ли способ сделать это?

(Я удивлен, что я не мог найти ничего об этом в Интернете. Я начинаю думать, что мой GDB глючит, или я делаю что-то очень не так.)

4b9b3361

Ответ 1

Вы должны иметь возможность построить новый std::string в GDB. Вы хотите выделить пространство в куче, чтобы удерживать объект std::string, вызвать конструктор по умолчанию и присвоить строковое значение. Вот пример:

(gdb) call malloc(sizeof(std::string))
$1 = (void *) 0x91a6a0
(gdb) call ((std::string*)0x91a6a0)->basic_string()
(gdb) call ((std::string*)0x91a6a0)->assign("Hello, World")
$2 = (std::basic_string<char, std::char_traits<char>, std::allocator<char> > &) @0x91a6a0: {static npos = <optimized out>, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x91a6f8 "Hello, World"}}
(gdb) call SomeFunctionThatTakesAConstStringRef(*(const std::string*)0x91a6a0)

Ответ 2

GDB не может действительно делать то, что вы описываете. В вашем случае:

  • создание шаблона basic_string и генерация кода для класса
  • создать вызов конструктора

Это означает, что он должен выполнять работу той же сложности, что и компилятор. Это отнюдь не работа отладчика.

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

Ответ 3

Что вы подразумеваете под "созданием"? GDB не сохраняет объекты С++ (ваше приложение делает это), поэтому вы не можете создать объект С++ в самом GDB.

Однако вы должны иметь возможность вызывать определенную функцию вашего приложения из GDB.