• GDB调试方法汇总


    gcc常用选项

    选项含义描述
    -o filename指定输出文件名,在编译目标代码时,可不选,不指定filename时,默认文件名是a.out
    -c只编译不链接,生成目标文件.o
    -S只编译不汇编,生成汇编代码
    -E只进行预编译,不做其他处理
    -g 生成的执行文件中包含调试信息
    -v打印编译过程中的命令行信息和编译器的版本号
    -I dir在头文件的搜索路径列表中添加dir目录
    -L dir在库文件的搜索路径列表中添加dir目录
    -static链接静态库
    -library链接名为library的库文件
    -Dmacro定义指定的宏,使它能够通过源码中的#ifdef进行检验
    -O -O2 -O3将优化状态打开,该选项不能和-g选项联合使用
    -Wall将警告看做是错误,发生警告时取消编译
    -Werror在发生警告时取消编译操作,将警告看作是错误
    -w禁止所有的报警
    -pedantic严格要求符合ANSI标准

     gdb常用命令

    命令含义描述
    file装入想要调试的可执行文件(需携带调试信息)
    run执行当前调试的程序
    kill终止正在调试的程序
    step执行一行或者进入函数内部
    next执行一行但不进入函数内部
    break设置断点
    print打印表达式或者变量
    list列出可执行文件中的源代码的一部分
    quit退出gdb
    watch监视变量而不管何时它被改变
    backtrace回溯跟踪
    frame n定位到发生错误的代码段,n为backtrace命令输出的栈的序号
    examine查看内存地址中的值
    jump是程序跳转执行
    signal产生信号量
    return强制函数返回
    call强制函数调用
    make使用户不退出gdb就可以重新产生可执行文件
    shell使用户不离开gdb就可以使用LInux的shell命令

     break用法

    命令描述
    break 指定函数断点,C++可以使用class::function或者function(type,type)格式指定函数名
    break 指定行号断点
    break +offset当前行号的前面offset行停住
    break -offset当前行号的后面offset行停住
    break filename:linenum在源文件filename的linenum行停住
    break filename:function在源文件filename的function处停住
    break *address在程序运行的内存地址处停住
    break没有参数,表示下一行停住
    break ...if 条件断点

     display命令

    命令描述

    undisplay

    delete display

    删除自动显示,dnums为已经设置了的自动显示的编号,同时删除几个,可以使用空格隔开,删除一个范围可以使用-例如2-5

    disable display

    enable display

    不删除自动显示的设置,而只是让其失效或者恢复
    info display 查看display设置的自动显示信息

    list命令

    命令描述
    list 显示linenum周围的源程序
    list 显示函数function周围的源程序
    list显示当前行后面的源程序
    list -显示当前行前面的源程序
    set listsize 设置一次显示源代码的行数
    show listsize查看当前listsize的设置
    list ,查看从first到last行之间的源代码
    list ,显示从当前行到last行之间的源代码
    list +向后显示源代码

     (学习视频c++调试技术_哔哩哔哩_bilibili

    部分资料来源上述视频。

     vscode终端输入gdb main启动调试

    输入layout split 查看源代码和汇编代码

     远程调试的launch.json文件

     

     附加进程调试(c++调试技术-3-附加进程调试-多线程调试_哔哩哔哩_bilibili

    -exec print n  调试控制台执行gdb命令

     查看内存地址  -exec x /20bx  地址   (b表示字节显示,x表示十六进制)

    -exec x /20bc 地址 (c表示字符显示)

    -exec x /20bs 地址 (s表示字符串显示)

    查看断点 info breakpoints  简写 i b 断点编号  查看指定断点信息,如果不指定断点编号,则查看所有断点信息。

    查看栈信息  bt简写

    删除断点:

    命令描述
    clear 函数名删除函数名断点
    clear 函数名(参数)根据函数签名删除断点
    clear 行号删除行断点
    clear 文件名:行号
    delete 删除断点  简写 d 或者 del

    delete 断点编号 

    delete 断点范围

    delete 所有断点

    disable 简写dis,断点编号或者断点范围 n1-n2dis  5-7
    enable 简写en,ena,断点编号 或者范围en 5-7
    enable once 断点编号只断一次
    enable count 数量 断点编号断指定次数
    ignore 断点编号 次数忽视前多少次

     保存断点  save breakpoints  point(文件名)

    读取断点  gdb filename -x  point(保存断点的文件名)

    gdbserver远程调试:

    远程服务器运行 gdbserver  ip:port  ./main

    本地进入gdb,执行 target remote ip:port  这里的ip和port 就是远程机器的IP和port,远程调试不能使用run命令,使用c命名。

    gdbserver远程attach:先运行程序,在通过ps -ef | grep main 获取pid,

    再执行gdbserver ip:port --attach pid 

    本地进入gdb,执行 target remote ip:port  这里的ip和port 就是远程机器的IP和port,远程调试不能使用run命令,使用c命名。

     查看栈:

    bt 显示调用栈信息

    bt 帧数  显示指定数量的栈(编号从小到大)

    bt -栈帧数  显示指定数量的栈帧(栈帧编号从大到小)

    backtrace full 显示所有栈帧的局部变量

    frame 简写 f,显示当前栈帧

    f 帧编号,切换指定栈

    up n向上移动n个位置

    down n向下移动n个位置

    info locals 查看当前帧的局部变量

     

     gdb attach pid  附加进程

    生成core文件  gcore  main-release.core, 然后detach,退出后执行 gdb  main main-release.core

    查看线程  i thread

     切换线程 thread 线程号

    打印变量 p a 

    打印指针 p p 

    打印main函数中的变量 p 'main'::a

    打印指针指向的内容,@后面跟的是打印的长度p *p@3

    • 设置打印格式
    1. x 按十六进制格式显示变量
    2. d 按十进制格式显示变量
    3. u 按十六进制格式显示无符号整型
    4. o 按八进制格式显示变量
    5. t 按二进制格式显示变量
    6. a 按十六进制格式显示变量
    7. c 按字符格式显示变量
    8. f 按浮点数格式显示变量

     

  • 相关阅读:
    LLM系列 | 27 : 天工大模型Skywork解读及揭露刷榜内幕引发的思考
    企业架构LNMP学习笔记18
    Spring注解开发_Spring容器创建概述
    Redis 复习计划 - String内存开销问题以及基本/扩展数据类型的使用
    Python 网页爬虫原理及代理 IP 使用
    青书学堂 看视频 耍课时
    c<8>指针
    移动端web调试工具vConsole使用详解
    造轮子之消息实时推送
    http1.1 的默认长连接 Connection: keep-alive 与 TCP KeepAlive 之间区别
  • 原文地址:https://blog.csdn.net/wj617906617/article/details/132812896