热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

debug下情况良好、release下频繁奔溃问题的跟踪与解析

最近一段时间一直忙于开发新平台系统的功能,今天测试那边拿过来简单的测试一下,并对相关需求和功能点进行验证。结果出现了一个奇怪的问题:在验证某个功能点时,在release模式下的程

        最近一段时间一直忙于开发新平台系统的功能,今天测试那边拿过来简单的测试一下,并对相关需求和功能点进行验证。结果出现了一个奇怪的问题:在验证某个功能点时,在release模式下的程序频繁出现奔溃现象。之前在开发该功能点时也进行了充分的测试,程序一直运行正常,怎么一到release模式下就出现频繁奔溃的现象呢?

        由于还在新功能的开发过程中,本想测试中的小问题可以留到后面正式测试时再解决,毕竟时间点比较紧,实现既定的功能是第一位的。但是对于这种频繁奔溃的问题,测试那边肯定很是恼火的,就连我自己也看不过去了,时间再紧也得先解决这个问题。于是,仔细走读了上述功能点的代码,也没发现什么问题,而且要命的是debug下没有发生奔溃的问题。其实也知道,这可能是与程序在debug下和release下的不同特性导致的,比如:变量在debug下即使没有初始化,编译器也会去初始化,而在release下则不会,会使用随机值;debug下有大量调试信息,有内存保护,出现奔溃的几率要小一点,而release下却没有这样的保护。  本来在程序中植入了华生医生,以便在程序出现异常时利用华生医生产生的日志文件,结合IDA工具对异常点进行定位。但是不幸的是,在出现奔溃的时候并没有产生日志文件,这样就比较棘手了。由于debug下很难复现,release下又没有奔溃日志,加上系统的代码量很大,只能修改工程在release下配置,在release下进行调试了。结果在release下调试很快找到了问题,问题在于某行代码对空指针操作了。那么既然是空指针,那么debug下和release下的截然不同的表现作何解释呢?出问题的代码与上述功能点没直接的联系,于是找到相关责任同事,让其查一下其负责的模块,怎么出现了对空指针操作的情况。待找到可能的出错的代码点时,我过去看了一下,结果终于可以真相大白了:同事定义的变量,由于使用了if判断语句导致if内的语句没有执行导致变量没有初始化,在debug下没问题,因为编译器会对该变量初始化,而在release下变量中存放就是随机值了,导致接下来的if判断语句条件为真,进入了出错的函数中去了,从而导致程序的奔溃(在出错的函数中并没有对指针进行是否为NULL的判断)。这就很好解释了为什么程序在debug下和release下的不同表现了。

        花了很大的精力才最终解决上面的问题。从中我们也能总结一些东西:平时写代码一定要规范,变量一定要初始化,指针变量要做是否为NULL的判断等等。由于这个同事是刚毕业的,编码经验相对比较少,一方面代码不够规范,另外代码没有进行仔细的走读才导致了上面的问题。所以,我们平时还是要多强调编码的规范性,特别是对刚毕业的新同事,应该更要强调这一点,因为规范性在提高代码可读性的同时,也可以减少代码出错的几率。这点在大型系统的开发中也尤为重要。

       下面给出在VC6.0中如何在release模式下进行调试的办法。只要在工程的C++ tab页面和Link tab页面中进行如下的配置就可以了。

       1、在C++ tab页面中:

             category:General  

             Optimizations:Disable(Debug)

             Debug info: program database

             如下所示:

            

       2、在Link tab页面中:

             category:General  

             勾选 General debug info

             勾选 General mapfile

             如下所示:

            





推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • andr ... [详细]
author-avatar
猪可夫司机
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有