zoukankan      html  css  js  c++  java
  • 如何快速定位一个函数的返回点(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版本。

  • 相关阅读:
    【python练习】选课系统(基于面向对象的)
    【面向对象】类的特殊成员方法
    【面向对象】属性方法
    【面向对象】类方法
    【面向对象】静态方法
    【python练习】计算器(使用正则表达式实现)
    【面向对象】多态
    【面向对象】新式类和旧式类的区别
    re.findall()正则表达式中括号的坑
    您真的了解javaScript?(2)
  • 原文地址:https://www.cnblogs.com/taoxu0903/p/1769596.html
Copyright © 2011-2022 走看看