热门标签 | 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,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文深入探讨了如何通过调整InnoDB的关键配置参数来优化MySQL的随机IO性能,涵盖了缓存、日志文件、预读机制等多个方面,帮助读者全面提升数据库系统的性能。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • andr ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • libsodium 1.0.15 发布:引入重大不兼容更新
    最新发布的 libsodium 1.0.15 版本带来了若干不兼容的变更,其中包括默认密码散列算法的更改和其他重要调整。 ... [详细]
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社区 版权所有