GDB不同文件断点调试

本文详细介绍了如何使用GDB在Linux环境下进行多文件断点调试,包括同一目录及跨目录的文件调试技巧,适合C/C++开发人员学习。

GDB不同文件断点调试


作为一个linux下C/C++开发人员,调试工具是必不可少的一项技能,在windows平台,会有很多工具给我们用,比如VS,自带很强大的调试工具。当然,linux平台夜市毫不逊色,GDB工具是一个非常强大的代码调试工具。今天主要介绍的是GDB在多文件中的调试方法,不会一一介绍基础命令的。


一、同一个目录中的文件
现在,有三个文件,分别为main.cpp、test1.cpp、test2.cpp文件,这个是很简单的程序,只是为了说明调试过程。

代码如下:

head.h
#include <iostream>
using namespace std;

void test1();
void test2();
test2.cpp
#include "head.h"

void test2()
{
    cout<<"test2"<<endl;
}

#include "head.h"

void test1()
{
    cout<<"test1"<<endl;
}

#include "head.h"

int main()
{
    test1();
    test2();
    return 0;
}

这部分代码都在同一个目录下:GDB/ManyFiles


Step1:
编译代码,记得加参数 -g

GDB/ManyFiles$ g++ main.cpp test1.cpp test2.cpp -o test -g
GDB/ManyFiles$ ls
head.h  main.cpp  test  test1.cpp  test2.cpp

Step 2:
开始调试

GDB/ManyFiles$ gdb test 

Step 3:
同一个文件夹中的文件,我们可以用 break file1.cpp: linenum

(gdb) l 1
1	#include "head.h"
2	
3	int main()
4	{
5	    test1();
6	    test2();
7	    return 0;
8	}
(gdb) b test1.cpp:4
Breakpoint 1 at 0x4008b2: file test1.cpp, line 4.

Step 4:
启动程序,程序会在断点处停止运行

(gdb) l 1
1	#include "head.h"
2	
3	int main()
4	{
5	    test1();
6	    test2();
7	    return 0;
8	}
(gdb) b test1.cpp:4
Breakpoint 1 at 0x4008b2: file test1.cpp, line 4.
(gdb) run
Starting program: /mnt/hgfs/share/C++/GDB/ManyFiles/test 

Breakpoint 1, test1 () at test1.cpp:5
5	    cout<<"test1"<<endl;

Step 5:
退出GDB调试

(gdb) c
Continuing.
test1
test2
[Inferior 1 (process 56202) exited normally]
(gdb) quit


上面这个步骤就是我们的多文件调试,当然,在大型项目中,文件往往都是在不同的文件夹中,所以,我们也要掌握在不同问价夹中调试的办法。

二、不同文件夹中文件调试
代码还是上面的代码,只是会放在不同的目录下:
GDB/test1:test1.cpp
GDB/test2:test2.cpp
GDB/ManyFiles:main.cpp

Step1:
编译代码,记得加参数 -g

GDB/ManyFiles$ GDB/ManyFiles$ g++ main.cpp ../test1/test1.cpp ../test2/test2.cpp -o test -g
GDB$ ls
ManyFiles  test1  test2

Step 2:
开始调试

GDB/ManyFiles$ gdb test 

Step 3:
不同文件夹中的文件,我们可以用 directory 命令修改路径

(gdb) directory ../test1/
Source directories searched: /mnt/hgfs/share/C++/GDB/ManyFiles/../test1:$cdir:$cwd 
(gdb) b test1.cpp:2
Breakpoint 1 at 0x4008b2: file ../test1/test1.cpp, line 2.
(gdb) r
Starting program: /mnt/hgfs/share/C++/GDB/ManyFiles/test 

Breakpoint 1, test1 () at ../test1/test1.cpp:5
5	    cout<<"test1"<<endl;
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004008b2 in test1() at ../test1/test1.cpp:2
	breakpoint already hit 1 time
(gdb) 


Step 4:
启动程序,程序会在断点处停止运行

(gdb) l 1
1	#include "head.h"
2	
3	int main()
4	{
5	    test1();
6	    test2();
7	    return 0;
8	}
(gdb) b test1.cpp:4
Breakpoint 1 at 0x4008b2: file test1.cpp, line 4.
(gdb) run
Starting program: /mnt/hgfs/share/C++/GDB/ManyFiles/test 

Breakpoint 1, test1 () at test1.cpp:5
5	    cout<<"test1"<<endl;

Step 5:
退出GDB调试

(gdb) c
Continuing.
test1
test2
[Inferior 1 (process 56202) exited normally]
(gdb) quit

这就是今天介绍的GDB多文件断点调试的全部内容。
想了解学习更多C++后台服务器方面的知识,请关注:
微信公众号:C++后台服务器开发

### 使用 GDB 设置和管理断点GDB 中,断点调试过程中非常重要的功能之一。通过设置断点可以让程序暂停在其指定位置处,从而允许开发者检查当前状态并逐步执行代码。 #### 基本断点操作 - **设置函数入口断点** 当希望在某个特定函数开始时停止程序运行,可以使用`break function_name`命令来创建一个断点[^1]。 ```bash (gdb) break main ``` 这条命令会在 `main()` 函数的第一条指令前插入一个断点。 - **按照源码行号设断点** 如果知道具体哪一行想要打断点,则可以直接利用文件加行数的方式设定: ```bash (gdb) break filename.c:line_number ``` 例如,在为 `test.c` 的第 20 行设立断点: ```bash (gdb) break test.c:20 ``` - **条件断点** 有时候仅需在满足某些条件下才触发断点,这时可以通过附加条件表达式实现更精确控制: ```bash (gdb) break line_or_function if condition_expression ``` 比如只在变量 i 大于等于 10 时中断: ```bash (gdb) break loop_body() if i >= 10 ``` #### 查看现有断点列表 为了查看已经设置了哪些断点及其编号,可以使用如下命令获取信息: ```bash (gdb) info breakpoints ``` 这会列出所有有效断点的位置、次数和其他属性。 #### 删除或禁用断点 一旦不再需要某断点了,可以选择将其删除或是暂时停用而不必完全移除它。对于单个断点而言, - 若要删除则可用 `delete breakpoint_id`; - 若只是想临时关闭的话就采用 `disable breakpoint_id`; 而要是打算一次性清除全部断点,那么只需简单地调用 `clear` 或者 `delete all-breakpoints` 即可[^2]。 #### 断点示例应用 假设有一个简单的 C++ 程序 `example.cpp`, 编译时记得带上 `-g` 参数以便保留足够的调试信息: ```cpp #include <iostream> int add(int a, int b){ return a + b; } int main(){ std::cout << "Result:" << add(3,7); } ``` 编译该程序: ```bash $ g++ -o example -g example.cpp ``` 接着启动 GDB 并加载此二进制文件: ```bash $ gdb ./example ``` 现在可以在 `add` 函数内部设置一个断点,并尝试运行程序观察其行为: ```bash (gdb) break add Breakpoint 1 at 0x4005b6: file example.cpp, line 4. (gdb) run Starting program: /path/to/example Breakpoint 1, add (a=3, b=7) at example.cpp:4 4 return a + b; ``` 此时程序将在进入 `add` 方法之前停下等待进一步指示,之后便能继续探究其他特性了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值