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

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

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

1bool bSuccess = LongFunction();
2assert(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版本。

转载于:https://www.cnblogs.com/taoxu0903/archive/2010/07/02/1769596.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值