在VS2010中使用printf打印信息

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gaofeng79/article/details/53212586

由于本人在编写C/C++代码是习惯于使用printf函数打印信息,但在使用VC++2010编写代码调试时,printf打印的语句无法显示,在网上查了些方法,如果打印信息到“输出”窗口可以使用OutputDebugString函数,但只能输出字符串,无法使用我们常用的格式化输出,所以就封装了一个打印函数,函数代码如下:

 

#define PRINT_BUF_SIZE 1024

extern "C"int dprintf(constchar *format,...)

{

         charbuf[PRINT_BUF_SIZE]; int i;

 

         va_list vlist;

         va_start(vlist,format);

         i=vsprintf(buf,format,vlist);

         va_end(vlist);

 

         OutputDebugString(buf);

         returni;

}

 

如果仍想使用printf函数名,可在相关的头文件内做如下定义:

#define printf dprintf
展开阅读全文

VS2010中的printf有bug

08-29

[b]小弟学过一点16位汇编,现在刚学了2天C语言,根据朋友反映,在VS2010中发现如下问题,由于我系C刚学2天的新手,有分析不到位的地方,请大侠们批评指正。[/b]rnrnprintf("%d,%d,%d,%d,%d,%d\t\t",++i,--i,i++,i--,-i++,-i--);rn在这个函数中,若设 i初始为8rn则输出结果为 8,8,7,8,-7,-8 rnrn我们在调试中,将printf("%d,%d,%d,%d,%d,%d\t\t",++i,--i,i++,i--,-i++,-i--);反汇编,得到如下代码:rn011C34A5 mov eax,dword ptr [i] rn011C34A8 neg eax rn011C34AA mov dword ptr [ebp-0D0h],eax rn011C34B0 mov ecx,dword ptr [i] rn011C34B3 sub ecx,1 rn011C34B6 mov dword ptr [i],ecxrn rn011C34B9 mov edx,dword ptr [i] rn011C34BC neg edx rn011C34BE mov dword ptr [ebp-0D4h],edx rn011C34C4 mov eax,dword ptr [i] rn011C34C7 add eax,1 rn011C34CA mov dword ptr [i],eaxrn rn011C34CD mov ecx,dword ptr [i] rn011C34D0 mov dword ptr [ebp-0D8h],ecx rn011C34D6 mov edx,dword ptr [i] rn011C34D9 sub edx,1 rn011C34DC mov dword ptr [i],edxrn rn011C34DF mov eax,dword ptr [i] rn011C34E2 mov dword ptr [ebp-0DCh],eax rn011C34E8 mov ecx,dword ptr [i] rn011C34EB add ecx,1 rn011C34EE mov dword ptr [i],ecx rnrn rn011C34F1 mov edx,dword ptr [i] rn011C34F4 sub edx,1 rn011C34F7 mov dword ptr [i],edx rn011C34FA mov eax,dword ptr [i] rn011C34FD add eax,1 rn011C3500 mov dword ptr [i],eax rn011C3503 mov esi,esp rn011C3505 mov ecx,dword ptr [ebp-0D0h] 8rn011C350B push ecx rn011C350C mov edx,dword ptr [ebp-0D4h] rn011C3512 push edx rn011C3513 mov eax,dword ptr [ebp-0D8h] rn011C3519 push eax rn011C351A mov ecx,dword ptr [ebp-0DCh] rn011C3520 push ecx rn011C3521 mov edx,dword ptr [i] rn011C3524 push edx rn011C3525 mov eax,dword ptr [i] rn011C3528 push eax rn011C3529 push offset string "%d\n%d\n%d\n" (11C59F8h) rn011C352E call dword ptr [__imp__printf (11C82B0h)] rn011C3534 add esp,1Ch rn011C3537 cmp esi,esp rn011C3539 call @ILT+295(__RTC_CheckEsp) (11C112Ch) rnrn分析如下:rn从反汇编代码来看,vs2010中对printf函数的上述参数中,是从右到左运算的,即先运算-i--,然后-i++,依次到左,对上述汇编代码分别分析如下rn(1) -i-- rn011C34A5 mov eax,dword ptr [i] rn011C34A8 neg eax rn011C34AA mov dword ptr [ebp-0D0h],eax rn011C34B0 mov ecx,dword ptr [i] rn011C34B3 sub ecx,1 rn011C34B6 mov dword ptr [i],ecxrn先求变量的相反数,保存变量用于输出,然后将初始变量-1(i=7),保存到变量里,用于下次计算;rn(2)-i++rn011C34B9 mov edx,dword ptr [i] rn011C34BC neg edx rn011C34BE mov dword ptr [ebp-0D4h],edx rn011C34C4 mov eax,dword ptr [i] rn011C34C7 add eax,1 rn011C34CA mov dword ptr [i],eax rn同样道理,无非最后是+1,i=8rn(3)i--rn011C34CD mov ecx,dword ptr [i] rn011C34D0 mov dword ptr [ebp-0D8h],ecx rn011C34D6 mov edx,dword ptr [i] rn011C34D9 sub edx,1 rn011C34DC mov dword ptr [i],edx rn上一步的i=8吧,这里就是,将8保存用于显示,然后-1,保存用于下次运算(i=7)rn(4)i++rn011C34DF mov eax,dword ptr [i] rn011C34E2 mov dword ptr [ebp-0DCh],eax rn011C34E8 mov ecx,dword ptr [i] rn011C34EB add ecx,1 rn011C34EE mov dword ptr [i],ecx rn保存上次的7用于显示输出,后+1(i=8)用于下次运算rn(5)011C34F1 mov edx,dword ptr [i] rn011C34F4 sub edx,1 rn011C34F7 mov dword ptr [i],edx rn011C34FA mov eax,dword ptr [i] rn011C34FD add eax,1 rn011C3500 mov dword ptr [i],eaxrn问题就出在这里了,这里它把第一、第二2个一起运算了,而且都保存在地址[i]里,因此造成第一、第二两个值一样,而本应该是不一样的。问题就在于没有象前面那样单独保存到一个独立的内存地址中去,因此在后面压栈后调用显示函数时,造成第一和第二个数值一致了。(PS:而且其在压栈时,对第一个、第二个数值结果也是压栈同一个内存地址的数值)rnrn我觉得这不是计算顺序的问题,而是一个bug问题了。按从右到左来计算的话,正确的值应该是:rn8,7,7,8,-7,-8 论坛

