c++代码调试方式的几点建议

1.代码调试的重要性

代码调试在程序开发阶段占有举足轻重的地位,可见代码调试的重要性。但是有一点必须强调:程序是设计出来的,而不是调试出来的。这是所有程序员必须牢记在心的一条准则。一个没有设计或者这几得很糟糕的程序,无论怎样调试,也不会成为一个合格的程序。

程序有着良好的设计的前提下,软件开发的过程中,编码错误在所难免。所有程序可能出现的错误可分为两类:语法错误和逻辑错误。调试通常是指在消除了语法错误之后,发现程序中的逻辑错误的过程。对C/C++程序进行调试,有这样集中常用的手段。它们既可以单独使用,也可以配合使用。

2. 代码调试方式的几点建议

2.1使用打印语句

这是最朴素,也是最直接的方法。程序的运行可以看成是一组变量(状态)不断变化的过程,这个过程就是数据处理的过程。如果程序的最终结果不对,那么我们必须考虑这一组状态什么时候出现了问题,而查看中间结果就成了一种最有效的手段。

因此,不要过分迷信功能强大的调试工具。在大部分情况下,程序出现的问题都是一些小问题。而正是这些小问题,却造成了大麻烦。程序员可以通过对最有可能出错的代码附近使用简单的printf()语句或cout<<…语句来输出中间结果,查看异常情况。

2.2使用调试标记

在调试程序的时候使用相应的辅助代码(如输出中间结果等),在调试完成之后隐藏这些代码,是一种常用的调试策略。

这种策略可以借助于#define、#ifdef、#endif这三个与编译指令来实现。具体地说,就是在调试程序的时候,利用编译器的命令行参数定义调试标记(相当于程序中用#define定义的宏),然后再#ifdef和#endif之间包含相应的调试代码就可以了。当程序最终调试完成后,在生成发行版时,只要在编译器命令行参数中不再提供调试标记,程序中的调试代码就会消失。常用的调试标记为_DEBUG(在VC++ 2012)中,编译器调试版的程序是会缺省定义宏_DEBUG。考察如下程序。

#include <iostream>
using namespace std;

int main()
{
	int i=5;
#ifdef _DEBUG
	cout<<i<<endl;
#endif
	cout<<"Hello World!"<<endl;
}

在调试程序的时候,会执行#ifdef和#endif之间的语句。当调试完成之后,由于调试标记_DEBUG失去定义,从而隐藏调试代码。

2.3使用调试变量

与使用调试标记的方法类似,可以在运行时设置一个供调试用的bool型变量,它的值决定了特定调试代码的开放和关闭。并且可以通过程序的命令行参数来控制该变量的开关。上面的程序经过修改如下。

#include <iostream>
#include <string>
using namespace std;

bool debug;

int main(int argc,char* argv[])
{
	int i=5;
	for(int j=0;j<argc;++j)
	{
		if(string(argv[j])=="debug=on")
		{
			debug=true;
		}
	}
	if(debug)
	{
		cout<<i<<endl;
	}
	cout<<"Hello World!"<<endl;
}

程序通过命令行启动时,只要在命令行参数中指明debug=on,就可以输出调试信息。否则,只是输出程序“正常”运行的部分。这样就具有较高的灵活性。

2.4使用内置的调试宏

在程序调试的过程中,经常希望知道当前运行的是哪个模块小的哪个函数,在源文件中是第几行等等。如果手工添加这些信息,无疑会给程序员带来很大的负担。因此,C++提供了几个宏,他们分别是__FILE____FUNCTION____LINE__,可以利用它们“自动“获取有关模块、函数和行的信息。考察如下程序。

#include <iostream>
using namespace std;

void func1()
{
	cout<<__FILE__<<endl;
}

void func2()
{
	cout<<__FUNCTION__<<endl;
}

void func3()
{
	cout<<__LINE__<<endl;
}

int main(int argc,char* argv[])
{
	func1();
	func2();
	func3();
}

在本人的机器上输出如下信息:

e:\lvlv_study\synchronousfile\school\2015.10.23\programming\debug\main.cpp
func2
13

