linux下gdb使用(详解)
1.启动gdb#前提:这个程序没有输入参数的#命令 gdb + 可执行程序gdb ./mian #效果如下图一#前提:这个程序有输入参数的#命令 gdb + --args +可执行程序 + 参数列表gdb --args ./mian 参数 #效果图如下图二#测试案列在文章最后2.打断点#命令 b或者break + 函数名b say_hello成功·打断点,会显示打断点的文件,行号,如下图所示GDB
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;
}
更多推荐
所有评论(0)