debugging C++ code with templates and STL with gdb

后端 未结 5 709
渐次进展
渐次进展 2020-12-28 10:29

What do gdb users here think about its capabilities in regards to debugging code with templates and STL?

Do you use any tricks to make the debugging any simpler? Per

5条回答
  •  旧时难觅i
    2020-12-28 11:04

    I am not sure if you are allowed to add code, or you are just debugging the code, Sorry. I wrote a simple utility functions since a while, I hope you find it useful. You could print the contents of standard containers easily. There is no platform specific code, an example of usage(the test-driver actually):

    #include 
    #include 
    #include 
    #include 
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #include 
    #include 
    #include "streamer.hpp"
    
    
    const std::size_t consoleWidth = 80;
    
    std::ostream& newline_if_not_console(std::ostream& outputstream)
    {
        if(&outputstream != & std::cout)
        {
            outputstream << std::endl;
        }
    
        return outputstream;
    }
    
    void STL_test_ostream(std::ostream& out)
    {
        using namespace boost::assign;
        using namespace streamer;
    
        double iDoubleArray[] = {0.1, 1.2, 2.3, 3.4, 4.5}; // It could be of any type!
        std::vector                iVec;
        std::list                  iList;
        std::deque                 iDeque;
        std::stack                 iStack;
        std::queue                 iQueue;
        std::priority_queue        iPriorityQueue;
        std::set                   iSet;
        std::map      iMap;
    
        iVec            +=  0, 1, 2, 3, 4, 5;
        iList           +=  0, 1, 2, 3, 4, 5;
        iDeque          +=  0, 1, 2, 3, 4, 5;
        iStack          +=  0, 1, 2, 3, 4, 5;
        iQueue          +=  0, 1, 2, 3, 4, 5;
        iPriorityQueue  +=  0, 1, 2, 3, 4, 5;
        iSet            +=  0, 1, 2, 3, 4, 5;
        insert(iMap)
            (   1 , "one"   )
            (   2 , "two"   )
            (   3 , "three" )
            (   4 , "four"  )
            (   5 , "five"  );
    
        out << std::string(consoleWidth, '=') << newline_if_not_console
            << "STL Test..." << std::endl
            << std::string(consoleWidth, '=') << newline_if_not_console;
    
        out << "Native Array   = "  <<  iDoubleArray    << std::endl;
        out << "vector         = "  <<  iVec            << std::endl;
        out << "list           = "  <<  iList           << std::endl;
        out << "deque          = "  <<  iDeque          << std::endl;
        out << "queue          = "  <<  iQueue          << std::endl;
        out << "stack          = "  <<  iStack          << std::endl;
        out << "priority_queue = "  <<  iPriorityQueue  << std::endl;
        out << "set            = "  <<  iSet            << std::endl;
        out << "map            = "  <<  iMap            << std::endl;
    
        out << std::string(consoleWidth, '=') << std::endl;
    }
    
    void Boost_test_ostream(std::ostream& out)
    {
        out << std::string(consoleWidth, '=') << newline_if_not_console
        << "Boost Test..."  << std::endl
        << std::string(consoleWidth, '=') << newline_if_not_console;
    
    }
    
    int main()
    {
        std::ofstream stl("STL_test_ostream.txt"),
                    boost("Boost_test_ostream.txt");
    
        STL_test_ostream(std::cout);
        Boost_test_ostream(std::cout);
    
        STL_test_ostream(stl);
        Boost_test_ostream(boost);
    }
    

    I haven't wrote the code for Boost containers yet. Hopefully, I'll do it sometime :)

    All what you have to do, is to include this file["streamer.hpp"]:

    #ifndef DATASTRUCTRE_STREAMER
    #define DATASTRUCTRE_STREAMER
    
    #include 
    #include 
    #include 
    #include 
    #include 
    
    namespace streamer
    {
    
        // one-value data structure streaming function
        template 
        Stream& printOneValueContainer(Stream& outputstream, const Container& container)
        {
            Container::const_iterator beg = container.begin();
    
            outputstream << "[";
    
            while(beg != container.end())
            {
                outputstream << " " << *beg++;
            }
    
            outputstream << " ]";
    
            return outputstream;
        }
    
        // pair-value data structure streaming function
        template 
        Stream& printPairValueContainer(Stream& outputstream, const Container& container)
        {
            Container::const_iterator beg = container.begin();
    
            outputstream << "[";
    
            while(beg != container.end())
            {
                outputstream << " " << "<" << beg->first << " , " << beg->second << ">";
                beg++;
            }
    
            outputstream << " ]";
    
            return outputstream;
        }
    
    
    
        /*
        *************************************************************
        C++ Standard Library
        *************************************************************
        */
    
        // Sequence Containers.
    
        // vector, list, deque
        template
        < class Type
        , template > class Container
        , class Stream
        >
        Stream& operator<<(Stream& outputstream, const Container& container)
        {
            return printOneValueContainer(outputstream, container);
        }
    
        // Associative Containers.
    
        // set, multiset
        template
            < class Key
            , template, class Allocator = std::allocator > class Container
            , class Stream
            >
        Stream& operator<<(Stream& outputstream, const Container& container)
        {
            return printOneValueContainer(outputstream, container);
        }
    
        // map, multimap
        template
            < class Key, class Value
            , template, class Allocator = std::allocator > > class Container
            , class Stream
            >
        Stream& operator<<(Stream& outputstream, const Container& container)
        {
            return printPairValueContainer(outputstream, container);
        }
    
        // Adapters.
    
        // stack, queue
        template < class Type, class Container >
        const Container& container(const std::stack& stack)
        {
            struct HackedStack : private std::stack
            {
                static const Container& container(const std::stack& stack)
                {
                    return stack.*&HackedStack::c;
                }
            };
    
            return HackedStack::container(stack);
        }
    
        template < class Type, class Container >
        const Container& container(const std::queue& queue)
        {
            struct HackedQueue : private std::queue
            {
                static const Container& container(const std::queue& queue)
                {
                    return queue.*&HackedQueue::c;
                }
            };
    
            return HackedQueue::container(queue);
        }
    
        template
            < class Type
            , template  > class Adapter
            , class Stream
            >
        Stream& operator<<(Stream& outputstream, const Adapter& adapter)
        {
            return printOneValueContainer(outputstream, container(adapter));
        }
    
        // priority_queue
        template < class Type, class Container, class Compare >
        const Container& container(const std::priority_queue& priorityQue)
        {
            struct HackedProiorityQueue : private std::priority_queue
            {
                static const Container& container(const std::priority_queue& priorityQue)
                {
                    return priorityQue.*&HackedProiorityQueue::c;
                }
            };
    
            return HackedProiorityQueue::container(priorityQue);
        }
    
        template < class Type, class Container, class Compare, class Stream >
        Stream& operator<<(Stream& outputstream, const std::priority_queue& adapter)
        {
            return printOneValueContainer(outputstream, container(adapter));
        }
    
        /*
        *************************************************************
        C++ Native Arrays
        *************************************************************
        */
    
        template 
        Stream& operator<<(Stream& outputstream, Type (&array)[size])
        {
            outputstream << "[";
    
            for(std::size_t i = 0; i < size; ++i)
            {
                outputstream << " " << array[i];
            }
    
            outputstream << " ]";
    
            return outputstream;
        }
    
        /*
        *************************************************************
            Boost
        *************************************************************
        */
    }
    
    #endif
    

提交回复
热议问题