Есть ли способ для GDB напечатать тип без пропуска параметров шаблона? - PullRequest
0 голосов
/ 23 декабря 2018

Похоже, что для нескольких контейнеров STL GDB не печатает параметры своего шаблона.Например

(gdb) whatis a
type = std::vector<int>

И это вызывает у меня проблемы.

(gdb) whatis std::vector<int>::_M_impl
No type "vector<int>" within class or namespace "std".
(gdb) p *reinterpret_cast<std::vector<int>*>(0x7fffffffd920)
A syntax error in expression, near `*>(0x7fffffffd920)'.

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

(gdb) whatis std::vector<int, std::allocator<int> >::_M_impl
type = std::_Vector_base<int, std::allocator<int> >::_Vector_impl
(gdb) p *reinterpret_cast<std::vector<int, std::allocator<int> >*>(0x7fffffffd920)
$5 = ......

Тем не менее, это не идеально, так как сложно обобщить программу, добавив эти пропущенные параметры шаблона.Например, учитывая std::map<int, double>, как я могу узнать, что существуют дополнительные параметры шаблона Compare и Allocator, что позволяет получить std::less<Key> и std::allocator<std::pair<const Key, T> >

Есть ли способ для GDB напечататьвведите без пропуска параметров шаблона?Или есть другой способ решить мою проблему?

1 Ответ

0 голосов
/ 23 декабря 2018

Есть ли способ для GDB напечатать тип без пропуска параметров шаблона?

Использовать TAB-завершение.Пример:

$ cat t.cc
#include <map>

int main()
{
  std::map<char, int> m = {{'a', 1}, {'z', 2}};
  return 0;
}

$ g++ -g t.cc && gdb -q ./a.out
(gdb) start
Temporary breakpoint 1 at 0xa87: file t.cc, line 5.
Starting program: /tmp/a.out

Temporary breakpoint 1, main () at t.cc:5
5     std::map<char, int> m = {{'a', 1}, {'z', 2}};
(gdb) n
6     return 0;

(gdb) p 'std::map<TAB>   # Note: single quote is important here.

Завершается до:

(gdb) p 'std::map<char, int, std::less<char>, std::allocator<std::pair<char const, int> > >

Теперь вы можете закончить с:

(gdb) p ('std::map<char, int, std::less<char>, std::allocator<std::pair<char const, int> > >' *)&m
$1 = (std::map<char, int, std::less<char>, std::allocator<std::pair<char const, int> > > *) 0x7fffffffdb60

И наконец:

(gdb) p *$1
$2 = std::map with 2 elements = {[97 'a'] = 1, [122 'z'] = 2}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...