How to pretty-print STL containers in GDB?

前端 未结 9 605
一整个雨季
一整个雨季 2020-11-30 20:45

I\'ve followed the instructions on the GDB wiki to install the python pretty-printers for viewing STL containers. My ~/.gdbinit now looks like this:

<         


        
9条回答
  •  忘掉有多难
    2020-11-30 21:28

    It just works on Ubuntu 17.04

    Debian seems to have finally integrated things properly now:

    main.cpp

    #include 
    #include 
    #include 
    
    int main() {
        std::vector v;
        v.push_back(0);
        v.push_back(1);
        v.push_back(2);
        std::map m;
        m.insert(std::make_pair(0, 0));
        m.insert(std::make_pair(1, -1));
        m.insert(std::make_pair(2, -2));
    }
    

    Compile:

    g++ -O0 -ggdb3 -o main.out -std=c++98 main.cpp
    

    Outcome:

    (gdb) p v
    $1 = std::vector of length 3, capacity 4 = {0, 1, 2}
    (gdb) p m
    $2 = std::map with 3 elements = {[0] = 0, [1] = -1, [2] = -2}
    

    We can see that the pretty printer is installed with:

    (gdb) info pretty-printer
    

    Which contains the lines:

    global pretty-printers:
      objfile /usr/lib/x86_64-linux-gnu/libstdc++.so.6 pretty-printers:
      libstdc++-v6
        std::map
        std::vector
    

    The printers are provided by the file:

    /usr/share/gcc-7/python/libstdcxx/v6/printers.py
    

    which comes with the main C++ library package libstdc++6 and is located under libstdc++-v3/python/libstdcxx in the GCC source code: https://github.com/gcc-mirror/gcc/blob/gcc-6_3_0-release/libstdc%2B%2B-v3/python/libstdcxx/v6/printers.py#L244

    TODO: how GDB finds that file is the final mistery, it is not in my Python path: python -c "import sys; print('\n'.join(sys.path))" so it must be hardcoded somewhere?

    Custom classes

    See how to define a custom toString method and call it at: Printing C++ class objects with GDB

提交回复
热议问题