《coredump问题原理探究》Linux x86版7.8节vector相关的iterator对象
在前面看过了一个vectorcoredump的样例,接触了vector的iterator,能够知道vector的iterator仅仅有一个成员_M_current指向vector某一个元素.
先看一个样例:
1 #include <vector>
2
3 void init( std::vector<int>& vec )
4 {
5 for ( int i = 0; i < 0x10; i++ )
6 {
7 vec.push_back( i );
8 }
9 }
10
11 int getSum( std::vector<int>& vec )
12 {
13 std::vector<int>::iterator iter;
14 int result = 0;
15
16 for ( iter = vec.begin(); iter != vec.end(); iter++ )
17 {
18 result += *iter;
19 }
20
21 return result;
22 }
23
24 int main()
25 {
26 std::vector<int> vec;
27 init( vec );
28
29 return getSum( vec );
30 }
因为仅仅是考察iterator,仅仅看getSum的汇编:
(gdb) disassemble getSum
Dump of assembler code for function _Z6getSumRSt6vectorIiSaIiEE:
0x080486cd <+0>: push %ebp
0x080486ce <+1>: mov %esp,%ebp
0x080486d0 <+3>: sub $0x38,%esp
0x080486d3 <+6>: lea -0x18(%ebp),%eax
0x080486d6 <+9>: mov %eax,(%esp)
0x080486d9 <+12>: call 0x8048840 <_ZN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEC2Ev>
0x080486de <+17>: movl $0x0,-0xc(%ebp)
0x080486e5 <+24>: lea -0x1c(%ebp),%eax
0x080486e8 <+27>: mov 0x8(%ebp),%edx
0x080486eb <+30>: mov %edx,0x4(%esp)
0x080486ef <+34>: mov %eax,(%esp)
0x080486f2 <+37>: call 0x804884e <_ZNSt6vectorIiSaIiEE5beginEv>
0x080486f7 <+42>: sub $0x4,%esp
0x080486fa <+45>: mov -0x1c(%ebp),%eax
0x080486fd <+48>: mov %eax,-0x18(%ebp)
0x08048700 <+51>: jmp 0x804872f <_Z6getSumRSt6vectorIiSaIiEE+98>
0x08048702 <+53>: lea -0x18(%ebp),%eax
0x08048705 <+56>: mov %eax,(%esp)
0x08048708 <+59>: call 0x80488f8 <_ZNK9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEdeEv>
0x0804870d <+64>: mov (%eax),%eax
0x0804870f <+66>: add %eax,-0xc(%ebp)
0x08048712 <+69>: lea -0x10(%ebp),%eax
0x08048715 <+72>: movl $0x0,0x8(%esp)
0x0804871d <+80>: lea -0x18(%ebp),%edx
0x08048720 <+83>: mov %edx,0x4(%esp)
0x08048724 <+87>: mov %eax,(%esp)
0x08048727 <+90>: call 0x80488c4 <_ZN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEppEi>
0x0804872c <+95>: sub $0x4,%esp
0x0804872f <+98>: lea -0x14(%ebp),%eax
0x08048732 <+101>: mov 0x8(%ebp),%edx
0x08048735 <+104>: mov %edx,0x4(%esp)
0x08048739 <+108>: mov %eax,(%esp)
0x0804873c <+111>: call 0x8048872 <_ZNSt6vectorIiSaIiEE3endEv>
0x08048741 <+116>: sub $0x4,%esp
0x08048744 <+119>: lea -0x14(%ebp),%eax
0x08048747 <+122>: mov %eax,0x4(%esp)
0x0804874b <+126>: lea -0x18(%ebp),%eax
0x0804874e <+129>: mov %eax,(%esp)
0x08048751 <+132>: call 0x8048898 <_ZN9__gnu_cxxneIPiSt6vectorIiSaIiEEEEbRKNS_17__normal_iteratorIT_T0_EESA_>
0x08048756 <+137>: test %al,%al
0x08048758 <+139>: jne 0x8048702 <_Z6getSumRSt6vectorIiSaIiEE+53>
0x0804875a <+141>: mov -0xc(%ebp),%eax
0x0804875d <+144>: leave
0x0804875e <+145>: ret
End of assembler dump.
在0x0804874b打断点.由上面汇编可知,iter的this指针是ebp-0x18,而vec的this指针放在ebp+0x8.
运行到断点处,看一下vec的内容:
(gdb) x $ebp+8
0xbffff5a0: 0xbffff5b4
(gdb) x /4x 0xbffff5b4
0xbffff5b4: 0x0804b068 0x0804b0a8 0x0804b0a8 0x080491f0
(gdb) x /16x 0x0804b068
0x804b068: 0x00000000 0x00000001 0x00000002 0x00000003
0x804b078: 0x00000004 0x00000005 0x00000006 0x00000007
0x804b088: 0x00000008 0x00000009 0x0000000a 0x0000000b
0x804b098: 0x0000000c 0x0000000d 0x0000000e 0x0000000f
看一下iter的内容怎样变化,运行完几次c命令之后(注意,断点地址在运行iter++之后):
Breakpoint 1, 0x0804874b in getSum(std::vector<int, std::allocator<int> >&) ()
(gdb) x /4x $ebp-0x18
0xbffff580: 0x0804b068 0x0804b0a8 0x00000001 0x00000000
(gdb) c
Continuing. Breakpoint 1, 0x0804874b in getSum(std::vector<int, std::allocator<int> >&) ()
(gdb) x /4x $ebp-0x18
0xbffff580: 0x0804b06c 0x0804b0a8 0x0804b068 0x00000000
(gdb) c
Continuing. Breakpoint 1, 0x0804874b in getSum(std::vector<int, std::allocator<int> >&) ()
(gdb) x /4x $ebp-0x18
0xbffff580: 0x0804b070 0x0804b0a8 0x0804b06c 0x00000001
(gdb) c
Continuing. Breakpoint 1, 0x0804874b in getSum(std::vector<int, std::allocator<int> >&) ()
(gdb) x /4x $ebp-0x18
0xbffff580: 0x0804b074 0x0804b0a8 0x0804b070 0x00000003
(gdb) c
Continuing. Breakpoint 1, 0x0804874b in getSum(std::vector<int, std::allocator<int> >&) ()
(gdb) x /4x $ebp-0x18
0xbffff580: 0x0804b078 0x0804b0a8 0x0804b074 0x00000006
可见vector的iterator确实仅仅有一个成员_Ptr,它的取值范围是
vec. _M_start <= _M_current < vec. _M_finish
《coredump问题原理探究》Linux x86版7.8节vector相关的iterator对象的更多相关文章
- 《coredump问题原理探究》Linux x86版7.9节list相关的iterator对象
这一节.看一下list的iterator对象在内存的布局 1 #include <list> 2 3 void init( std::list<int>& lst ) ...
- 《coredump问题原理探究》Linux x86版7.7节 set对象
看一下bits/stl_map和bits/stl_set能够看到map和set的定义例如以下: 84 template <typename _Key, typename _Tp, typenam ...
- [原] KVM 虚拟化原理探究(2)— QEMU启动过程
KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...
- 十款最常见的Linux发行版及目标用户(1)
1. Debian Debian运行起来极其稳定,这使得它非常适合用于服务器.Debian平 时维护三套正式的软件库和一套非免费软件库,这给另外几款发行版(比如Ubuntu和Kali等)带来了灵感.D ...
- [原] KVM 虚拟化原理探究(1)— overview
KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...
- [原] KVM 虚拟化原理探究(6)— 块设备IO虚拟化
KVM 虚拟化原理探究(6)- 块设备IO虚拟化 标签(空格分隔): KVM [toc] 块设备IO虚拟化简介 上一篇文章讲到了网络IO虚拟化,作为另外一个重要的虚拟化资源,块设备IO的虚拟化也是同样 ...
- [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化
KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...
- [原] KVM 虚拟化原理探究(3)— CPU 虚拟化
KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要 ...
- 最适合和最不适合新手使用的几款 Linux 发行版
大多数知名的Linux发行版都属于"比较容易使用"这一类.一些观察人士可能会驳斥这个观点,但事实上,说到Linux,大多数并非从事IT或软件开发工作的人会被最容易的使用体验所吸引. ...
随机推荐
- Python中的traceback模块
traceback模块被用来跟踪异常返回信息. 如下例所示: 1.直接打印异常信息 import traceback try: raise SyntaxError, "traceback t ...
- [JavaEE] DWR框架简介
DWR框架简介 DWR框架是一个可以允许你去创建AJAX WEB站点的JAVA开源库.它可以让你在浏览器的JavaScript代码中调用Web服务器的Java代码,就像Java代码在浏览器中一样.DW ...
- php pdo具体操作
0x01:测试PDO是否安装成功 运行如下代码,如果提示参数错误,说明PDO已经安装,如果说明对象不存在,则修改PHP配置文件php.ini,取消php_pdo_yourssqlserverhere. ...
- Hashmap 详解和迭代器问题
重点介绍HashMap.首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.在下文中会 ...
- 详解DevExpress.LookUpEdit控件实现自动搜索定位功能(转)
转载自csdn博客 爱拼才会赢 的博客 地址是详解DevExpress.LookUpEdit控件实现自动搜索定位功能(转)
- 关于FastIo
由于你的驱动将要绑定到文件系统驱动的上边,文件系统除了处理正常的IRP 之外,还要处理所谓的FastIo.FastIo是Cache Manager 调用所引发的一种没有irp 的请求.换句话说,除了正 ...
- DataGridView属性设置汇总
1.标题列居中 外观 ColumnHeadersDefaultCellStyle - Alignment - MiddleCenter 2.表格内容居中 外观 DefaultCellStyle - ...
- 基于Linux/C++简单线程池的实现
我们知道Java语言对于多线程的支持十分丰富,JDK本身提供了很多性能优良的库,包括ThreadPoolExecutor和ScheduleThreadPoolExecutor等.C++11中的STL也 ...
- 应用五:Vue之ElementUI 表格Table与分页Pagination组件化
(注:本文适用于有一定Vue基础或开发经验的读者,文章就知识点的讲解不一定全面,但却是开发过程中很实用的) 在平时的web项目开发过程中,列表分页查询展示应用的很频繁,为了便于阅读并减少代码的冗余,所 ...
- 洛谷P1297 [国家集训队]单选错位_数学期望
考虑第 iii 位, 那么当前共有 a[i]a[i]a[i] 种选项,那么当前选项正确的情况就是下一个被误填的答案与当前答案相同.换句话说,当前答案一共有 a[i]a[i]a[i] 种可能,而下一个答 ...