Linux下开发调试C++代码的三种方法

本文介绍了在Linux下使用VSCode和GDB进行C++程序的三种调试方式:配置launch.json、GDB命令行调试以及通过core文件调试,并提供了示例和常用调试命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般来说,Linux下做C++开发都是用vscode远程连接的方式,这时候调试有三种方式:配置vscode的json文件调试GDB命令行调试通过core文件调试

关于这三种调试方法的示例都是基于cmake开发下,也适用不用cmake开发的情况,就不一一演示了,道理都是相通的。

准备程序

在这里插入图片描述这是项目的整个目录,初始只有三个文件,main.cpp、sum.h、CMakeLists.txt

// main.cpp

#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
#include <string.h>

#include "sum.h"

int main(int argc, char** argv)
{
    int a = std::stoi(argv[1]);
    int b = std::stoi(argv[2]);

    std::cout << sum(a, b) << std::endl;

    std::unordered_map<int, int> mp;
    mp.insert({ 1, 2 });

    std::cout << mp[1] << std::endl;

    std::vector<int> vec;
    vec.push_back(1);

    std::cout << vec[0] << std::endl;

    return 0;
}
// sum.h

#pragma once

#include <iostream>

int sum(int a, int b)
{
    for (int i = 0;i < 10;i++)
        a += b + i;

    return a;
}
// CMakeLists.txt

cmake_minimum_required(VERSION 3.8)
project(main)

# 添加调试信息
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11")

# 链接头文件
include_directories(${PROJECT_SOURCE_DIR}/include)

# 链接cpp文件
add_executable(main ./src/main.cpp)

# 生成可执行程序到bin目录下
set_target_properties(main PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin"
)

配置vscode的json文件调试

通过vscode配置json文件调试其实只需要一个launch.json文件即可,tasks.json是用来生成编译的,但是我们在linux下做开发要么用cmake命令编译,或者g++命令行编译,所以这个文件可以不需要。

第一步
打开main.cpp进行操作,其他文件不行。
第二步
点击 运行 -》添加配置 -》选择C++(GDB/LLDB)
在这里插入图片描述在这里插入图片描述这样就会在.vscode下生成一个launch.json文件

在这里插入图片描述在这里插入图片描述在这里插入图片描述
我们主要关心箭头指向的两个参数,
program:可执行程序的路径+名称
args:调试时需要给main函数传入的参数

我们这个程序的可执行文件会生成在bin目录下,调试时我们传入的参数为1、2,所以我们这个文件就可以这样写:

在这里插入图片描述打开终端,通过cmake命令生成可执行文件。

cd build
cmake ..
make

之后就可以在main函数里打断点,点击F5或者运行-》启动调试 开始调试。

在这里插入图片描述
左侧会自动监视变量的值,可以看到a和b的值是我们传进去的1和2。

使用GDB命令行调试

推荐一些常用的GDB调试命令:

1、编译项目时添加-g选项,可执行程序会带有调试信息
2、gdb + 可执行程序文件名 开始调试程序
3、调试技巧

  • 打断点:
    1、break 文件名:行号
    2、break 类名称::方法名

  • 启动调试
    1、start:从main函数第一行代码开始执行
    2、run:程序开始执行直到命中断点

  • 查看断点:info break

  • 查看代码,默认查看十行:list,简写l

  • 查看调用堆栈:backtrace,简写bt

  • 打印变量名:print 变量名,简写 p 变量名

  • 进入函数:step,简写s

  • 单步调试:next,简写n

  • 设置main传入的参数:set args 1 2,传入的参数为1和2

  • 继续执行直到下一个断点或程序结束:continue,简写c

  • 取消断点:clear + 断点编号clear + 文件名:行号

  • 退出:quit

在这里插入图片描述在这里插入图片描述

使用core文件调试

使用core文件调试适用于程序挂掉的情况下,我们修改一下main.cpp的代码,让程序挂掉。

// main.cpp

#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
#include <string.h>

#include "sum.h"

int main(int argc, char** argv)
{
    int a = std::stoi(argv[1]);
    int b = std::stoi(argv[2]);

    std::cout << sum(a, b) << std::endl;

    std::unordered_map<int, int> mp;
    mp.insert({ 1, 2 });

    std::cout << mp[1] << std::endl;

    char* p = nullptr;
    strcpy(p, "hello world");	// 让程序挂掉

    return 0;
}

