在写程序的时候,经常会遇到一些问题,比如某些变量计算结果不是我们预期的那样,这时我们需要对程序进行调试。本文主要介绍调试C/C++在Linux操作系统下主要的调试工具。

在Linux下写程序,C/C++主要的编译器有GCC/G++,ICC等,像我等穷码农,最喜欢GCC了,很大原因是他免费!所以,我们以GCC/G++为例介绍主要的调试工具。

分以下几个内容介绍:

1、调试之前的工作

2、选择调试工具

3、调试步骤

调试之前的工作

编译器在编译阶段需要产生可供调试的代码,才能被调试器调试。可以如下做:

gcc -g -ggdb ./yourcode.c -o yourapp.exe

这样编译代码可以产生供gdb调试的符号信息。

选择调试工具

gdb当时我们要使用的调试工具,不过他是命令行中使用的,多少有点不方便。

CGDB和DDD都是基于GDB开发的,他们只是增加了更加容易交互的界面。其中CGDB也是在命令行中使用的,使用方式与GDB一样,只是增加了代码显示的界面。

DDD也是GNU开发的,他也是基于GDB的,只是使用了可视化界面,比CGDB更加容易操作。

在有些情况下,我的Linux上可能没有装X-Sever,这样就没有图形显示功能,此时我们只能用命令行方式使用调试工具,所以gdb和cgdb应用更广泛些。一般我会使用CGDB,他的操作跟gdb完全类似,很容易上手。

调试

使用下面的命令启动程序。

cgdb ./youapp.exe

注意,这里我们使用的是cgdb,如果你没有安装cgdb,首先应该安装它!ubuntu用户的安装方式如下:

sudo apt-get install cgdb

启动软件后,常用的几个命令因该熟练掌握:

1、设置断点命令,程序在执行时遇到断点会停下来,执行停止后可以进行变量值的检查。

break [line_number]

例如:break youcode.cpp:32,这个命令是说在youcode.cpp第32行代码处设置断点,程序运行至此时会停下来。

2、显示变量的值,程序在断点处停止时可以打印变量的值。

print [var]

例如:print a,这句命令表示打印变量a的值。print也可以缩写成p。

3、单步执行,程序在断点处停止后,使用单步调试命令让程序一步步往下执行。使用next命令可以完成这个任务,可以缩写为n。

4、进入内部,在调试过程中,如果想进入某个函数的内部,则可使用step命令。

5、继续执行到下一个断点处。使用continue命令可以完成这个任务。

以上命令是gdb调试时常用的命令,也是应该必须掌握的命令。如果你想知道更多如何使用这些命令,使用help command查看相关的帮助。

Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)的更多相关文章

  1. [转] linux下的c/c++调试器gdb

    PS:1. 断点C++类函数,用b 命名空间::类名::方法名 2. 编译参数一定要加-g,才可断点调试 http://www.cnblogs.com/xd502djj/archive/2012/08 ...

  2. linux下的c/c++调试器gdb

    Reference:  http://www.cnblogs.com/xd502djj/archive/2012/08/30/2663960.html linux下的c/c++调试器gdb gdbLi ...

  3. linux下C的GBD调试学习笔记(转载)

    1. 单步执行和跟踪函数调用 看下面的程序: 例 10.1. 函数调试实例 #include <stdio.h> int add_range(int low, int high) { in ...

  4. Linux Bash命令关于程序调试详解

    转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...

  5. Linux下执行Java程序报错

    在linux下编译java程序,执行javac编译生成class文件时,在centos7终端输入如,javac hello.java    会提示未找到指令,但用java -verison测试环境变量 ...

  6. [置顶] Linux下发布QT程序

    Linux下发布QT程序 概述 无论在windows下还是在linux下,可执行程序的运行都依赖于相关的运行库,我们需要将依赖的库找到放到特定的位置,让可执行文件能够找到.在不知道可执行文件依赖哪些库 ...

  7. 终于解决了Linux下运行OCCI程序一直报Error while trying to retrieve text for error ORA-01804错误

    终于解决了Linux下运行OCCI程序一直报Error while trying to retrieve text for error ORA-01804错误 http://blog.csdn.net ...

  8. Linux 下运行 C++ 程序出现 “段错误(核心已转储)”

    Linux下写C++程序出现“段错误(核心已转储)”的问题: 段错误一般就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它 ...

  9. Linux下的应用程序开机自启动

    Linux下的应用程序开机自启动,目前我知道的有2种: 1.将启动语句写到/etc/rc.local 2.在init.d放置启动脚本 第一种,很简单,直接写进去就行,比如说: /db/mongodb/ ...

随机推荐

  1. [LeetCode] Implement Magic Dictionary 实现神奇字典

    Implement a magic directory with buildDict, and search methods. For the method buildDict, you'll be ...

  2. js高阶函数应用—函数柯里化和反柯里化

    在Lambda演算(一套数理逻辑的形式系统,具体我也没深入研究过)中有个小技巧:假如一个函数只能收一个参数,那么这个函数怎么实现加法呢,因为高阶函数是可以当参数传递和返回值的,所以问题就简化为:写一个 ...

  3. 机器学习技法:02 Dual Support Vector Machine

    Roadmap Motivation of Dual SVM Lagrange Dual SVM Solving Dual SVM Messages behind Dual SVM Summary

  4. 11_Python的列表推导式_Python编程之路

    上一节我们结束了有关python的方法相关内容 这一节我们先来学习python的列表推导式 之前跟大家说过range方法的使用,在这里我就不做过多的解释了,如忘记了,请翻阅之前的介绍 列表推导式,是P ...

  5. 【模板】KMP字符串匹配

    题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next. (如果你不知道这是什么意思也不要问,去百度 ...

  6. hdu 5340 (manacher)

    Sample Input 2 abc abaadada   Sample Output Yes No 判断是否能成为3个非空回文子串 manacher算法求出个点回文长度,在找出第一个和最后一个保存下 ...

  7. ●BZOJ 1855 [Scoi2010]股票交易

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1855 题解: DP,单调队列优化.(好久没做 DP题,居然还意外地想出来了) 定义 dp[i ...

  8. Python Django的分页,Form验证,中间件

    本节内容 Django的分页 Form 中间件 1 Django 分页 1.1 Django自带的分页 1.首先来看下我的测试数据环境 ############ models.py ######### ...

  9. js数组求差集

    var arr1 = [2,3,5,88,99,444,66];var arr2 = [2,88,66]; arr_dive(arr1,arr2); function arr_dive(aArr,bA ...

  10. iOS核心面试题

    1,请简述你对协议的理解?    protocol无论是在那个领域都是一种约束,规范.在OC中的协议主要用于在各个类之间进行回调传值. 协议有 委托方,代理方, 委托方是协议的制定者,需要声明协议的方 ...