1.启动gdb

#前提:这个程序没有输入参数的

#命令  gdb + 可执行程序 

gdb  ./mian  #效果如下图一

#前提:这个程序有输入参数的

#命令  gdb +  --args +可执行程序 + 参数列表

gdb  --args ./mian 参数 #效果图如下图二


#测试案列在文章最后

2.打断点

#命令 b或者break + 函数名

b say_hello

 

成功·打断点,会显示打断点的文件,行号,如下图所示

GDB break(b):设置断点  //这里有一个博客写得不错

3.查看当前或者当前断点的代码

可以使用简写命令 l 或者 list,每一次l/list默认是往下执行的,list  数字1,数字2:表示查看数字1-数字2行的源码

3.1.list命令

1.list命令(列出源码):

命令一次只能显示十行,若想查看后面的源码可一直按回车键,直到所有源码显示完。

2.list +数字1:

表示查看数字1行周围10行代码,list 1 可从头查看源码

3.list - :

表示查看上一个list命令查看的代码之前的10行。

4.list  数字1,数字2:

表示查看数字1,数字2行的源码。

5.list + 函数名:

表示查看函数名周围10行代码。

6..list 文件名:数字

表示查看文件名文件中数字周围的10行代码。

7.list 文件名:函数名

表示查看文件名文件中函数名周围10行代码。

 3.2查看断点位置

info breakpoints

或者 info b

#结果会显示有多少个断点,以及断点所在的文件的行号

 3.3删除断点

delete  + 断点编号即可 #删除特定的断点

delete   #删除所有断点 选择y即可

4运行程序

4.1直接运行

命令是run或者r可以直接执行,如果有断点停下,没有断点执行完毕或者到异常崩溃地方退出

 4.2单步执行

# n是在单前函数执行 n是不进去函数内部,直接执行完函数了 

命令是n或者next,单步执行,但是程序必须启动了,该命令才有效,程序启动就是run命令 

其他:ni是按机器指令来执行

# s或者step是进去函数内部执行

其他:si是按机器指令来执行

5.查看变量值

用打印即可

p +变量名

 

6.退出

q命令 

 7.线程相关的命令

1、info threads:

这条命令显示的是当前可调试的所有线程,GDB会给每一个线程都分配一个ID。前面有*的线程是当前正在调试的线程。

2、thread ID:

切换到当前调试的线程为指定为ID的线程。

3、thread apply all command:

让所有被调试的线程都执行command命令

4、thread apply ID1 ID2 … command:

这条命令是让线程编号是ID1,ID2…等等的线程都执行command命令

5、set scheduler-locking off|on|step:

在使用step或continue命令调试当前被调试线程的时候,其他线程也是同时执行的,如果我们只想要被调试的线程执行,而其他线程停止等待,那就要锁定要调试的线程,只让它运行。

off:不锁定任何线程,所有线程都执行。

on:只有当前被调试的线程会执行。

step:阻止其他线程在当前线程单步调试的时候抢占当前线程。只有当next、continue、util以及finish的时候,其他线程才会获得重新运行的。

6、show scheduler-locking:

这条命令是为了查看当前锁定线程的模式。

7.i threads

实现线程间切换

8.编译的时候需要注意的是,别忘了加动态链接库和-g。

8.测试代码

#include <iostream>
#include <pthread.h> //多线程相关操作头文件,可移植众多平台
 
using namespace std;
 
#define NUM_THREADS 5 //线程数
 
void* say_hello( void* args )
{
    cout << "hello..." << endl;
    return nullptr;
} //函数返回的是函数指针,便于后面作为参数
 
int main(int arg,int* argv )
{
    pthread_t tids[NUM_THREADS]; //线程id
    for( int i = 0; i < NUM_THREADS; ++i )
    {
        int ret = pthread_create( &tids[i], NULL, say_hello, NULL ); //参数:创建的线程id,线程参数,线程运行函数的起始地址,运行函数的参数
        if( ret != 0 ) //创建线程成功返回0
        {
            cout << "pthread_create error:error_code=" << ret << endl;
        }
    }
    pthread_exit( NULL ); //等待各个线程退出后,进程才结束,否则进程强制结束,线程处于未终止的状态
    return 0;
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