Как я могу погрузиться в (не STL) элементы, содержащиеся в контейнере STL изнутри GDB - PullRequest
0 голосов
/ 11 мая 2018

У меня есть

std::set<MyIntrusivePtr<T> >

Когда я распечатываю этот контейнер из GDB, я получаю

(gdb) p m_sSymbol->m_sVariables
$10 = std::set with 1 element = {[0] = {m_p = 0x781a0630}}
(gdb)

m_p - простой указатель

T* m_p;

содержится в

MyIntrusivePtr<T>

Как можно разыменовать этот указатель?

Пример сеанса:

[user@ hostname /directory]% cat tmp.cpp
    #include <set>
    struct A
    {    int *m_p;
         bool operator<(const A &_r) const
         {    return m_p < _r.m_p;
         }
         A(int *p)
              :m_p(p)
         {
         }
    };
    int main()
    {    int a, b, c;
         std::set<A> s{A(&a), A(&b), A(&c)};
    }
[user@ hostname /directory]% g++ -g tmp.cpp -std=c++17 -fno-inline
[user@ hostname /directory]% ~/bin./gdb a.out
GNU gdb (GDB) 8.0
(gdb) b main
Breakpoint 2 at 0x400a45: file tmp.cpp, line 14.
(gdb) r
Starting program: /directory/a.out
Breakpoint 2, main () at tmp.cpp:14
14               std::set<A> s{A(&a), A(&b), A(&c)};
(gdb) n
15          }
(gdb) p s
$1 = std::set with 3 elements = {[0] = {m_p = 0x7fffffffd484}, [1] = {m_p = 0x7fffffffd488}, [2] = {m_p = 0x7fffffffd48c}}
(gdb) p s[0]
No symbol "operator[]" in current context.
(gdb) p (*s.begin())
Cannot evaluate function -- may be inlined
(gdb)

1 Ответ

0 голосов
/ 12 мая 2018

Как разыменовать этот указатель?

К сожалению, нет встроенного способа.

Вы можете написать свой собственный симпатичный принтер для std::set<A> ( документация ), но часто это делает "глупый" способ:

(gdb) print *(A*) 0x7fffffffd484
(gdb) print *(A*) 0x7fffffffd488

и т.д.

...