Chinaunix首页 | 论坛 | 博客
  • 博客访问: 537612
  • 博文数量: 80
  • 博客积分: 1496
  • 博客等级: 上尉
  • 技术积分: 1292
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-18 11:24
个人简介

IT码农一个~

文章分类

全部博文(80)

文章存档

2020年(3)

2019年(7)

2017年(1)

2016年(2)

2015年(2)

2014年(26)

2013年(26)

2012年(2)

2011年(1)

2010年(1)

2008年(9)

我的朋友

分类: LINUX

2013-11-22 18:00:08

在我们使用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) |
给主人留下些什么吧!~~