《coredump问题原理探究》Linux x86版7.8节vector相关的iterator对象

原创 2015年07月09日 20:06:19

在前面看过了一个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.10节set相关的iterator对象

看一下set的iterator.由于map和set的相似性,只要看set就可以了. 1 #include 2 3 void init( std::set& set ) 4 { 5 ...
  • xuzhina
  • xuzhina
  • 2015年11月20日 23:48
  • 1152

《coredump问题原理探究》Linux x86版7.1节vector对象

先看一下例子: 1 #include 2 3 int main() 4 { 5 std::vector vec; 6 vec.push_back( 0xff...
  • xuzhina
  • xuzhina
  • 2015年02月25日 22:55
  • 1094

《coredump问题原理探究》Linux x86版7.11节string对象

在定位map coredump的那一节已经接触了string对象.在这里重温一下. 看一个例子: 1 #include 2 #include 3 4 int main() ...
  • xuzhina
  • xuzhina
  • 2015年11月24日 22:51
  • 1519

《coredump问题原理探究》Linux x86版7.7节 set对象

看一下bits/stl_map和bits/stl_set可以看到map和set的定义如下: 84 template , 85 typename _Alloc =...
  • xuzhina
  • xuzhina
  • 2015年07月04日 22:25
  • 1510

《coredump问题原理探究》Linux x86版7.3节List对象

先看一下例子: 1 #include 2 3 int main() 4 { 5 std::list lst; 6 7 lst.push_back( 0x...
  • xuzhina
  • xuzhina
  • 2015年04月23日 23:06
  • 1036

《coredump问题原理探究》Linux x86版7.5节 Map对象

先看一个例子:          1 #include 2 3 int main() 4 { 5 std::map iMap; 6 7 iMa...
  • xuzhina
  • xuzhina
  • 2015年04月27日 23:37
  • 1052

《coredump问题原理探究》Linux x86版7.2节vector coredump例子

看一个coredump的例子: [xuzhina@localhost s1_ex]$ gdb xuzhina_dump_c07_s1_ex core.27776 GNU gdb (GDB) Red...
  • xuzhina
  • xuzhina
  • 2015年04月21日 23:04
  • 1330

《coredump问题原理探究》Linux x86版4.1节函数的逆向之序言

在产品的生命周期中,会遇到各种coredump,如果在调试版本出现coredump,定位它是非常简单的事情,因为从栈就可以知道是哪一行代码出现了问题。如: (gdb) bt #0 0x4365b5...
  • xuzhina
  • xuzhina
  • 2013年01月30日 21:53
  • 2376

《coredump问题原理探究》Linux x86版3.6节栈布局之gcc内嵌关键字

在intel CPU平台下,可以在代码加上__attribute__((regparm(number ) ) )指定函数调用时通过寄存器eax,edx,ecx来传递参数。其中number就是指定有多少...
  • xuzhina
  • xuzhina
  • 2013年01月23日 19:57
  • 2692

《coredump问题原理探究》Linux x86版6.2节C++风格数据结构内存布局之有成员变量的类

上面一节已经探究出this指针的辨别,由this指针就可以看到类的内容。在这里,就由this指针来看一下类的成员变量是如何排列。 先看一个例子 1 #include 2 class x...
  • xuzhina
  • xuzhina
  • 2014年11月30日 10:13
  • 1105
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《coredump问题原理探究》Linux x86版7.8节vector相关的iterator对象
举报原因:
原因补充:

(最多只允许输入30个字)