gdb支持很多的命令使用户能实现不同的功能,有简单的文件装入命令,有允许程序员检查所调用的堆栈内容的复杂命令
为了使gdb正常工作,必须使程序在编译的时候包含调试信息,这需要在gcc编译时加上-g或者-ggdb选项。调试信息包含了程序中的每个变量的类型和在可执行文件中的地址映射以及源代码的行号。而gdb正是利用这些信息使源代码和机器码相关联。
退出gdb
quit
如果直接用gdb命令,会进入gdb界面,但此时还没有装载要调试的程序,
gdb也可以干一些事情
用file命令装载
file lian.exe
lian.cpp
#include <stdio.h> int main(void) { int i=0; printf("Hello, world\n"); printf("i is %d\n",i); i++; printf("i is now %d\n",i); return 0; }
首先编译
g++ lian.cpp -ggdb3 -o lian
gdb调试lian.exe
gdb lian.exe
run/r命令 执行当前被调试的程序
就是会一直执行下去,除非遇到断点或者报错
list 显示源代码
如果太长,只显示一部分
step单步执行代码但不进入函数内步
next/n单步执行代码并且进入函数内部
break/b n 在源码第n行设置断点
delete n 删除第n行的断点
print(i) 打印当前变量i的值
disassemble 查看汇编形式的代码
gdb中可以使用python
gdb调试可视化值TUI界面
只有在linux下才有
ctrl+x+a
gdb调试多线程和多进程
有的时候g++/gcc编译在windows下不成功,到linux下就成功了
多线程
thread2.cpp
#include<stdio.h> #include<sys/types.h> #include<unistd.h> #include<ctype.h> #include<pthread.h> #define MAX_THREAD 3 unsigned long long main_counter; unsigned long long counter[MAX_THREAD]; pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER; void* thread_worker(void* p) { long thread_num; thread_num = (long)p; for(;;){ counter[thread_num]++; main_counter++; } } int main() { int i, rtn, ch; pthread_t pthread_id[ MAX_THREAD]={0}; for(i=0; i<MAX_THREAD; i++){ pthread_create(&pthread_id[i], NULL, thread_worker,(void *)i); } do{ unsigned long long sum=0; for(i=0; i<MAX_THREAD; i++){ sum += counter[i]; printf("%llu", counter[i]); } printf("%llu/%llu", main_counter, sum); } while((ch=getchar()) != 'q'); return 0; }
g++ thread2.cpp -o thread2 -g -lpthread
info threads 查看当前的线程
可以看到当前只有一个主线程的存在
再next几步之后查看
左侧星号表示当前正在调试的是线程1
切换线程
thread 2
切换到线程2
让只有当前调试的线程处于运行状态,其他线程处于阻塞状态
set scheduler-locking on
多进程
https://www.bilibili.com/video/BV1Y4411m7Z5/