在我们使用gdb的时候,很多时候 print 命令打印出来的内容有很多冗余的信息。
很不友好,不过gdb提供了python的接口,可以支持各种pretty printer。
举个例子,
如果有段程序如下:
#include
#include
int main()
{
using namespace std;
string hello = "hello, world";
vector vec;
vec.push_back(hello);
vec.push_back("bye, bye");
// ...
return 0;
}
如果gdb没有加载任何的 pretty printer ,
那么打印变量的值如下
而如果加载了 pretty printer,则变为
是不是变得相当简洁清晰了 ?
默认情况下,gdb是会自动加载pretty printer的,但是有些时候却加载不了。
现在介绍下几种情况
1) centos 5.9 with gdb 7.0 : 这个默认就是可以加载的 文件默认在 /usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.8-gdb.py
2) centos 5.9 with gdb 7.2 , gcc 4.7.3 : 我的gcc升级到4.7.3了,然后安装在目录 /usr/local 下, gdb的python脚本在
/usr/local/lib64/libstdc++.so.6.0.17-gdb.py 。
这时,如果我直接用 gdb xxx 会出现
然后按照它的提示 ,创建.gdbinit 文件,添加以下两行中的任意一行即可:
add-auto-load-safe-path /usr/local/lib64/libstdc++.so.6.0.17-gdb.py
set auto-load safe-path /
我尝试将此文件移动到 /usr/share/gdb/auto-load/usr/lib64下,这时再启动gdb
还是不会加载这个脚本,貌似7.2 以后 加载 objfile-gdb.py 文件都是在 objfile同一个目录下做的。
这里的 objfile是 libstdc++.so.6.0.17 。
后面尝试把 gdb升级到 7.6, 还是必须这样配置才能找到。
不过 libstdc++.so.6.0.17-gdb.py 这个文件放在 /usr/local/lib64下,用ldconfig的时候会报warning,not a elf file.
不过 gcc默认是安装在这个目录的,网上也看见有讨论的,但是目前好像只能放这里,gdb才会正确的加载。
3) 如果还是想坚持将 2 中的objfile-gdb.py 移动到 /usr/share/gdb/auto-load目录下,
那么还是有一个办法
在 .gdbinit 中这样写 就可以了
python
import sys
sys.path.insert(0, '/usr/local/gcc-4.7.3/python/')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
相当于手动调用 gcc提供的 pretty printer 。
在更新pretty printer 版本时,也可以这样使用
=========================================
参考文献
https://sourceware.org/gdb/current/onlinedocs/gdb/Writing-a-Pretty_002dPrinter.html#Writing-a-Pretty_002dPrinter
阅读(1643) | 评论(0) | 转发(0) |