跟我学C++中级篇——生产中如何调试程序

一、程序的BUG和异常

程序不是发布到生产环境就万事大吉了。没有人敢保证自己写的代码没有BUG,放心,说这种话的人,基本可以断定是小白。如果在开发阶段出现问题,还是比较好解决的,但是如果真到了生产上,可能会有一些限制,导致一些手段无法全部用上。下面就不同的情况进行一下分析。

二、如何调试程序

1、小程序
小程序就非常好说了,特别量些单机的小程序,直接挂上IDE或GDB,下断点调试即可。偶尔遇到一些细节问题,也可以打印输出具体的值(std::cout等)。
2、中型程序
中型程序一般也和小程序差不多,但此时打印日志就比较多了。同时中型程序可能不允许停机,这时就可以使用一些IDE的远程调试工具(类似gdbserver)进行调试,总体来说,在中小规模程序下,IDE和GDB调试等相关的方法还是为主的。其它一些工具,如内存检测工具、资源消耗工具等都是非常少见使用的。
如果遇到崩溃还可以使用coredump直接定位堆栈。基本上中小程序这样就足够了,当然如果能更灵活的使用其它工具更好,不过没有也没啥大问题。

3、大型程序
大型程序就比较麻烦了,一般大型程序不只一个模块,可能分解成多个独立的程序甚至部署在不同的机器上,使用GDB(IDE)调试,一般情况下就比较麻烦了,但也不是不可能,只是比较少见罢了。毕竟IDE的图形界面往往本身就成为一种负担。
大型程序的调试手段基本就全了,资源占用及性能分析工具(gprof等),内存检查工具(cppcheck及valgrind等),coredump分析crash情况等等。但最主要的就是打log,当然能够实时输出print更好,只是可能有的环境不允许。
另外,如果允许,也可以在怀疑的地方进行代码插桩,这种就看具体的场景应用了。

4、不可停止的程序
对于一些在线的服务,24×7运行的,一般不允许停止或者只允许短暂停止。这时,其实最主要的方法就是埋入日志,这是最好的方法。虽然远端调试可以解决不停机的问题,但在调试状态下,程序明显会变慢,而且,往往有的程序在部署时为了效率,进行了很高的优化。如果不是提前做了准备在编译时允许打入符号之类的动作,调试的意义其实也不算多大。

5、其它
其实回过头来,看看每个开发者面对的程序和场景都不一致,可能的是单纯的软件,有的可能要和一大堆硬件通信,有的可能还可能是分布式,等等。所以定位和解决BUG,需要开发者根据实际情况,善于利用各种工具来解决问题。比如和硬件通信,收不到数据,就需要和硬件协调通过各种硬件仪器来监测到底是硬件本身的问题还是固件的问题亦或是接口通信的问题等等。工具非常重要,一定要掌握一些经常使用的工具。

说句实在话,中小程序用调试直接下断点,大程序直接打日志分析,这是最经典也最好用的方法。特别是程序越大,日志的作用越大。不要害怕多线程的情况下日志的输出与实际可能有所不同,只要认真分析日志,总会查找到蛛丝马迹,然后定位问题。在实践中,这种现象非常常见。

三、总结

调试程序并解决问题的速度和经验有相当大的关系,特别是到了具体的场景下,可能大部分情况下经验要大于技术水平。当然,二者肯定是互相影响的。所以,在生产上要想迅速的对问题程序进行调试定位,就一定要掌握好具体环境的特点和性质。其它的好的技术或方法可能在实际场景中被限制使用,所以不能教条的复用它人的经验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/467015.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis-07 Redis哨兵

操作实现 此处应该6台虚拟机,其中3台是哨兵,但因为内存限制没有那么多 1.将sentinel文件拷贝到/myredis目录下 2.sentinel.conf文件重要参数 新建配置文件sentinel26379.conf sentinel26380.conf sentinel26381.conf bind 0.0.0.0 daemonize yes pr…

云上拼团GO指南——腾讯云博客部署案例,双11欢乐GO

知孤云出岫-CSDN博客 目录 腾讯云双11活动介绍 一.双十一活动入口 二.活动亮点 (一)双十一上云拼团Go (二)省钱攻略 (三)上云,多类型服务器供您选择 三.会员双十一冲榜活动 (一)活动内容 &#x…

使用Python进行健康监测和分析的案例研究