另外还可以使用assert()宏来进行断言。assert是一个只在调试版本下起作用的宏。另外,用户也可以定义自己的宏辅助来完成调试任务。例如下面的红可以用来显示变量的值,而且变量的名字会一同显示出来:

#define PR(x) cout<<#x”=”<<x;

这是利用#对宏的参数进行字符串化的处理。

2.5利用调试工具进行调试

利用集成开发环境进行调试也是一种攒则。可以在IDE中设置断点、但不调试、产看变量的内存的值、动态修改变量的值以改变程序的执行路径等。每一种具体的调试工具,其调试命令和方法都有差异,使用时要参阅相应的文档(如MSDN等)。

要说明的一点是,使用工具进行调试与基于打印输出的调试除了在使用的方便程度上有所差异外,在某些特殊的情况下,不能活着很难用工具进行某些程序的调试。如在Windows程序设计中,要调试与窗口重绘的有关代码,就不适合用IDE进行调试。原因是焦点从IDE窗口转到应用程序的窗口时,会引发新的重绘动作,导致程序运行陷入“死循环“。Linux环境下,进行代码的调试,我们可以借助于强大的调试工具gdb,其可以快速的定位到程序出错的位置,如使用bt或where命令可以快速找到程序出现core dumped的位置。

3.总结

使用各种调试的手段或工具,其目的是尽早的发现已经存在于程序中的错误。与此相关联的问题是,如何较少的引入错误、如何有策略地使用调试手段。给出几条如下建议。

(1)采用良好的变成风格。比如,用统一的规范为变量、函数和类型命名。程序的基本单位(如函数)的规模控制在一定范围之内(如100行),锯齿形编码,合理的注释等等。

(2)进行代码复查。这是Watts S Humphery领导的研究小组指定的PSP(Personal Software Process,即个人软件过程)规范中提倡的做法。在编译之前就进行代码复查,比直接进行编译更能有效地发现程序缺陷。

(3)对历史数据进行统计和跟踪。每个程序员的只是背景和工作习惯各不相同,通过统计历史上个人最容易出现哪些类型的编程错误,以便在将来有针对性地排查,是一种有效的提高程序质量的做法。

以上就是c++代码调试方式的几点建议的详细内容,更多关于C++代码调试的资料请关注我们其它相关文章!

(0)

