调试及递归函数调试之思考.

调试之思考以及递归函数调试之思考! ------------------------------------------------------------ author: hjjdebug date: 2017年 12月 27日 ------------------------------------------------------------ 调试之总结(包活正向调试或逆向调试) 编写->编译->调试 继续简化为编写->调试 或者说修改->调试循环. 调试是修改的基础,调试此时占主导性. 那么何为调试,怎么调试呢? 调试是给定一个输入,必须看到期望的输出. 此时输入是已知的,输出也是已知的, 以此来检查处理的过程. 调试的目标: 工作的目标可以有大目标,小目标,但调试的目标必须是可执行的.调试到指定位置 期望的输出通常是一个或一组数据,一个或一组已知的字符串. 调试的目标也可以设定为程序执行的路径信息,函数参数信息等 我也常常在想,到底到底要怎样调试,达到怎样的目的! 调试的前提: 一般固定的输入容易获得, 期望的输出, 可以通过手工计算,可以通过其它程序计算. 如果有一个正确的路径可以参考,那自然要利用这个拐杖啦! 调试的方法: 具体的方法依赖于调试的环境. 但大体上还是中断,单步,跟踪,及打印log等手段 其中在何处中断,需要技巧.是后续单步的基础. 有时候,需要构建一个小巧的调试模型,过滤掉多余的,不重要的数据,达到简介调试的目的 打印log,是一种比较有效率的方法,是计算机与人有效沟通的手段. 灵活运用以上手段,快速解决问题,是调试能力的判定依据. IDA 就有一个不错的调试器,你可以与它对话! 递归程序调试方法: ------------------------------------------------------------ author: hjjdebug date: 2017年 12月 27日 ------------------------------------------------------------ 面对一个复杂的被调试程序,如何才能快速理解其数据目的及目标. 例如,我碰到了一个复杂的递归调用程序,4个入口,7个出口,7个参数. 这个是个直接的递归,调用都集中在一个函数里. 还碰到过间接递归,函数调用了别的函数,别的函数又反过来调用这个函数, 其中分支调用函数不记其数. 这种应该是更复杂的. 独立的分支调用不是我们关心的目标,但回过头来调用递归的函数是需要考虑的. 递归函数易写难调, 易写是因为你只需写退出条件,写递归函数即可.难调是因为 其执行流程不是线性的,当你执行到递归函数时,它会逐层展开,形成一个调用树 直到退出条件,再逐层返回,如果是单步跟踪,跟不了几步,往往就会腾云驾雾,不知 自己身处何处. 既然递归的调用多了一个深度的概念, 好, 手段1,我们用一个glevel变量跟踪其深度,每递归一层,glevel++,     递归函数return时, glevel--, 这样就能定位递归函数的深度. 手段2,打印递归函数的入口位置, 手段3,打印其它关心的数据. 总之,就是添加打印信息吗,通过打印,找到我们关心的信息和搞通调用关系. 为了简化程序的修改方法,可以使用宏替代语句. 我为自己找到的这种方法应该说自己想到和实践的方法而沾沾自喜! 附上2个实例,是我用过的. 留作纪念! 我很少使用宏,但发现在这个地方使用宏是非常的方便和有效! 它有效解决了函数调用和返回值问题. #ifdef _USE_MACRO_CALL #define mac_realScan(a1,a2,e) ({printf("rs in:glevel:%d i_e:%d\n",++glevel,e); \         printf("filename:%s\n",((MapFile *)a1)->filename);\         macRet=realScan(a1,a2); printf("rs rtn:%p\n",macRet);macRet;}) #define mac_rs_rtn(a1,e) ({if(a1){printf("nodes:%d\n",((F2_36*)a1)->list0->node_size);}\         printf("rs out:glevel:%d o_e:%d\n",--glevel,e); return a1;}) #else #define mac_realScan(a1,a2,e) ({ macRet=realScan(a1,a2); macRet;}) #define mac_rs_rtn(a1,e) ({ return a1;}) #endif
相关文章
相关标签/搜索
每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。
本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院