当前位置: 首页 > news >正文

GDB调试C++程序

GDB使用

  • 1 打包
  • 2 GDB调试
    • 2.1 命令大全
    • 2.2 案例

1 打包

# 1 打包为可执行程序,不加-g
g++ -o appEXE -std=c++11 *.cpp -I. -I/usr/local/include -I/usr/include -L/usr/local/lib -L/home/lib -laaa -lbbb -lccc -L/tmp/lib -lcurl
# 2 打包为可执行程序,加-g是添加了调试信息,方便调试
g++ -g -o appEXE_debug -std=c++11 *.cpp -I. -I/usr/local/include -I/usr/include -L/usr/local/lib -L/home/lib -laaa -lbbb -lccc -L/tmp/lib -lcurl
# 命令解释这个 g++ 命令是用于编译多个 C++ 源文件并链接它们以生成一个可执行文件的。
g++: 这是 GNU C++ 编译器,用于编译 C++ 代码。
-g: 这个选项告诉编译器生成调试信息,这使得你能够使用像 gdb 这样的调试工具来调试你的程序。
-o appEXE_debug: 这个选项指定了输出文件的名称,即编译和链接后的可执行文件名为 appEXE_debug。
-std=c++11: 这个选项告诉编译器使用 C++11 标准来编译代码。
*.cpp: 这是一个通配符,它告诉编译器编译当前目录下的所有 .cpp 文件。
-I.: 这个选项告诉编译器在当前目录下搜索头文件。. 表示当前目录。
-I/usr/local/include 和 -I/usr/include: 这些选项告诉编译器在 /usr/local/include 和 /usr/include 目录下搜索头文件。
-L/usr/local/lib 和 -L/home/lib: 这些选项告诉链接器在指定的目录下搜索库文件。-L 选项后面跟的是库文件的搜索路径。
-laaa, -lbbb, -lccc: 这些选项告诉链接器链接名为 libaaa.so, libbbb.so, 和 libccc.so 的共享库(在 Unix/Linux 系统中,库文件通常以 lib 开头,并以 .so、.so.x 或 .a 结尾)。注意,-l 选项后面只跟库名(不包括前缀 lib 和后缀 .so 或 .a)。
-lcurl: 告诉链接器链接名为 libcurl.so 的库,这通常是用于处理 HTTP 请求的库。
总之,这个命令的作用是:使用 C++11 标准编译当前目录下的所有 .cpp 文件,并链接到指定的库文件,生成一个名为 appEXE_debug 的可执行文件,同时生成调试信息以便于调试。

2 GDB调试

2.1 命令大全

GDB(GNU Debugger)是Linux下的一款强大的程序调试工具,可以用于查看和修改程序的运行状态。以下是一些常用的GDB调试命令:
1 GDB+ 程序名2 set args 参数1 参数23 run: 开始执行程序,并且如果有断点,会在第一个断点处停下来4 start:开始执行程序,运行程序5 next:执行下一行代码,跳过函数调用6 step:执行下一行代码,进入函数调用7 continue:继续执行程序,直到遇到断点8 print:打印变量的值9 break:在代码的指定行设置断点10 info break:查看当前设置的所有断点11 delete breakpoints:删除指定的断点12 finish:执行当前函数直到返回并打印返回值13 watch:监视变量的值,一旦变量的值发生变化,程序会停下来14 list:列出源代码的指定行15 quit:退出GDB

2.2 案例

1、开始调试程序appEXE_debug: gdb /tmp/appEXE_debug
2、设置输入参数1个: set args /tmp/config.txt
3、设置断点cac.cpp的第10行:break cac.cpp:10
4、运行程序:run
5、打印某个变量:print calNums
6、继续执行:continue
7、执行下一行代码,跳过函数调用:next
8、执行下一行代码,进入函数调用:step
9、退出调试:quit

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何让 uboot启动时自动执行指令?(执行“mtdparts default”命令)
  • 在css样式中使用em和px。各有什么优势,在表现上有什么区别?
  • 杂项——编码器控制小车走固定距离(stm32)
  • rtl8723du android5.1 6818 (蓝牙 部分)(第四部分)
  • 简单脉冲动画效果实现
  • ssm学生成绩管理系统-海豚
  • ubuntu, esp-idf, arduino
  • Vue路由的使用
  • C#发送邮件
  • PCA降维算法
  • Oracle基本操作
  • OCP-042之:Oracle结构体系
  • 《人人都是产品经理》笔记1:什么是产品?怎么入行?
  • Linux常用基本命令-操作
  • el-select filterable模糊搜索在iOS手机上无法弹出软键盘,解决方案
  • JavaScript-如何实现克隆(clone)函数
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【刷算法】求1+2+3+...+n
  • Angular 2 DI - IoC DI - 1
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • bearychat的java client
  •  D - 粉碎叛乱F - 其他起义
  • Git 使用集
  • Go 语言编译器的 //go: 详解
  • JavaScript创建对象的四种方式
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Quartz初级教程
  • quasar-framework cnodejs社区
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Spring框架之我见(三)——IOC、AOP
  • SQLServer之创建显式事务
  • underscore源码剖析之整体架构
  • yii2权限控制rbac之rule详细讲解
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 坑!为什么View.startAnimation不起作用?
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 配置 PM2 实现代码自动发布
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 听说你叫Java(二)–Servlet请求
  • 用jquery写贪吃蛇
  • HanLP分词命名实体提取详解
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • $.ajax中的eval及dataType
  • (~_~)
  • (003)SlickEdit Unity的补全
  • (03)光刻——半导体电路的绘制
  • (1)Jupyter Notebook 下载及安装
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (苍穹外卖)day03菜品管理
  • (二)springcloud实战之config配置中心
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (原創) 物件導向與老子思想 (OO)
  • *Django中的Ajax 纯js的书写样式1
  • .h头文件 .lib动态链接库文件 .dll 动态链接库