【问题现象】
《OrangeS一个操作系统的实现》 第9章 a目录下的代码编译运行后,所有printf打印数字的地方都有问题,如下图:
HD size 始终为 0MB。
【问题分析】
通过断点,发现printf第61行:
int printf(const char *fmt, ...) 函数中
va_list arg = (va_list)((char*)(&fmt) + 4);
并没有得到正确的va_list arg的地址。
通过单独用C语言gdb分析,发现arg进入变长函数后减少了292个字节。
因此造成地址不正确。
【问题解决】
为什么会偏移292个字节,猜想应该是编译器干的,那么如果加上这292个字节,是不是问题就能得到解决?
亲自做试验:
在vsprintf.c文件中
PUBLIC int vsprintf(char *buf, const char *fmt, va_list args)函数中
第48行,修改为:
va_list p_next_arg = args + 292;
再试验,正确的打印出了数字,问题解决了!!!
如下图: