嵌入式开发神器--GDB

感谢狄泰唐老师

1. 作用

? 跟踪程序执行

? 恢复程序崩溃前的状态

? gdb是动态的工具,常用的addr2line这种是静态的

2. 一般应用

1. 自定义程序的启动方式(执行影响程序运行的参数)
2. 设置条件断点 (在条件满足的时候暂停程序的执行)
3. 回溯检查导致程序崩溃的原因(Core Dump)
4. 改变程序的执行流 (定位问题的辅助方式)

3. 实例应用

  1. 启动

    1. gdb

      file 可执行程序

    2. gdb 可执行程序

    3. gdb 可执行程序 CoreDump

      直接恢复发生段错误的信息

    4. 动态链接

    5. sudo gdb 可执行程序名称 pid

    6. sudo gdb

      attach pid

    7. 常规启动

    gdb

    file 可执行程序

    set args arg1 arg2

    run

    1. 动态

    gdb

    attach pid

    continue

    1. 得到core dump文件

    ulimit -c unlimited

    gdb a.out core

4. 断点

### 1. 类型

? 软件断点: 由非法指令异常实现,用于执行于内存中的程序

? 硬件断点: 由硬件特性实现,用于执行于Flash中的程序(代码处于Flash中只能通过硬件断点调试)

? 数据断点:由硬件特性实现,监控内存 程序中 某个数据被访问/修改

2. 断点操作

  1. 通过函数名

    break func_name [if var = name]

    后面的代表是条件断点可以增加的条件,[]可以忽略

    tbreak func_name [if var = name]

    临时断点

    hbreak func_name [if var = name]

    硬件断点

    1. 通过文件名行号设置断点

    break file_name:line_num [if var = name]

    treak file_name:line_num [if var = name]

    hreak file_name:line_num [if var = name]

    1. 查看断点

    info breakpoints

    1. 断点删除

    delete 1 2 n

    delete breakpoints

    1. 断电状态改变

    enable 1 2 n

    enable breakpoints

    disable 1 2 n

    disable breakpoints

3. 断点说明

? 一般打断点都会出现下面的信息,代表 printf("st[%d].i = %d\n", i, st[i].i);代表下一次要执行的语句,当前停在这里还没执行

? Breakpoint 4, func () at tricks.c:24
? 24 printf("st[%d].i = %d\n", i, st[i].i);

5. 常用操作

  1. 查看变量

    print name

    1. 开始执行,并停在最开始

    start

    1. 变量设置

    set var xx=100

    1. 执行下一行代码,不进入函数体

    next

    1. 连续执行n行代码

    next n

    1. 执行下一行代码,进入函数体

    step

    1. 强制当前函数返回 return [value]

    return value

    1. 运行至当前函数返回

    finish

    1. 运行至目标行

    until line

    1. 跳转执行

    jump line

    1. 查看可以使用的硬件断点个数

    show can-use-hw-watchpoints

6. 数据断点 观察感兴趣的变量变化

  1. 本质为硬件断点

  2. 用法

    watch var_name

7. 直接查看任意内存的值

  1. 语法

    x /Nuf expression

    N — 需要打印的单元个数

    u — 每个单元的大小

    f — 数据打印的格式

    1. u可能的参数值

    b 单字节

    h 双字节

    w 四字节

    g 八字节

    1. f 可能的格式

    x 十六进制

    d 有符号十进制

    u 无符号十进制

    o 八进制

    t 二进制

    a 地址

    c 字符

    f 浮点数

    1. 示例

    x /4bx 0x804a024

8. 通过内存查看判断系统大小端

? set var i = 1

? print /a &var

? x /4bx a地址

? x /1bx a地址 看看是不是1

9. 函数 栈相关的操作

1. 查看函数调用顺序 (就可以查看sp 和 bp 看看保存上一个栈帧这种验证了哇)

? 函数调用栈顺序

? backtrace

2. 切换到栈编号为N的上下文中

? frame N

3. 查看当前函数调用的栈信息

? info frame

10. info 深入

  1. 查看当前寄存器的值

    info registers

    1. 查看当前函数参数的值

    info args

    1. 查看当前局部变量的值

    info locals

    1. 查看当前栈帧的的详细信息

    info frame

    1. 查看程序中的变量符号

    info variables

    1. 查看程序中的函数名称

    info functions

11. 有用的调试技巧

  1. 断点处自动打印

    display /f expression

    undisplay

    1. 查看程序中的符号

    whatis

    ptype 会把符号怎么定义的也显示,whatis不会

    1. 代码查看

    list 默认显示10

    list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12

    list 函数名:将显示“函数名”所在函数的源代码,如:list main

    1. shell操作

    shell

嵌入式开发神器--GDB

上一篇:【Mysql】回表查询原理,利用联合索引实现索引覆盖


下一篇:mysql数据类型