跟踪与调试

/*
    许多C++程序员在跟踪代码时通常的做法是,定义一个简单的Trace类将诊断信息打印到日志文件中。程序员
可以在每个想要跟踪的函数中定义一个Trace对象,在函数的入口和出口Trace类可以分别写一条信息。
    缺点:增加程序开销,必须重新编译程序来打开或关闭跟踪。
    我的博客:
http://blog.csdn.net/windows_nt
*/

class Trace
{
public:
	Trace(const CString &name);
	~Trace();
	void debug(const CString &msg);
	static BOOL traceIsActive;
private:
	CString theFunctionName;
};

//合适的地方做初始化
BOOL Trace::traceIsActive = TRUE;

Trace::Trace(const CString &name) : theFunctionName(name)
{
	if (traceIsActive)
	{
		OutputDebugString(L"Enter function: " + name + L"\n");
	}
}

void Trace::debug(const CString &msg)
{
	if (traceIsActive)
	{
		OutputDebugString(msg);
	}
}

Trace::~Trace()
{
	if (traceIsActive)
	{
		OutputDebugString(L"Exit function: " + theFunctionName + L"\n");
	}
}

//以上的代码存在性能问题,优化版:
class Trace
{
public:
	Trace(const TCHAR* name, ... );
	~Trace();
	void debug(const TCHAR* msg);

	static BOOL traceIsActive;
private:
	CString* theFunctionName;
};

//合适的地方做初始化
BOOL Trace::traceIsActive = TRUE;

inline Trace::Trace(const TCHAR* name, ... ) : theFunctionName(NULL)
{
	va_list args;
	va_start(args, name);

	CString csMsg;
	csMsg.FormatV(name, args);
	va_end(args);  

	if (traceIsActive)
	{
		CString strOutput; 
		strOutput.Format(L"Enter function: %s\n", csMsg );
		OutputDebugString (strOutput);
		theFunctionName = new CString(csMsg);
	}
}

void Trace::debug(const TCHAR* msg)
{
	if (traceIsActive)
	{
		OutputDebugString( *msg + L"\n");
	}
}

inline Trace::~Trace()
{
	if (traceIsActive)
	{
		OutputDebugString(L"Exit function " + *theFunctionName + L"\n");
		delete theFunctionName;
	}
}

//调用方式
{
#ifdef MyDebug
	TCHAR pOutputchar[] = L"OnBnClickedOk()";
	TCHAR pOutputchar2[] = L"OnBnClickedOk2()";
	Trace trace(_T("参数1:%s,参数2:%s"), pOutputchar, pOutputchar2);
#endif
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在安全网上逛的时候,突然发现一篇很好的文章!详细阐述了当前流行的api hook技术,rootkit技术和主动防御技术,涉及到深入的操作系统知识,需要一定的功底才能看懂,真的很不错,可以说是一篇难得的教程!现摘选如下: 一. 黑匣子的原理 对于一般用户而言,一个程序从开始运行直到结束,这期间内都做过什么,并不是我们需要关心的事情,他们只要听到播放器里的音乐、看到电影画面、和远方的朋友用通讯工具聊天就可以了,有谁会去关心从用户点击播放器程序图标到音乐响起的时间里,这个程序具体做了什么事情呢?然而,如果面对的程序是恶意软件之流,用户就不得不关心一下它到底对自己的计算机造成什么影响了。 程序在运行期间所进行的操作被称为“程序行为”(Action),一般泛指程序进行的相对表现较明显的操作,例如创建读写文件、访问注册表、连接网络等,而在这些操作之外做的程序内部运算、判断、逻辑等操作并不是我们需要关心的,除非是对它进行复杂的分析如逆向工程。对程序行为进行监视记录的过程就是“跟踪”(Tracing),如果要进一步深入,则要使用调试器(Debugger)环境进行汇编级的指令分析,这就是“调试”(Debugging),也可视为更全面的跟踪,因为调试过程可观察到整个程序里的运算和每一步过程。 也许很多用户会觉得,这些复杂技术距离我们很远,甚至会想像为需要复杂设备和程序才能完成,其实,这些技术的应用范围,一直就在我们身边。如果你正在使用一款防毒产品,那么你系统里执行的程序就已经处于被记录行为的状态了;如果你使用HIPS产品,就会更强烈的感受到程序运行被监视着;如果你正在使用调试器,那就不用我说了吧…… 在Windows系统里,至少有三种技术可以实现程序行为的记录,甚至控制程序的某些行为,分别是“虚拟机”(VM)、“API钩子”(API Hooking)和“API跟踪”(API Tracing)。 应用广泛的虚拟机技术 经常提到的虚拟机技术有两种,一种是普遍应用上的虚拟机技术,它是通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,此类虚拟机的概念比较广泛,可以是一种使用软件模拟一个完整的计算机硬件环境技术如VMWare,也可以是介于硬件和编译程序之间的交互介质,如Java虚拟机等;另一种则是反病毒产品中使用的“通用解密器”技术,为了检测一些复杂或者代码加密的病毒,杀毒引擎必须让它运行起来以便自我暴露危险程序行为,但是如果病毒真的在用户计算机里运行了,就违背反病毒产品的初衷了,因此反病毒产品也采取了一种虚拟环境检测方法,这就是虚拟机技术,但是这个技术并非是为病毒提供一套计算机仿真系统,这样就太庞大复杂和消耗资源了,这种虚拟机是指杀毒引擎模拟出一个仿真CPU,这个“CPU”具备和真正CPU等同的指令分析功能,杀毒引擎将待检测的程序代码读入“CPU”中逐条指令循环执行,直到出现特定情况才结束工作,在这个过程中探知程序是否具备病毒行为特征或者暴露出病毒特征码。这就是杀毒引擎的“虚拟机技术”,它的目的就是让程序文件在没有实际运行的情况下得到运行后的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值