Code Bye

gdb貌似会影响运行过程中eax的值,为何

“printf”的返回值是实际打印的字符的个数,有一个小程序
#include<stdio.h>
int main()
{
  printf("1");
  printf("55555");
  printf("10________");
  printf("13___________");
  printf("18________________");
  printf("28__________________________");
  return 0;
}

它会打印
15555510________13___________18________________28__________________________
然后本人用gdb来调试,查看每步之后,printf是不是把返回值放到$eax里面了:

(gdb) b main
Breakpoint 1 at 0x804844c: file testp.c, line 4.
(gdb) r
Starting program: /home/a/cpp/a.out 
Breakpoint 1, main () at testp.c:4
4	  printf("1");
(gdb) n               # 本人认为将会把"1"放入eax
5	  printf("55555");
(gdb) p $eax          # 和本人的预期不一致
$1 = 49
(gdb) n
6	  printf("10________");
(gdb) p $eax          # 符合预期
$2 = 5
(gdb) n
7	  printf("13____________");
(gdb) p $eax          # 符合预期
$3 = 10

本人认为c语言的abi是规定了函数的返回值放到eax寄存器(x86架构),那么为什么第一次p $eax不符合本人的预期,后面才符合预期?
谢谢。

解决方案

40

printf 的返回值的含义参看:http://en.cppreference.com/w/c/io/fprintf

20

要确认当前eip的值是在刚执行完printf函数之后。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明gdb貌似会影响运行过程中eax的值,为何