现在的位置: 首页 > 综合 > 正文

如何快速定位一个函数的返回点(c/c++ Only)

2013年01月03日 ⁄ 综合 ⁄ 共 970字 ⁄ 字号 评论关闭

摘自: 如何快速定位一个函数的返回点

如何快速定位一个函数的返回点,这对于一个比较短小精悍的函数来讲,从来就不是问题,但是假设我们有一个名为LongFunction的1000行长的函数, 调用如下:

1 bool bSuccess = LongFunction();
2 assert(bSuccess);

在运行中第二行弹出一个assert,我们知道肯定是LongFunction内部运行中出了什么问题导致其返回false。那么它内部出了什么问题,是在哪一行出错导致返回的?这恐怕不是一件容易的事,要知道这是一个1000行的函数,而且极有可能有很多的返回点。

我想这应该是我们日常工作中常见的问题,1000行的长函数在一些大型的系统中,老代码中应该还是不少见的。当然,有些朋友会强烈的认为这样的函数必须要 重构,理由是~~~(此处略去500字)。的确,重构的好处是显而易见的,但很多时候由于资源,时间以及复杂度上的考虑,是不被采纳的。所以这里我们不考 虑重构,只想找出一个能快速定位到函数返回点的方法。

作者Dbger对各种可能的方法进行了分析。思路非常好!看下来,个人非常喜欢“返回时析构”的方法(可惜这里只是对c++有效。C#呢?需要进一步思考)。收藏如下:

class ReturnMonitor

2     {
3     ~ReturnMonitor(){}
4     };
5     struct LongFunction()
6     {
7     ReturnMonitor mon;
8     // Function body
9     }

在资源管理中我们经常会用这种方式(RAII),现在我们利用函数返回时会调用析构函数这个特性,在析构函数中设断点,就能在callstack中看到返回点。这还有一个优点就是在LongFunction调用过程中如果出现异常,也能被捕捉。

我们可以定义以下宏:

1 #ifdef _DEBUG
2 #define RETURN_MONITOR ReturnMonitor mon;
3 #else
4 #define RETURN_MONITOR
5 #endif

这样对于我们代码中比较长的,较难调试的长函数,就可以在函数开始加上RETURN_MONITOR,并且不影响release版本。

抱歉!评论已关闭.