// main.cpp
#include <iostream>
#include <vector>
using namespace std;
int32_t main(int argc, char const *argv[])
{
cout << "hello world!" << endl;
vector<int32_t> myList;
for (int32_t i = 0; i < 10; i++) {
myList.push_back(i);
}
for (auto it : myList) {
cout << it << endl;
}
return 0;
}
1,生成可以使用GDB调试的可执行程序
g++ -g main.cpp -o main.exe
2,进入GDB调试模式
gdb main.exe
3,使用GDB查看二进制对应的源码
在gdb运行成功的前提下,输入l,可以一次查看10行源码,如果要继续查看,继续输入l。
4, 设置断点
在gdb运行成功的前提下,输入b 行号,进行插入断点。
eg:b 12
5,运行程序
在gdb运行成功的前提下,输入r,让程序运行起来。发现程序停在了我们之前设置的断点处。
6,单步运行
在gdb运行成功的前提下,输入r,让程序运行起来之后,可以使用n,单步运行程序。
7,查看当前程序中的变量值
当程序运行停止到断点处时,或者单步调试运行的时候,可以使用print 变量名 ,查看变量的当前值和值的地址。
8,继续运行代码
当程序停止到断点处时,输入c,可以使程序继续运行下一个断点处,没有更多断点的时候,则程序运行至结束。
9,退出GDB调试模式
以下示例使用下面的代码
// main.cpp
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int32_t SaveData(const vector<int32_t>& data)
{
set<int32_t> dataGroup;
for (auto it : data) {
dataGroup.insert(it);
}
return 0;
}
int32_t main(int argc, char const *argv[])
{
cout << "hello world!" << endl;
vector<int32_t> myList;
for (int32_t i = 0; i < 10; i++) {
myList.push_back(i);
}
auto ret = SaveData(myList);
for (auto it : myList) {
cout << it << endl;
}
return 0;
}
10,单步调试进被调用函数内部并且查看内部的值
进入GDB调试模式,并且加断点,运行至调用函数的地方,使用s,单步进入被调用函数,查看内部变量的值。
11,GDB中core的使用(在linux环境中)
使用 g++ -g test_error.cpp -o a.out,生成二进制可执行文件,并且运行,core dump文件在linux上生成。在使用gdb a.out core,就能看到错误的地方。
12,GDB调试正在运行的进程(linux)
lnux中,可以使用指令ps -ef,查看当前系统中的所有运行中的进程PID,| 表示将所有进程的PID放入管道内使用grep查询,查询的时候使用目标进程的关键字。如本文中直接使用可执行二进制的文件名名称。查询时,该二进制程序必须处于运行状态。
查询到该进程的PID之后,就可以使用 gdb -p 9078进入或者gdb a.out -p 9078进行调试。
13,GDB多进程调试(linux)
在GDB调试模式下,有个follow-fork-mode,可通过show follow-fork-mode 查看当前GDB调试的调试进程,当前进程一般为父进程,如果在代码中设置断点,只能断住父进程的代码,子进程的代码将无阻塞运行。
通过set follow-fork-mode child 可将当前GDB的调试进程设置为子进程,同理如果在代码中设置断点,只能断住子进程的代码,父进程的代码将无阻塞运行。
14,GDB调试当前进程,是否挂起其它进程(linux)
在GDB调试模式下,
show detach-on-fork 如果是on,表示调试当前进程时,其余进程可正常运行。
set detach-on-fork off 调试当前进程时,其他金次那个不运行。
15,查询当前正在调试的进程(linux)
使用 info inferiors查询当前进程,带*的为当前正在调试的进程。
需要切换GDB当前调试进程的时候,使用inferior num进行当前调试进程的切换,其中num为上图中的inferiors num。
16,调试多线程代码(linux)
进入GDB调试模式,使用info threads,查看当前线程,其中带*的为当前调试线程。
切换当前调试线程,使用 thread Id,ID就是上图中thread Id号码。
17,同时操作多个线程(linux)
使用 thread apply ID1 ID2 cmd,来同时操作多个线程执行同一个命令,或者可以使用thread apply all cmd,让当前所有线程执行同一个命令。
不断完善中。。。。。。。。。。。