关于调试时输出的字符串信息

使用工具:VC6.0,IDA

当我们要在程序中输出调试信息时,常常以字符串的形式来输出,例如:

printf("Some debug information here!\n");

这段代码在Debug和Release版下都输出调试信息,这不是我们所要的,一般地大家都会添加预编译指令,如下所示:

#if _DEBUG 
   printf("Some debug information here!\n");
   #endif

这样就达到了在Debug版里程序输出调试信息,在Release版下不输出调试信息的目的。(在Release版里连printf函数都没有调用)可如果要在程序里的许多地方输出调试信息,若采用上面的方式会很麻烦;

(至于为什么麻烦,可能就是不愿多敲几次键盘吧,呵呵。。。)

于是大家都想到写个输出函数,代码如下:

void printInfo(char *strInfo)
   {
   #if _DEBUG
     printf(strInfo);
   #endif
   }

注:该函数只是演示用的,很简单,没有其他检查字符串功能。

在要输出调试信息的地方,调用如下语句就行:

printInfo("Some debug information here!\n");

确实,在Debug模式下运行该程序,则输出如下信息:

Some debug information here!

在Release模式下,则没输出什么信息;

我们往往在这个时候认为一切都OK了;如果你认为是,就没必要往下看了;呵呵。。。

虽然在Release版下运行程序没有输出调试信息来,可这些调试信息却留在了二进制的可执行文件里;

我们可以用IDA来打开该Release版的可执行文件,看到如图一所示的信息:


图一:IDA反汇编后的main函数

注:该函数就是main函数

时间: 2024-10-18 11:36:08

关于调试时输出的字符串信息的相关文章

android真机调试时无法显示logcat信息的解决方法介绍

以下是对android真机调试时无法显示logcat信息的解决方法进行了详细的分析介绍,需要的朋友可以过来参考下   android真机调试时无法显示logcat信息的解决方法介绍: window-->show view-->android->devices, 打开devices,点击右边的截屏图片的按钮.等到出现截图的时候,logcat就出来信息了!

android真机调试时无法显示logcat信息的解决方法介绍_Android

android真机调试时无法显示logcat信息的解决方法介绍: window-->show view-->android->devices, 打开devices,点击右边的截屏图片的按钮.等到出现截图的时候,logcat就出来信息了!

android真机调试时无法显示logcat信息的解决办法

android真机调试时无法显示logcat信息的解决办法: window-->show view-->android->devices, 打开devices,点击右边的截屏图片的按钮.等到出现截图的时候,logcat就出来信息了!

android-为什么安卓真机调试时,logcat会不断输出信息,除了过滤外,能不能从源头上解决这个问题。

问题描述 为什么安卓真机调试时,logcat会不断输出信息,除了过滤外,能不能从源头上解决这个问题. 为什么安卓真机调试时,logcat会不断输出信息,除了过滤外,能不能从源头上解决这个问题. 解决方案 好像不能Logcat 是所有应用调试的输出,源头是其它应用或系统在调用它,你能限制这些源头吗? 解决方案二: 你能阻止自己App的log,你还能阻止别人的log? 解决方案三: log当然是要不断输出的啊 不然干嘛叫log呢?

让SQL Server 2008 R2在查询时输出信息

环境:SQLServer 2008 R2 问题:在查询时输出信息 解决: 一:使用print函数. 如: print 'HelloWorld'; 当然,print函数不仅能够打印字符串,还可以打印整型数据或者浮点型数据. 如: print 27; print 39.27; print 0.11111111111111111111; 二:变通的方法,通过系统表查询获得输出信息. select * from sysobjects; select 'HelloWorld' from sysobject

visual studio 调试时,下面的“输出”窗口的作用是?

问题描述 visual studio 调试时,下面的"输出"窗口的作用是? 我知道在程序里写:debug.print(""啦啦啦""),可以在"即时窗口"里输出"啦啦啦".但是,边上还有一个"输出"窗口,里面还能设置:"显示输出来源",分为三种:代码段输出,生成,调试.我想问下:1.什么代码可以在这个窗口输出?2.三个分类又是什么区别? 解决方案 无标准输出窗口调试的

javascript-刚学js数组,用js写一个学生信息,当读取学生信息里一个对象时,输出其全部信息

问题描述 刚学js数组,用js写一个学生信息,当读取学生信息里一个对象时,输出其全部信息 刚学js数组,用js写一个学生信息,当读取学生信息里一个对象时,输出其全部信息 解决方案 http://blog.csdn.net/lxp1021/article/details/6632678 解决方案二: <script> function Student(name,classname){ this.name = name; this.class = classname; this.toString

c语言-vs2015编写c++调试时错误未找到xx.exe文件

问题描述 vs2015编写c++调试时错误未找到xx.exe文件 vs2015编写c++调试时错误未找到xx.exe文件,在win10系统上.是未生成吗 解决方案 是的,在查看-窗格中打开输出窗格,看下有没有报错. 解决方案二: 编译成功以后再运行 解决方案三: 编译有没有成功,请看一下输出窗体中的信息. 如果编译成功了,则先查查工程的设置中,编译生成的目录设置与运行 EXE 的路径是否相同? 如果相同,则可能是你的 EXE依赖于某个 LIB或 DLL 但找不到. 解决方案四: 可能是你的文件没

GDB秘技--调试时执行代码中的特定函数

        在使用GDB调试程序时,有时遇到看到数据不知所云,必须对照定义才能看懂, 有时还要做些运算才能看出来,这样效率显然不高. 如果需要查看一个变量类的当前值,简单的数据类型还好说,如果遇到一些枚举型的变量或特殊条件,想要看到清晰的数据输出,就会比较繁琐. 好在GDB提供了一个调试时执行某个函数的功能:call, 在需要时能帮你解决大问题.         举个简单的例子,如果有一个类定义了一个dump方法, 在调用时或者在类的内部,都可以在你想要看看数据时,使用call执行一下: a