(2)需要有gcc

[danni@vm-xxx-18 develop]$ gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18)

(3)需要有gdb。并且在gdb安装的时候需要设置python选项。确保GDB版本为 7.0或更高版本 ,这样它支持Python脚本。

[danni@vm-bestgame-18 ~]$ gdb --version
GNU gdb (GDB) 7.4.1



支持查看STL类型的数据的查看的gdb安装
(1)完成基本的gdb安装

wget http://ftp.gnu.org/gnu/gdb/gdb-7.4.1.tar.gz
tar xvzf gdb-7.4.1.tar.gz
cd gdb-7.4.1
./configuration --with-python='/usr/bin/python'

通过操作 ./configuration -h 可以发现并没有发现 --with-python 的安装选项,不过可以自己加上这个安装选项,可以通过 which python 找到python的执行路径,通过 --with-python='/usr/bin/python' 来设置的python的路径
查看python所在的地址:

[danni@vm-xxx-18 gdb-7.4.1]$ which python
/usr/bin/python



(2)激活python的gdb功能
首先checkout: svn checkout svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python stlprettyprinter
并在用户目录( cd ~ )下编写 .gdbinit 文件,其中 sys.path.insert(0, '/home/danni/stlprettyprinter') 中的路径即为你svncheckout的目录

[danni@vm-xxx-18 ~]$ cd ~
[danni@vm-xxx-18 ~]$ vim .gdbinit
python
import sys
sys.path.insert(0, '/home/danni/stlprettyprinter')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)



(3)如果现在你的gdb可以查看string类型,可以查看vector类型,但是不能查看map类型的数据,则需要检查你的gcc版本
如果你的gcc版本小于4.7,则需要使用另一个printer.py文件替换刚才checkout的文件

[danni@vm-xxx-18 v6]$ cd ~/stlprettyprinter/libstdcxx/v6
[danni@vm-xxx-18 v6]$ rm printers.py
[danni@vm-xxx-18 v6]$ wget https://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch/libstdc++-v3/python/libstdcxx/v6/printers.py



实例演示
首先编写一个测试文件:

#include <string>
#include <vector>
#include <map>
using namespace std;
int main()
    string a("test string");
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    map<int,int> iMap;
    iMap.insert(make_pair(1,2));
    return 0;

通过 b xxx 进行断点,通过 r 运行程序,通过 p 查看对象的值

[danni@vm-bestgame-18 testStr]$ g++ -g Test.cpp 
[danni@vm-bestgame-18 testStr]$ gdb ./a.out 
GNU gdb (GDB) 7.4.1
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/danni/testStr/a.out...done.
(gdb) b main
Breakpoint 1 at 0x400ae2: file Test.cpp, line 7.
(gdb) r
Starting program: /home/danni/testStr/a.out 
Breakpoint 1, main () at Test.cpp:7
7           string a("test string");
(gdb) n
9           vector<int> v;
(gdb) p a
$1 = "test string"
(gdb) n
10          v.push_back(1);
(gdb) n
11          v.push_back(2);
(gdb) p v
$2 = std::vector of length 1, capacity 1 = {1}
(gdb) n
13          map<int,int> iMap;
(gdb) n
14          iMap.insert(make_pair(1,2));
(gdb) n
16          return 0;
(gdb) p iMap
$3 = std::map with 1 elements = {[1] = 2}
(gdb) 
#define FOR(n) for(int i=0;i<n;++i) #define FORE(n) for(int i=1;i<=n;++i) #define Fore(a,b) for(int i=a;i<=b;++i) int n, v, ans, tmp; 有的gdb版本不支持打印mapstl,因此需要插件,在网上找到一个插件,进入gdb,source该文件即可。之后通过pmap(pvector等)可以获取打印map的提示,下面是工具代码,保存下,方便以后使用。 # ... 函数.apply(新的this,[参数1,参数2])//参数都是给函数传递参数 apply第二个参数,可以是数组或类数组。call()、apply()、bind()—Function.prototype上的方法(函数能使用)函数.call(新的this,参数1,参数2,…函数.bind(新的this,参数1,参数2,…事件委托: 将绑定事件的方法委托给祖先元素,减少事件的绑定,提高性能。构造函数的原型对象的成员 公有成员 公有属性与公有方法。实例对象上的私有成员 私有成员 私有属性与私有方法。 从这里下载一个gdb脚本:http://sourceware.org/gdb/wiki/STLSupport  启动gdb之后,用 source stl-views.gdb 把这个脚本包含进来,  然后就可以用 pmap 命令打印 map 的内容了。 GDB 是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行 序列,形成脚本。UNIX 下的软件全是命令行的,这给程序开发提供了极大的便利,命令行 软件的优势在于,他们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可 以做出一个非常强大的功能。 开发板没有gdb,写程序老出错而且找不到问题在哪里。于是痛定思痛,决定移植一个gdb。 交叉编译器:arm-none-linux-gnueabi gdb依赖于ncurses,所以先移植ncurses: 下载ncurses-5.9 下载地址:http://ftp.gnu.org/gnu/ncurses/ 下载完成后解压: (1)tar -zxvf ncurses-5.9.tar.gz //解压到当前目录下 (2)cd ncurses-5.9 //进入解压后目录 (3)./configure –host=arm-none-linux-gnueabi –prefix=$PWD/install –wi $ file processs_name $ b __brk 给进程分配内存时,在内核设置的断点 $ !cat /proc/pid/maps 查看进程空间位置 //加了叹号可用linux cmd $ i shared 看各模块内存的分配 $ !readelf -h $ !readelf -S 看section $ info registers 看寄存器 $ help info registers ...... 什么叫多次作案,时间段如何划分2017-11-17 11:45:00更新在平常的生活中我们知道,作案的手段有非常的多而且作案的方式也有很多,其中就有结伙作案、共同犯罪、多次作案等等。尤其是对于多次作案的多次到底是几次,以及作案的时间是多久,大多数人还不清楚。那么什么叫多次作案时间段如何划分,下面华律网的小编为您整理了相关内容,来为您解答。车辆乱停放算交通违章吗车辆交通2019-09-10 12:4... 1、Introduce a new variable instead of reusing the parameter "prefixKey" 不要用传递过来的参数去重新赋做判断等 可以新建一个参数 等于传递过来的参数 用新的参数去操作 private String getBatchSaveKey(Map<String, String> map, String prefixKey, String... keys) {undefined //创建一个newPrefix...