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

C++ Linux调试(无IDE)

跨平台IDE编译调试C++很方便,如QTCreate 、VSCode、Eclipse等,但是如果只能使用Shell控制台呢,gdb调试的优势就很明显了,在没有IDE的情况下,这个方式最有效。因为上手不是很难,特此整理

参考链接

目录

    • 1、GDB调试
      • 1.1、gcc 编译输出可调试程序
      • 1.2 cmake编译输出可调试程序
      • 1.3gdb常用指令
      • 1.4gdb操作步骤
    • 2、core调试
    • 3、调试正在运行的程序

1、GDB调试

1.1、gcc 编译输出可调试程序

命令样例

gcc -g -o Run_exe test.c

1.2 cmake编译输出可调试程序

在CMakeList.txt中增加如下字段即可

# 设置为调试模式
set(CMAKE_BUILD_TYPE "Debug")
# 配置调试信息
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")

1.3gdb常用指令

gdb调试主要记住这个表,再就是开始实战操作

命令命令缩写命令说明
set args设置主程序的外部参数
例如:./Run_exe argc1 argc2
breakb设置断点,b 3 表示在第3行设置断点,可以设置多个断点;也可以b functionName ,对函数下断点
info b 查看所有断点信息
delete 1 标识取消第一个断点,断点号通过info b可以查询得到
runr开始运行程序,程序运行到断点位置会停下来,如果没有遇到断点,程序一直运行下去
nextn执行当前行语句,如果该语句为函数调用,不会进入函数内部执行
steps执行当前语句,如果该语句为函数调用,则进入函数执行其中的第一条语句。
注意了:如果函数是库函数或者第三方提供的函数,用s也是进不去的,因为没有源代码,如果是你自定义的函数,只要有源码就可以进去
printp显示变量值,例如:p name 表示显示变量name的值。
list输入该命令,回车,可以查看10行源代码,再不用输入命令,直接回车,还可以继续看十行源代码
continuec继续程序的运行,直到遇到下一个断点
bt查看程序执行到当前位置的调用栈
set var name=value设置变量的值,假设程序有两个变量:
int ii;调试的时候 set var ii=22 即,把ii的值设置为22
char name[50];调试的时候 set var name=“测试” 把name的值设置为“测试”,注意这里不是strcpy
quitq退出gdb环境

1.4gdb操作步骤

这里假设已经编译出可调式的程序
1、gdb 调试JoinTieGCP_EXE
在这里插入图片描述
2、在该程序511设置断点(如上图)
3、设置外部传参命令
在这里插入图片描述
4、r运行程序,n下一步(不进入),s下一步(进入),list查看源代码,info b 查看断点等等

2、core调试

core调试主要查看程序异常在哪一行运行挂掉,中文输出“段错误”,英文输出“core dump”

表现如下(对于其他错误应该不支持该方法)
在这里插入图片描述

接下来操作步骤:

1、ulimit -a 查看系统参数;
在这里插入图片描述

2、ulimit -c unlimit 把core文件的大小设置为无限制;
在这里插入图片描述

3、运行程序,生成core文件;
在这里插入图片描述

4、gdb 程序名 core文件名
在这里插入图片描述

5、输入命令“bt”,查看函数调用栈
在这里插入图片描述

3、调试正在运行的程序

1、程序执行中
测试程序中写一个for循环100次,每次循环等待1秒的测试程序。

2、查找进程ID,进入进程调试
查找进程ID
ps -ef|grep book1

gdb调试
gdb book1 -p 21495
在这里插入图片描述
剩下的就跟gdb调试差不多了

http://www.lryc.cn/news/394739.html

相关文章:

  • FFmpeg——视频拼接总结
  • springboot项目怎么样排除自带tomcat容器使用宝蓝德bes web中间件?
  • 响应式ref()和reactive()
  • 运维系列.Nginx中使用HTTP压缩功能
  • vue3项目图片压缩+rem+自动重启等plugin使用与打包配置
  • 数据库性能优化系统设计
  • MyBatisPlus-分页插件的基本使用
  • 深入探索Python库的奇妙世界:赋能编程的无限可能
  • 力扣爆刷第161天之TOP100五连刷71-75(搜索二叉树、二维矩阵、路径总和)
  • 你真的了解Java内存模型JMM吗?
  • Springboot整合Jsch-Sftp
  • 生成随机的验证码图片(Python)
  • 0/1背包问题总结
  • 模电基础 - 放大电路的频率响应
  • Java 8 到 Java 22 新特性详解
  • 华为OD机试题-提取字符串中最长数学表达式
  • 专家指南:如何为您的电路选择理想的压敏电阻或热敏电阻
  • 基于主流SpringBoot进行JavaWeb开发的学习路线
  • 医疗机器人中的具身智能进展——自主超声策略模型的任务编码和局部探索
  • 探索人工智能在电子商务平台与游戏发行商竞争中几种应用方式
  • 【Altium】AD-网络版一个用户非人为异常占用多个License的解决方法
  • *算法训练(leetcode)第二十五天 | 134. 加油站、135. 分发糖果、860. 柠檬水找零、406. 根据身高重建队列
  • 乐鑫ESPC3 ESP8685 WiFi蓝牙模块透传程序设置教程,抛开繁琐AT指令,简单Web页面配置,即可实现透传
  • 怎么样才能为公司申请OV证书?
  • Python的`queue`模块
  • 牛客周赛 Round 50
  • 后端之路——登录校验
  • 无线网卡怎么连接台式电脑?让上网更便捷!
  • 【45 Pandas+Pyecharts | 去哪儿海南旅游攻略数据分析可视化】
  • Vue3项目给ElementPlus设置中文的两个方案