gdb用户在这里想到了使用模板和STL调试代码的功能吗?使用gdb调试带模板和STL的C++代码
你使用任何技巧使调试更简单吗?也许一些Python脚本?或者你是否满意目前在gdb(版本6.x,还没有尝试过7.x)?
谢谢。
gdb用户在这里想到了使用模板和STL调试代码的功能吗?使用gdb调试带模板和STL的C++代码
你使用任何技巧使调试更简单吗?也许一些Python脚本?或者你是否满意目前在gdb(版本6.x,还没有尝试过7.x)?
谢谢。
我假设你的意思是可视化的STL代码更好的(而不是debug mode这给安全迭代器和额外的运行时检查)。我不知道,如果你已经看过这些帖子:
用gdb
与7.0版本开始,GDB包括用Python写漂亮的打印机支持。用于STL类的漂亮打印机使用版本4.5.0中的GCC分发。这些打印机的最新版本总是在libstdC++ svn仓库中找到。为了使这些打印机,签出最新的打印机到本地目录:
而且,尝试使用的KDevelop/DDD如果可能的话 - 他们的帮助。
我最喜欢使用GDB的方式是emacs中的GDB模式。您可以获得完整的视觉/源代码级别的调试,线程窗口,堆栈窗口(等等)......试一试,您不会感到失望。
也就是说,GDB处理STL容器只是没有特殊的附加功能,精细的调试......只要确保你与-g建设,没有-ON(任何种类)...
DDD也很棒 - 我的最爱!
我不知道你是否被允许添加代码,或者你只是在调试代码,对不起。自从我写了一个简单的实用函数以来,我希望你觉得它有用。您可以轻松打印标准容器的内容。没有平台相关的代码,使用的例子(测试驱动器实际上):我没有写了升压容器的代码,但
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <boost/array.hpp>
#include <boost/assign.hpp>
#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<int> iVec;
std::list<int> iList;
std::deque<int> iDeque;
std::stack<int> iStack;
std::queue<int> iQueue;
std::priority_queue<int> iPriorityQueue;
std::set<int> iSet;
std::map<int, std::string> 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);
}
。但愿,我会做一段时间:)
所有你所要做的,是包括这个文件[“streamer.hpp”]:
#ifndef DATASTRUCTRE_STREAMER
#define DATASTRUCTRE_STREAMER
#include <stack>
#include <queue>
#include <boost/array.hpp>
#include <functional>
#include <memory>
namespace streamer
{
// one-value data structure streaming function
template <class Container, class Stream>
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 <class Container, class Stream>
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 Type, class Allocator = std::allocator<Type> > class Container
, class Stream
>
Stream& operator<<(Stream& outputstream, const Container<Type>& container)
{
return printOneValueContainer(outputstream, container);
}
// Associative Containers.
// set, multiset
template
< class Key
, template<class KeyType, class Traits = std::less<KeyType>, class Allocator = std::allocator<KeyType> > class Container
, class Stream
>
Stream& operator<<(Stream& outputstream, const Container<Key>& container)
{
return printOneValueContainer(outputstream, container);
}
// map, multimap
template
< class Key, class Value
, template<class KeyType, class ValueType, class Traits = std::less<KeyType>, class Allocator = std::allocator<std::pair<const KeyType, ValueType> > > class Container
, class Stream
>
Stream& operator<<(Stream& outputstream, const Container<Key, Value>& container)
{
return printPairValueContainer(outputstream, container);
}
// Adapters.
// stack, queue
template < class Type, class Container >
const Container& container(const std::stack<Type, Container>& stack)
{
struct HackedStack : private std::stack<Type, Container>
{
static const Container& container(const std::stack<Type, Container>& stack)
{
return stack.*&HackedStack::c;
}
};
return HackedStack::container(stack);
}
template < class Type, class Container >
const Container& container(const std::queue<Type, Container>& queue)
{
struct HackedQueue : private std::queue<Type, Container>
{
static const Container& container(const std::queue<Type, Container>& queue)
{
return queue.*&HackedQueue::c;
}
};
return HackedQueue::container(queue);
}
template
< class Type
, template <class Type, class Container = std::deque<Type> > class Adapter
, class Stream
>
Stream& operator<<(Stream& outputstream, const Adapter<Type>& adapter)
{
return printOneValueContainer(outputstream, container(adapter));
}
// priority_queue
template < class Type, class Container, class Compare >
const Container& container(const std::priority_queue<Type, Container, Compare>& priorityQue)
{
struct HackedProiorityQueue : private std::priority_queue<Type, Container, Compare>
{
static const Container& container(const std::priority_queue<Type, Container, Compare>& 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<Type, Container, Compare>& adapter)
{
return printOneValueContainer(outputstream, container(adapter));
}
/*
*************************************************************
C++ Native Arrays
*************************************************************
*/
template <class Type, std::size_t size, class Stream>
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
感谢代码示例和示例。目前我正在尝试不使用任何外部代码。理想情况下,我希望gdb可以自己做(漂亮的打印已经提到过)或者为gdb制作一个脚本来帮助它做到这一点。从其他回复中,我正在使用新版gdb在这方面做得更好。而且,顺便说一句,我正在写我自己的代码。问候。 – user193272 2009-10-24 02:14:25
感谢,荷银和dirkgently。我希望在几天之内在我的Debian机器上运行GDB 7.0(运行Testing)。同时,我正试图看看如何在.gdbinit中以正确的方式进行设置。 此致敬礼。 – user193272 2009-10-23 02:55:23