健康监测和分析是指系统地使用健康数据来跟踪和评估个人或人群在一段时间内的健康状况。它包含一系列活动,从实时生理数据收集(如心率,血压和体温)到分析更复杂的健康记录(包括患者病史,生活方式选择和遗传…

归并排序算法

1、基本思想 归并排序是建立在归并操作上的一种有效的排序算法,它采用分治法的策略。其基本思想是将一个待排序的数组分成两个或多个子数组,先对每个子数组进行排序,然后再将已排序的子数组合并成一个最终的排序数组。 对于两个有序的数组&am…

Mysql、Dm8达梦数据库通过脚本导出指定库所有表的结构详情信息到

目录 前言二、Mysql三、达梦8 前言 在当今复杂多变的数据环境中,数据库作为信息存储与管理的核心,其重要性不言而喻。随着业务的不断拓展和深化,对于数据库表结构的理解与管理成为了确保数据一致性和准确性的关键。特别是在跨数据库系统的场…

Android OpenGL ES详解——纹理过滤GL_NEAREST和GL_LINEAR的区别

目录 一、概念 1、纹理过滤 2、邻近过滤 3、线性过滤 二、邻近过滤和线性过滤的区别 三、源码下载 一、概念 1、纹理过滤 纹理坐标不依赖于分辨率(Resolution),它可以是任意浮点值,所以OpenGL需要知道怎样将纹理像素(Texture Pixel,也…

在vscode中开发运行uni-app项目

确保电脑已经安装配置好了node、vue等相关环境依赖 进行项目的创建 vue create -p dcloudio/uni-preset-vue 项目名 vue create -p dcloudio/uni-preset-vue uni-app 选择模版 这里选择【默认模版】 项目创建成功后在vscode中打开 第一次打开项目 pages.json 文件会报错&a…

算法详解——链表的归并排序非递归解法

算法详解——链表的归并排序非递归解法 本文使用倍增法加上归并排序操作实现了对链表的快速排序,比起一般的递归式归并排序要节省空间并且实现要简单的多,比起一般的迭代式归并排序实现也要简单。 1. 题目假设 给定链表的头结点 head ,请将其…

基于 SSM(Spring + Spring MVC + MyBatis)框架构建电器网上订购系统

基于 SSM(Spring Spring MVC MyBatis)框架构建电器网上订购系统可以为用户提供一个方便快捷的购物平台。以下将详细介绍该系统的开发流程,包括需求分析、技术选型、数据库设计、项目结构搭建、主要功能实现以及前端页面设计。 需求分析 …

Vue Element-UI 选择隐藏表格中的局部字段信息

一、功能需求分析 为什么需要这个功能? (1)简化信息,减少混乱: 就像整理抽屉,只留下常用的东西,这样找起来更快,看起来也更整洁。在表格中,只展示需要的字段&#xff…

【CANOE】【学习】【诊断功能】正响应抑制

文章目录 一、正响应抑制是什么?二.什么背景下产生三.作用四.如何实现五.capl代码如何实现总结diagGetSuppressRes 相关函数**Function Description****Syntax****Method (Dynamic)****Functionality****Parameters****Return Values****Availability****Example***…

纯血鸿蒙系统 HarmonyOS NEXT自动化测试实践

1、测试框架选择 hdc:类似 android 系统的 adb 命令,提供设备信息查询,包管理,调试相关的命令ohos.UiTest:鸿蒙 sdk 的一部分,类似 android sdk 里的uiautomator,基于 Accessibility 服务&…

基于vue3实现的聊天机器人前端(附代码)

<template><div class"container"><!-- 页面头部 --><header><h1>跟它说说话吧&#xff01;</h1><p>一个活泼的伙伴&#xff0c;为你提供情感支持&#xff01;</p></header><!-- 聊天容器 --><div c…

【赵渝强老师】Redis的RDB数据持久化

Redis 是内存数据库&#xff0c;如果不将内存中的数据库状态保存到磁盘&#xff0c;那么一旦服务器进程退出会造成服务器中的数据库状态也会消失。所以 Redis 提供了数据持久化功能。Redis支持两种方式的持久化&#xff0c;一种是RDB方式&#xff1b;另一种是AOF&#xff08;ap…

qt QFileSystemModel详解

1、概述 QFileSystemModel是Qt框架中的一个关键类&#xff0c;它继承自QAbstractItemModel&#xff0c;专门用于在Qt应用程序中展示文件系统的数据。这个模型提供了一个方便的接口&#xff0c;使得开发者可以轻松地在应用程序中集成文件和目录的树形结构&#xff0c;并通过视图…

ThingsBoard规则链节点:Push to Edge节点详解

引言 1. Push to Edge 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 边缘计算 3.2 本地数据处理 3.3 实时响应 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0c;提供了设备管…

JavaScript 实现文本转语音功能

全篇大概2000 字&#xff08;含代码&#xff09;&#xff0c;建议阅读时间10分钟。 引言 我将向大家展示如何使用 JavaScript 和 Web Speech API 快速实现一个“文本转语音”的 Web 应用。通过这个教程&#xff0c;你将了解如何让浏览器将输入的文本朗读出来。 预览效果 一、…

动态规划理论基础和习题【力扣】【算法学习day.25】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

Linux的基本指令(一)

1.ls指令 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及信息。 常用选项&#xff1a; -a列出目录下的所有文件&#xff0c;包括以 . 开头的隐含文件。 -l列出文件的详细信息 举例&#xff1a; rooti…

智能化健身房管理:Spring Boot与Vue的创新解决方案

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…