相关推荐

  • vscode C++远程调试运行(学习C++用)

    目标: 连接远程主机 (ssh) 配置C++编译环境 (输出结果后删除二进制文件) 步骤: 安装Remote SSH,连接远程主机 Visual Studio 官方文档 https://code.visualstudio.com/docs/remote/ssh 图标 2. 配置C++编译运行环境 主要参考下面两篇文档 https://code.visualstudio.com/docs/cpp/config-wsl https://code.visualstudio.com/docs/edito

  • VSCode远程开发调试服务器c/c++代码

    思路与上篇(PyCharm远程调试服务器python代码 )是一致的,所以端口转发这部分直接照抄上篇: 一.端口转发 对于没有公网IP的远程训练服务器,需要先配置端口转发,可以用ssh借道有办公网IP的办公机器. 0.公司给配置了一台Ubuntu系统的台式机器A,开发时想用Windows笔记本B,把远程CentOS训练服务器记为C. 1.首先需要修改台式机A上的ssh配置文件,如果不修改配置的话,将只有机器A可以访问训练服务器C. $ sudo vim /etc/ssh/sshd_config

  • C++运算符重载实例代码详解(调试环境 Visual Studio 2019)

    最近看了菜鸟教程里的C++教程 遇到很多运算符重载,为了方便我的学习,我把这些总结了一下 如有错误(包括之前的博文)请评论留言,谢谢! 由于代码里注释的很清楚,我就不做过多的解释了. 下面是这次总结的头文件,用来放置一些类和方法. //C++运算符重载实例.h #pragma once #include <iostream> using namespace std; class chongzai { private: int i, j, k; public: chongzai() { i =

  • C++软件添加dump调试打印日志(推荐)

    C++软件添加dump调试打印日志(推荐) #include <DbgHelp.h> #pragma comment(lib, "dbghelp.lib") LONG WINAPI TopLevelExceptionFilter(struct _EXCEPTION_POINTERS *pExceptionInfo) { //cout << "Enter TopLevelExceptionFilter Function" << en

  • 详解AndroidStudio3.0开发调试安卓NDK的C++代码

    本文介绍了AndroidStudio3.0开发调试安卓NDK的C++代码,分享给大家,具有如下: 一.新建项目 新建项目,没有发现Include C++ Support 选项.因为印象中是有过该选项的,找了半天没找到. 后来无意间拖了下窗口大小,原来是被隐藏了,真特么坑. 新建一个测试项目,勾选Include C++ Support 选项,看看工程上有哪些不同. 1.gradle 首先看gradle文件,android节点下添加: externalNativeBuild { cmake { pa

  • vscode配置远程开发环境并远程调试运行C++代码的教程

    之前的时候我写C/C++代码喜欢在Linux下用vim(一开始甚至都没装代码补全插件),后来入了Clion的坑,感觉IDE还是太方便了,但是毕竟还是有许多场景只能在Linux下完成,于是就经常还是需要用vim.gdb这些东西,用惯了IDE之后就觉得挺麻烦的.最近尝试了一下vscode的远程开发功能,就俩字:真香,写篇文章记录一下,以防我下次配置的时候忘记了. vscode配置远程开发环境 检查服务器是否安装ssh服务 服务器使用命令netstat -tanp查看是否存在sshd 一般这一步都不会

  • 解决vscode下调试c/c++程序一闪而过的问题(Windows)

    起因 开始学习c语言了,一开始想的就是直接装个VS就完了,但是一搜都是说vs臃肿啥啥不好,不如用vscode来整,多轻量~于是就网上搜了许多教程开整了,期间也遇到了一些常见的坑,这些集中写个文,希望可以帮助到大家.配置文件也是来自其他文章的,我也进行了部分修改,后面会标出. 解决方法 我们知道使用vscode对c/c++进行调试的本质是这样的--1.GCC编译代码,2.vscode运行编译出的程序.因此调试运行程序一闪而过的本质就是命令行程序运行完结果直接自动关闭了,这和c/c++程序本身也有关

  • 如何利用Emacs来调试C++程序

    俗话说,Emacs是神的编辑器,而Vim是编辑器之神.高手程序员都是用这两样神器进行开发.本人觉得,Emacs之所以厉害,是因为许多在其他编辑器下必须用鼠标点选很多步的操作,在Emacs下都可以通过键盘来完成.大大地节省了你在显示器上找按钮的时间.Emacs在Linux上运行感觉比windows流畅些,用Emacs编辑程序时,手基本不用离开键盘,就可以完成所有的工作.那么今天就让我们看看如何利用Emacs来调试C++程序. 一.安装Emacs和GCC 下载地址:Emacs:http://www.

  • c++代码调试方式的几点建议

    1.代码调试的重要性 代码调试在程序开发阶段占有举足轻重的地位,可见代码调试的重要性.但是有一点必须强调:程序是设计出来的,而不是调试出来的.这是所有程序员必须牢记在心的一条准则.一个没有设计或者这几得很糟糕的程序,无论怎样调试,也不会成为一个合格的程序. 程序有着良好的设计的前提下,软件开发的过程中,编码错误在所难免.所有程序可能出现的错误可分为两类:语法错误和逻辑错误.调试通常是指在消除了语法错误之后,发现程序中的逻辑错误的过程.对C/C++程序进行调试,有这样集中常用的手段.它们既可以单独

  • 10个调试和排错的小建议

    在空白的文本编辑器里打开一个崭新的文本,没有一行代码,出现在眼前的是一个充满了无限可能和希望的项目.可是,当数千行的代码写完之后,整个项目因为bug的出现而被压垮了,更别说添加什么新功能了...这也许是对程序员的最大打击,在饱满的热情上浇了一盆冷水.其实,最好的软件程序员当然知道怎样去发现并修复这些bug,在刚开始编程的时候就通过软件工程的最好方法来降低bug的出现概率. 几乎没有哪个程序员能够写出一个bug都没有的代码,但是解决方法总是比困难多得多.多实践和坚毅的决心是成功的关键,这样才能够写

  • php代码调试利器firephp安装与使用方法分析

    本文实例分析了php代码调试利器firephp安装与使用方法.分享给大家供大家参考,具体如下: firephp简述 如果你曾经写过js代码的话,那么你对如下的代码肯定不会陌生: console.log('something'); 通过这行代码,就可以在chome和firefox的开发工具(F12)的console栏中看到你想要的调试信息. 那么,php能不能也通过这种形式进行代码调试呢? 答案是肯定的,可以通过firephp工具来实现在浏览器的console栏中进行调试. firephp的安装

  • Python 代码调试技巧示例代码

    Debug 对于任何开发人员都是一项非常重要的技能,它能够帮助我们准确的定位错误,发现程序中的 bug.python 提供了一系列 debug 的工具和包,可供我们选择.本文将主要阐述如何利用 python debug 相关工具进行 debug. 使用 pdb 进行调试 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等.pdb 提供了一些常用的调试命令,详情见表

  • C++ 内存泄漏调试方式

    C++和其他高级语言不同,需要自行管理内存,项目大\调用多,容易内存泄漏.内存申请释放使用malloc/free和new delete两种方式. 当内存报错弹出一个陌生的地址,我一脸懵逼,不清楚是哪个地方出的错,特别是程序退出的时候报错更不好定位.可以使用第三方工具来定位解决,也可以自己想办法解决. 我在做神经网络训练的时候碰到一个的BUG,发送完训练图片之后直接提示使用了非法内存. HEAP[Test.exe]: HEAP: Free Heap block 0000015E950E4A60 m

  • VSCode使React Vue代码调试变得更爽

    目录 引言 用 VSCode 调试 React 代码 用 VSCode 调试 Vue 代码 总结 引言 作为前端开发,基本每天都要调试 Vue/React 代码,不知道大家都是怎么调试的,但我猜大概有这么几种: 不调试,直接看代码找问题 console.log 打印日志 用 Chrome Devtools 的 debugger 来调试 用 VSCode 的 debugger 来调试 不同的调试方式效率和体验是不一样的,我现在基本都是用 VSCode debugger 来调试,效率又高.体验又爽.

  • React 源码调试方式

    目录 正文 断点调试 搜索定位 Chrome Devtools 调试 sourcemap npm 下载react包 插件注释 调试 React 最初源码 关联 react 源码项目 总结 正文 什么?调试 React 源码还有优雅和不优雅之分? 别着急,我们先来听个故事: 东东是一名前端工程师,主要用 React 技术栈,用了多年之后想深入一下,所以最近开始看 React 源码. 断点调试 他把 react 和 react-dom 包下载了下来,在项目里引入,开发服务跑起来后,打开 Chrome

  • 对textarea框的代码调试,而且功能上使用非常方便,酷

    <HTML><HEAD><META http-equiv='Content-Type' content='text/html; charset=gb2312'><TITLE>对textarea框的代码调试,而且功能上使用非常方便,酷</TITLE></HEAD><BODY > <SCRIPT>function JM_cc(ob){ob.select();js=ob.createTextRange();js.ex

  • 高手写的Tracer-Flash代码调试类代码下载

    AS3]Tracer-Flash代码调试类 组件版本:1.0 功能简述:可以在脱离flash编辑状态下进行调试代码(功能类似于trace命令).  运行平台:Flash CS3,ActionScript3,Flash Player 9 +  调用接口: 复制代码 代码如下: public interface com.klstudio.util.Tracer {      //是否为控制台端;      function isConsole():Boolean      //调试AS代码;    

  • JavaScript代码调试方法实例小结

    本文实例讲述了JavaScript代码调试方法.分享给大家供大家参考,具体如下: 1 把消息记录到控制台 IE8.Firefox.Chrome 和 Safari 中可以使用 console 对象向 JavaScript 控制台写入消息,它有这些方法: error(message):错误性消息. info(message):信息性消息. log(message):一般性消息. warn(message):警告性消息. Opera 10.5 之前的版本,是使用 opera.postError() 方

随机推荐