Вывести значение потока в GDB - C ++ - PullRequest
9 голосов
/ 05 декабря 2011

Я пытаюсь увидеть значение потока (если поток, но он должен работать для всех видов потоков, я думаю).Пример кода может выглядеть следующим образом:

stringstream in("One Two Three Four Five");
while(in)
cout << in;

Я пытался сделать это следующими способами, но, похоже, ни один из них не работает:

(gdb) print in
(gdb) call cout << in
(gdb) call in.getline()

... и так далее.

Есть ли способ увидеть значение потока?

Ответы [ 5 ]

11 голосов
/ 06 сентября 2012

Вы должны убедиться, что у вас есть пакет с библиотекой libstdc++, скомпилированной с флагами отладки.

У меня установлен пакет libstdc++6-8-dbg, и теперь я могу просматривать все данные объекта потока в gdb.

3 голосов
/ 18 сентября 2013

Я получил то, что мне было нужно, перекомпилировав все (не только одну или две единицы перевода) с -D_GLIBCXX_DEBUG. Тогда я могу просто сделать

(gdb) p is.tellg()
$21 = {_M_off = 0, _M_state = {__count = 0, __value = {__wch = 0, __wchb = "\000\000\000"}}}
(gdb) 

, где is - это std::istream&. Раньше я получал

(gdb) p is.tellg()
Couldn't find method std::istream::tellg
(gdb) p is

Кроме того, когда я перестраивал только один модуль компиляции, он работал, но зависал с

...
305d85d000-305d85e000 r--p 0005d000 fd:01 1180082                        /lib64/libfreebl3.so
305d85e000-305d85f000 rw-p 0005e000 fd:01 118
Program received signal SIGABRT, Aborted.
0x0000003052e35215 in raise () from /lib64/libc.so.6
(gdb)

Смотри также: http://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode_using.html#debug_mode.using.mode

1 голос
/ 18 декабря 2017

(gdb) call 'operator<<'(_ZSt4cout, your_object)

0 голосов
/ 05 декабря 2011

Нет. Вся идея потока заключается в том, что он читает данные по мере их поступления, будь то с жесткого диска, из сети или из чего угодно. Например, я мог бы написать класс, поддерживающий потоки, которые просто бесконечно испускали символ «а».

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

0 голосов
/ 05 декабря 2011

Вы пробовали print in.str() или даже print in.str().c_str()

, потому что stringstream имеет метод str, дает std::string, а string имеетc_str метод , дающий char*

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