Linux字符设备驱动疑难问题--printf打印信息发到字符设备write函数中

09-07

我在开发中遇到一个奇怪的问题:rn1、创建了一个字符设备驱动,为其注册了open、read、write、poll等函数;rn2、创建了一个用户空间程序,用来打开1中的字符设备驱动,为的是传递命令到用户空间程序进行处理;rn3、当PC端发送一个请求,我们受到后会将其放到请求列表ctrl_list中;rn4、字符设备的read函数会循环检测ctrl_list中有没有控制请求,当有控制请求的时候,会通过copy_to_user发送到用户空间程序中;rn5、用户空间程序解析4中的请求并执行处理,处理完成后发送结果,在用户空间调用write,我们的请求处理结果最大50字节;rn6、在字符设备驱动的write函数中,会出现被写入4096或1024字节数据的情况(依平台不同有所变化),这个是一页的数据;rn7、上述一页的数据是我们用户空间程序中所有printf语句的打印信息,并被发送到PC侧,可以从打印log看出;rn8、我们通过在内核加panic和在用户空间加指针误操作进行追踪,发现上述4096字节的数据不是我们的用户空间程序调用的,从panic看是文件系统自己调用,并把printf的打印发过去,出现这种情况时,用户空间的打印不会在串口打印出来;rnrnrn麻烦大家看下有没有遇到过这种问题,为什么会被莫名其妙调到;rnrn不方便贴代码;rnrn谢谢 论坛

没有更多推荐了,返回首页