Создание строки С++ в GDB
Мне сложно создавать std::string
(или любой объект С++, я думаю) в GDB. Я пробовал много вариантов для следующего, и никто из них, похоже, не работает:
(gdb) p std::string("hello")
A syntax error in expression, near `"hello")'.
Есть ли способ сделать это?
(Я удивлен, что я не мог найти ничего об этом в Интернете. Я начинаю думать, что мой GDB глючит, или я делаю что-то очень не так.)
Ответы
Ответ 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.