Почему команда печати в GDB возвращает \ 035 для C ++ std :: strings? - PullRequest
7 голосов
/ 28 января 2011

Скажите, у меня есть код:

std::string str = "random";

function(str);

void function (std::string str)
{
  std::cout << str << std::endl;
}

Если я перешагну этот код в gdb, а затем зайду в функцию и выполню p str, она выведет что-то вроде \362\241, но cout выведет на экран правильную строку random. Кто-нибудь видел это раньше, если так, что мне делать? Я неправильно использую команду print в gdb или это как-то связано с тем, как компилятор интерпретирует строку?

Ответы [ 5 ]

10 голосов
/ 28 января 2011

GDB, вероятно, по какой-то причине отсутствует отладочная информация для STL.Используя Пример использования русского языка с g ++ (GCC) 4.3.4 20090804 (выпуск) 1 и GNU gdb 6.8.0.20080328-cvs (cygwin-special), я получаю следующий вывод:

(gdb) p str
$1 = {static npos = <optimized out>,
  _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<
No data fields>}, <No data fields>}, _M_p = 0x28cce8 "$▒▒"}}

Что является интерпретацией необработанных полей данных в std::string.Чтобы получить фактические строковые данные, я должен интерпретировать поле _M_p как указатель:

(gdb) p *(char**)str._M_dataplus._M_p
$2 = 0xd4a224 "random"
5 голосов
/ 28 января 2011

GDB, вероятно, просто показывает вам интерпретацию байтовой строки внутренних элементов класса строки.Попробуйте это проверить / обойти:

$ print str.c_str()
2 голосов
/ 28 января 2011

У вас сломанная версия GCC или GDB, или вы пытаетесь напечатать строку не в том месте. Вот как это должно выглядеть (при использовании g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3 и GNU gdb (GDB) 7.2.50.20110127-cvs с включенными симпатичными принтерами STL):

#include <string>
#include <iostream>

void function (std::string str)
{
  std::cout << str << std::endl;
}

int main()
{
  std::string str = "random";
  function(str);
}

$ g++ -g t.cc && gdb -q ./a.out
Reading symbols from /usr/local/tmp/a.out...done.
(gdb) b function
Breakpoint 1 at 0x400b30: file t.cc, line 6.
(gdb) run

Breakpoint 1, function (str="random") at t.cc:6
6     std::cout << str << std::endl;
(gdb) p str
$1 = "random"
(gdb) q

P.S. Вы, вероятно, должны передать строку в функцию как константную ссылку.

0 голосов
/ 14 августа 2018

Была такая же проблема, решена включая библиотеку iostream.

0 голосов
/ 28 января 2011

Вы скомпилировали бинарный файл с отладочной информацией? Нравится g++ -g test.cpp

Шахта показывает правильную информацию:

(gdb) p s
$2 = {static npos = <optimized out>, 
  _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x804b014 "Hello world"}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...