首页 > 代码库 > gdb 支持 c++ stl 调试

gdb 支持 c++ stl 调试

http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt

 

将网页的文本保存到 ~/.gdbinit 

之后就可以用 p 指令查看stl容器中的内容了

 

技术分享
#                                                                                                        #   STL GDB evaluators/views/utilities - 1.03##   The new GDB commands:                                                         # 	    are entirely non instrumental                                             # 	    do not depend on any "inline"(s) - e.g. size(), [], etc#       are extremely tolerant to debugger settings#                                                                                 #   This file should be "included" in .gdbinit as following:#   source stl-views.gdb or just paste it into your .gdbinit file##   The following STL containers are currently supported:##       std::vector<T> -- via pvector command#       std::list<T> -- via plist or plist_member command#       std::map<T,T> -- via pmap or pmap_member command#       std::multimap<T,T> -- via pmap or pmap_member command#       std::set<T> -- via pset command#       std::multiset<T> -- via pset command#       std::deque<T> -- via pdequeue command#       std::stack<T> -- via pstack command#       std::queue<T> -- via pqueue command#       std::priority_queue<T> -- via ppqueue command#       std::bitset<n> -- via pbitset command#       std::string -- via pstring command#       std::widestring -- via pwstring command##   The end of this file contains (optional) C++ beautifiers#   Make sure your debugger supports $argc##   Simple GDB Macros writen by Dan Marinescu (H-PhD) - License GPL#   Inspired by intial work of Tom Malnar, #     Tony Novac (PhD) / Cornell / Stanford,#     Gilad Mishne (PhD) and Many Many Others.#   Contact: dan_c_marinescu@yahoo.com (Subject: STL)##   Modified to work with g++ 4.3 by Anders Elton#   Also added _member functions, that instead of printing the entire class in map, prints a member.## std::vector<>#define pvector	if $argc == 0		help pvector	else		set $size = $arg0._M_impl._M_finish - $arg0._M_impl._M_start		set $capacity = $arg0._M_impl._M_end_of_storage - $arg0._M_impl._M_start		set $size_max = $size - 1	end	if $argc == 1		set $i = 0		while $i < $size			printf "elem[%u]: ", $i			p *($arg0._M_impl._M_start + $i)			set $i++		end	end	if $argc == 2		set $idx = $arg1		if $idx < 0 || $idx > $size_max			printf "idx1, idx2 are not in acceptable range: [0..%u].\n", $size_max		else			printf "elem[%u]: ", $idx			p *($arg0._M_impl._M_start + $idx)		end	end	if $argc == 3	  set $start_idx = $arg1	  set $stop_idx = $arg2	  if $start_idx > $stop_idx	    set $tmp_idx = $start_idx	    set $start_idx = $stop_idx	    set $stop_idx = $tmp_idx	  end	  if $start_idx < 0 || $stop_idx < 0 || $start_idx > $size_max || $stop_idx > $size_max	    printf "idx1, idx2 are not in acceptable range: [0..%u].\n", $size_max	  else	    set $i = $start_idx		while $i <= $stop_idx			printf "elem[%u]: ", $i			p *($arg0._M_impl._M_start + $i)			set $i++		end	  end	end	if $argc > 0		printf "Vector size = %u\n", $size		printf "Vector capacity = %u\n", $capacity		printf "Element "		whatis $arg0._M_impl._M_start	endenddocument pvector	Prints std::vector<T> information.	Syntax: pvector <vector> <idx1> <idx2>	Note: idx, idx1 and idx2 must be in acceptable range [0..<vector>.size()-1].	Examples:	pvector v - Prints vector content, size, capacity and T typedef	pvector v 0 - Prints element[idx] from vector	pvector v 1 2 - Prints elements in range [idx1..idx2] from vectorend ## std::list<>#define plist	if $argc == 0		help plist	else		set $head = &$arg0._M_impl._M_node		set $current = $arg0._M_impl._M_node._M_next		set $size = 0		while $current != $head			if $argc == 2				printf "elem[%u]: ", $size				p *($arg1*)($current + 1)			end			if $argc == 3				if $size == $arg2					printf "elem[%u]: ", $size					p *($arg1*)($current + 1)				end			end			set $current = $current._M_next			set $size++		end		printf "List size = %u \n", $size		if $argc == 1			printf "List "			whatis $arg0			printf "Use plist <variable_name> <element_type> to see the elements in the list.\n"		end	endenddocument plist	Prints std::list<T> information.	Syntax: plist <list> <T> <idx>: Prints list size, if T defined all elements or just element at idx	Examples:	plist l - prints list size and definition	plist l int - prints all elements and list size	plist l int 2 - prints the third element in the list (if exists) and list sizeenddefine plist_member	if $argc == 0		help plist_member	else		set $head = &$arg0._M_impl._M_node		set $current = $arg0._M_impl._M_node._M_next		set $size = 0		while $current != $head			if $argc == 3				printf "elem[%u]: ", $size				p (*($arg1*)($current + 1)).$arg2			end			if $argc == 4				if $size == $arg3					printf "elem[%u]: ", $size					p (*($arg1*)($current + 1)).$arg2				end			end			set $current = $current._M_next			set $size++		end		printf "List size = %u \n", $size		if $argc == 1			printf "List "			whatis $arg0			printf "Use plist_member <variable_name> <element_type> <member> to see the elements in the list.\n"		end	endenddocument plist_member	Prints std::list<T> information.	Syntax: plist <list> <T> <idx>: Prints list size, if T defined all elements or just element at idx	Examples:	plist_member l int member - prints all elements and list size	plist_member l int member 2 - prints the third element in the list (if exists) and list sizeend## std::map and std::multimap#define pmap	if $argc == 0		help pmap	else		set $tree = $arg0		set $i = 0		set $node = $tree._M_t._M_impl._M_header._M_left		set $end = $tree._M_t._M_impl._M_header		set $tree_size = $tree._M_t._M_impl._M_node_count		if $argc == 1			printf "Map "			whatis $tree			printf "Use pmap <variable_name> <left_element_type> <right_element_type> to see the elements in the map.\n"		end		if $argc == 3			while $i < $tree_size				set $value = http://www.mamicode.com/(void *)($node + 1)"elem[%u].left: ", $i				p *($arg1*)$value				set $value = http://www.mamicode.com/$value + sizeof($arg1)"elem[%u].right: ", $i				p *($arg2*)$value				if $node._M_right != 0					set $node = $node._M_right					while $node._M_left != 0						set $node = $node._M_left					end				else					set $tmp_node = $node._M_parent					while $node == $tmp_node._M_right						set $node = $tmp_node						set $tmp_node = $tmp_node._M_parent					end					if $node._M_right != $tmp_node						set $node = $tmp_node					end				end				set $i++			end		end		if $argc == 4			set $idx = $arg3			set $ElementsFound = 0			while $i < $tree_size				set $value = http://www.mamicode.com/(void *)($node + 1)"elem[%u].left: ", $i					p *($arg1*)$value					set $value = http://www.mamicode.com/$value + sizeof($arg1)"elem[%u].right: ", $i					p *($arg2*)$value					set $ElementsFound++				end				if $node._M_right != 0					set $node = $node._M_right					while $node._M_left != 0						set $node = $node._M_left					end				else					set $tmp_node = $node._M_parent					while $node == $tmp_node._M_right						set $node = $tmp_node						set $tmp_node = $tmp_node._M_parent					end					if $node._M_right != $tmp_node						set $node = $tmp_node					end				end				set $i++			end			printf "Number of elements found = %u\n", $ElementsFound		end		if $argc == 5			set $idx1 = $arg3			set $idx2 = $arg4			set $ElementsFound = 0			while $i < $tree_size				set $value = http://www.mamicode.com/(void *)($node + 1)"elem[%u].left: ", $i					p $valueLeft					printf "elem[%u].right: ", $i					p $valueRight					set $ElementsFound++				end				if $node._M_right != 0					set $node = $node._M_right					while $node._M_left != 0						set $node = $node._M_left					end				else					set $tmp_node = $node._M_parent					while $node == $tmp_node._M_right						set $node = $tmp_node						set $tmp_node = $tmp_node._M_parent					end					if $node._M_right != $tmp_node						set $node = $tmp_node					end				end				set $i++			end			printf "Number of elements found = %u\n", $ElementsFound		end		printf "Map size = %u\n", $tree_size	endenddocument pmap	Prints std::map<TLeft and TRight> or std::multimap<TLeft and TRight> information. Works for std::multimap as well.	Syntax: pmap <map> <TtypeLeft> <TypeRight> <valLeft> <valRight>: Prints map size, if T defined all elements or just element(s) with val(s)	Examples:	pmap m - prints map size and definition	pmap m int int - prints all elements and map size	pmap m int int 20 - prints the element(s) with left-value = http://www.mamicode.com/20 (if any) and map size"Map "			whatis $tree			printf "Use pmap <variable_name> <left_element_type> <right_element_type> to see the elements in the map.\n"		end		if $argc == 5			while $i < $tree_size				set $value = http://www.mamicode.com/(void *)($node + 1)"elem[%u].left: ", $i				p (*($arg1*)$value).$arg2				set $value = http://www.mamicode.com/$value + sizeof($arg1)"elem[%u].right: ", $i				p (*($arg3*)$value).$arg4				if $node._M_right != 0					set $node = $node._M_right					while $node._M_left != 0						set $node = $node._M_left					end				else					set $tmp_node = $node._M_parent					while $node == $tmp_node._M_right						set $node = $tmp_node						set $tmp_node = $tmp_node._M_parent					end					if $node._M_right != $tmp_node						set $node = $tmp_node					end				end				set $i++			end		end		if $argc == 6			set $idx = $arg5			set $ElementsFound = 0			while $i < $tree_size				set $value = http://www.mamicode.com/(void *)($node + 1)"elem[%u].left: ", $i					p (*($arg1*)$value).$arg2					set $value = http://www.mamicode.com/$value + sizeof($arg1)"elem[%u].right: ", $i					p (*($arg3*)$value).$arg4					set $ElementsFound++				end				if $node._M_right != 0					set $node = $node._M_right					while $node._M_left != 0						set $node = $node._M_left					end				else					set $tmp_node = $node._M_parent					while $node == $tmp_node._M_right						set $node = $tmp_node						set $tmp_node = $tmp_node._M_parent					end					if $node._M_right != $tmp_node						set $node = $tmp_node					end				end				set $i++			end			printf "Number of elements found = %u\n", $ElementsFound		end		printf "Map size = %u\n", $tree_size	endenddocument pmap_member	Prints std::map<TLeft and TRight> or std::multimap<TLeft and TRight> information. Works for std::multimap as well.	Syntax: pmap <map> <TtypeLeft> <TypeRight> <valLeft> <valRight>: Prints map size, if T defined all elements or just element(s) with val(s)	Examples:	pmap_member m class1 member1 class2 member2 - prints class1.member1 : class2.member2	pmap_member m class1 member1 class2 member2 lvalue - prints class1.member1 : class2.member2 where class1 == lvalueend## std::set and std::multiset#define pset	if $argc == 0		help pset	else		set $tree = $arg0		set $i = 0		set $node = $tree._M_t._M_impl._M_header._M_left		set $end = $tree._M_t._M_impl._M_header		set $tree_size = $tree._M_t._M_impl._M_node_count		if $argc == 1			printf "Set "			whatis $tree			printf "Use pset <variable_name> <element_type> to see the elements in the set.\n"		end		if $argc == 2			while $i < $tree_size				set $value = http://www.mamicode.com/(void *)($node + 1)"elem[%u]: ", $i				p *($arg1*)$value				if $node._M_right != 0					set $node = $node._M_right					while $node._M_left != 0						set $node = $node._M_left					end				else					set $tmp_node = $node._M_parent					while $node == $tmp_node._M_right						set $node = $tmp_node						set $tmp_node = $tmp_node._M_parent					end					if $node._M_right != $tmp_node						set $node = $tmp_node					end				end				set $i++			end		end		if $argc == 3			set $idx = $arg2			set $ElementsFound = 0			while $i < $tree_size				set $value = http://www.mamicode.com/(void *)($node + 1)"elem[%u]: ", $i					p *($arg1*)$value					set $ElementsFound++				end				if $node._M_right != 0					set $node = $node._M_right					while $node._M_left != 0						set $node = $node._M_left					end				else					set $tmp_node = $node._M_parent					while $node == $tmp_node._M_right						set $node = $tmp_node						set $tmp_node = $tmp_node._M_parent					end					if $node._M_right != $tmp_node						set $node = $tmp_node					end				end				set $i++			end			printf "Number of elements found = %u\n", $ElementsFound		end		printf "Set size = %u\n", $tree_size	endenddocument pset	Prints std::set<T> or std::multiset<T> information. Works for std::multiset as well.	Syntax: pset <set> <T> <val>: Prints set size, if T defined all elements or just element(s) having val	Examples:	pset s - prints set size and definition	pset s int - prints all elements and the size of s	pset s int 20 - prints the element(s) with value = http://www.mamicode.com/20 (if any) and the size of s"Dequeue size = %u\n", $size	endenddocument pdequeue	Prints std::dequeue<T> information.	Syntax: pdequeue <dequeue>: Prints dequeue size, if T defined all elements	Deque elements are listed "left to right" (left-most stands for front and right-most stands for back)	Example:	pdequeue d - prints all elements and size of dend## std::stack#define pstack	if $argc == 0		help pstack	else		set $start_cur = $arg0.c._M_impl._M_start._M_cur		set $finish_cur = $arg0.c._M_impl._M_finish._M_cur		set $size = $finish_cur - $start_cur        set $i = $size - 1        while $i >= 0            p *($start_cur + $i)            set $i--        end		printf "Stack size = %u\n", $size	endenddocument pstack	Prints std::stack<T> information.	Syntax: pstack <stack>: Prints all elements and size of the stack	Stack elements are listed "top to buttom" (top-most element is the first to come on pop)	Example:	pstack s - prints all elements and the size of send## std::queue#define pqueue	if $argc == 0		help pqueue	else		set $start_cur = $arg0.c._M_impl._M_start._M_cur		set $finish_cur = $arg0.c._M_impl._M_finish._M_cur		set $size = $finish_cur - $start_cur        set $i = 0        while $i < $size            p *($start_cur + $i)            set $i++        end		printf "Queue size = %u\n", $size	endenddocument pqueue	Prints std::queue<T> information.	Syntax: pqueue <queue>: Prints all elements and the size of the queue	Queue elements are listed "top to bottom" (top-most element is the first to come on pop)	Example:	pqueue q - prints all elements and the size of qend## std::priority_queue#define ppqueue	if $argc == 0		help ppqueue	else		set $size = $arg0.c._M_impl._M_finish - $arg0.c._M_impl._M_start		set $capacity = $arg0.c._M_impl._M_end_of_storage - $arg0.c._M_impl._M_start		set $i = $size - 1		while $i >= 0			p *($arg0.c._M_impl._M_start + $i)			set $i--		end		printf "Priority queue size = %u\n", $size		printf "Priority queue capacity = %u\n", $capacity	endenddocument ppqueue	Prints std::priority_queue<T> information.	Syntax: ppqueue <priority_queue>: Prints all elements, size and capacity of the priority_queue	Priority_queue elements are listed "top to buttom" (top-most element is the first to come on pop)	Example:	ppqueue pq - prints all elements, size and capacity of pqend## std::bitset#define pbitset	if $argc == 0		help pbitset	else        p /t $arg0._M_w	endenddocument pbitset	Prints std::bitset<n> information.	Syntax: pbitset <bitset>: Prints all bits in bitset	Example:	pbitset b - prints all bits in bend## std::string#define pstring	if $argc == 0		help pstring	else		printf "String \t\t\t= \"%s\"\n", $arg0._M_data()		printf "String size/length \t= %u\n", $arg0._M_rep()._M_length		printf "String capacity \t= %u\n", $arg0._M_rep()._M_capacity		printf "String ref-count \t= %d\n", $arg0._M_rep()._M_refcount	endenddocument pstring	Prints std::string information.	Syntax: pstring <string>	Example:	pstring s - Prints content, size/length, capacity and ref-count of string send ## std::wstring#define pwstring	if $argc == 0		help pwstring	else		call printf("WString \t\t= \"%ls\"\n", $arg0._M_data())		printf "WString size/length \t= %u\n", $arg0._M_rep()._M_length		printf "WString capacity \t= %u\n", $arg0._M_rep()._M_capacity		printf "WString ref-count \t= %d\n", $arg0._M_rep()._M_refcount	endenddocument pwstring	Prints std::wstring information.	Syntax: pwstring <wstring>	Example:	pwstring s - Prints content, size/length, capacity and ref-count of wstring send ## C++ related beautifiers (optional)#set print pretty onset print object onset print static-members onset print vtbl onset print demangle onset demangle-style gnu-v3set print sevenbit-strings off
View Code

 

gdb 支持 c++ stl 调试