有时候我们需要debug一些core文件或者程序,但是如果遇到STL容器,p打印出的是一些红黑树或者原始的数据机构,这给我们调试带来不必要的麻烦。
gdb 内置了 Python 支持,因此可以轻松编写一个函数来打印出任何 stl 结构的内容。gcc 4.5 已经提供所需的 python 脚本,以使 gdb 智能地处理 stl 数据结构。
https://gist.github.com/skyscribe/3978082像这个脚本提供了一些打印容器的宏,或者这里:http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt
有了这些宏,就可以打印出响应的容器
wget http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt
cat dbinit_stl_views-1.03.txt >> ~/.gdbinit
# 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
我们可以把这些放入到~/.gdbinit文件中。在gdb调试的时候,使用source ~/.gdbinit加载这些宏操作。
如果你的gdb在运行当中,需要重启启用下,这些宏才生效。
阅读这些代码宏,也可以帮助你理解stl结构。
顺带说下,在~/.gdbinit可以放入你常用的一些gdb设置命令。比如说
set print elements 0 //设置打印全部元素
set print pretty on //打印结构体格式更直观
set print object on
set print static-members on
set print vtbl on
set print demangle on
set demangle-style gnu-v3
set print sevenbit-strings off
还有一个比较有用的是保存gdb调试历史,set history save on
一个相关的命令是set history remove-duplicates <count>. 该命令是“控制删除命令历史列表中重复的历史条目。如果计数不为零,gdb 将回顾最后计数的历史条目并删除与当前条目重复的第一个条目。添加到命令历史列表中。如果计数是无限制的,那么此后视是无界的。如果计数为 0,则禁用重复历史条目的删除"。
set history remove-duplicates <count>
默认情况下,gdb 将历史记录保存到当前目录的./.gdb_history 文件中。如果希望命令历史记录不依赖于所在的目录,需要包含:
set history filename ~/.gdb_history
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。