1、使用ulimit命令生成core文件并控制大小,使用以下命令将core文件大小设置为无限制,运行程序,会在bin目录下生成core文件

ulimit -c unlimited

在这里插入图片描述
2、gdb + 可执行程序名 + core文件名 调试

在这里插入图片描述可以看到它在main.cpp的第22行挂掉,该行的代码是

strcpy(p, "hello world");

因为我们给一个空指针拷贝内容,程序崩溃。

### 回答1: LinuxC++开发是一种非常流行的编程方式,它可以利用Linux操作系统的优势,如高效、稳定和安全等特点,来进行C++程序的开发。在Linux下,C++开发者可以使用各种开发工具和库,如GCC编译器、Makefile、GDB调试器、Boost库等,来提高开发效率和程序质量。此外,LinuxC++开发还可以利用开源社区的力量,获取更多的资源和支持,从而更好地完成项目开发。 ### 回答2: Linux下C语言开发是一种基于Linux操作系统的程序开发方式,其最大的特点是开放源代码以及高度可自由配置的性质。Linux作为一款优秀的开源操作系统,广泛应用于互联网、移动设备和服务器等领域,其稳定、高效的运行性能和运维优势已深受众多企业和开发人员的青睐。 在Linux下使用C语言进行开发,需要掌握一定的基础知识和技能。首先,需要了解Linux系统的基本命令和操作,对于C语言的基础语法也需要掌握。其次,需要选择一款适合自己的C语言编译器,比如常用的gcc。针对Linux特殊的操作环境和调试、编译等方面,也需要额外学习相应的技能。 在进行Linux下C语言开发时,首先需要确定开发目标。目前,在Linux下的C语言开发可以包括应用程序、系统程序、嵌入式开发等。针对不同的开发目标,需要使用不同的开发工具和编译器。 在编写程序时,需要注意Linux系统的特殊性。比如,在Linux开发时需要使用头文件"unistd.h",使用fork()函数来创建新的进程。此外,由于Linux是多用户系统,所以需要进行用户和权限管理。同时,还需要注意程序的异常处理和错误输出等方面。 总的来说,Linux下的C语言开发是一项具有挑战性的工作,但其广泛应用和灵活性也为开发人员提供了很大的创造空间。通过深入的学习和实践,开发人员可以掌握Linux下C语言开发技能,为自己的事业发展和成长打下坚实的基础。 ### 回答3: 作为一位开发人员,从Windows转到Linux上做C开发,会面临不少挑战和改变。首先需要熟悉Linux的操作系统结构和命令行,了解不同的发行版之间的差异,这对于日常的开发来说非常重要。以下是几个值得注意的方面: 1.开发环境 最基础的开发环境包括GCC和GDB,这些开源工具在Linux上免费获得。如果需要集成开发环境(IDE),则可以选择Eclipse、Code::Blocks或者KDevelop。在部署时,通常使用GNU Autotools或CMake自动化构建工具。 2.编译器 在Linux上,GCC是一个标准的编译器,它支持多个平台和架构上的编译,包括ARM、x86、PPC和MIPS。GCC 的源代码是开源的,使得开发人员可以通过了解源代码的方式来增强对编译器的理解。 3.调试工具 调试工具推荐使用 GDB,这是一个命令行工具,可以进行高效的调试,以及研究你的代码中有可能出现的漏洞或者错误。另外,Valgrind工具可以用来检测内存泄漏问题以及程序的性能分析。 4.Linux 系统调用 Linux系统提供了大量的系统调用,其中一些是比较常用的,如read( ),write( ),open( )和close( )。开发人员需要从C标准库中了解并使用这些系统调用。 5.理解文件系统 Linux提供了一个树形文件系统,需要熟悉不同的目录及其作用,理解Linux文件系统的概念是非常重要的。当你编写的C程序需要读取或写入文件时,你需要确定文件系统中的路径和文件权限。在Linux上,路径名中的所有字符都是小写字母。 总的来说,Linux下的C开发需要对操作系统的了解比较深入,因此要花费比较长的时间去了解和学习。但是一旦掌握了Linux的知识之后,在开发时会发现Linux下的工具链和命令行的终端有很多实用性,它们都有助于提高代码的效率和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值