gdb的使用

来源:互联网 发布:尚观云计算培训骗局 编辑:程序博客网 时间:2024/06/16 07:50

做linux有将近一年的时间了,说我都没用过gdb,有人相信吗?

不过这是真的,之前只有自己练习的时候使用,实际工作中没用过,可能是自己没有遇到特别困难的问题,一般都是printf搞定了,不过,我越来越觉得gdb的必要性,从今天开始学习使用gdb,在此不断的记录学习心得。

  1. 如果使用gdb,在编译的时候一定加上-g
  2. 启动gdb
    1. gdb a.out
    2. gdb attach pid
    3. gdb -> at pid
  3. 设置断点方法
    1. break 进入函数停住,C++采用class::function
    2. break 指定行号停住
    3. break +offset/ break -offset 在当前行号的前面或后面offset行停住
    4. break filename:linenum 在源文件filename的linenum行停住
    5. break *address,在运行的内存地址出停住
    6. break 没有参数时,表示在下一条指令出停住
    7. break if 表示条件成立时停止
  4. 删除断点
    1. info breakpoint 列出断点列表
    2. delete number 删除断点
    3. delete n:m 删除n到m所有断点
  5. 单步命令
    1. next (简写为n) 类似于step over, 不会进入函数内部
    2. step (简写为s) 进入函数内部
    3. next 执行count步后停住,不进入调用函数内部
    4. step 执行count步后停住,进入调用函数内部,此函数编译有debug信息
    5. set step-mode 打开stop-mod模式,这样进入单步跟踪(step命令)时,若跨越没有调试信息的函数,则程序则会在该函数的第一条指令处停止,而不会跳过整个函数
    6. finish 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈指针,返回值及参数值等信息
    7. until (u) 退出循环
    8. stepi (si) 和 nexti (ni) 单步跟踪一条机器指令
    9. continue (c) 当程序被停止后,可以使用continue恢复程序直到程序结束或者到达下一个断点
    10. c [ignore-count]
    11. continue [ignore-count]
    12. fg [ignore-count]
  6. print 命令
    1. p 打印变量值
    2. p / f为格式, x:16进制, d:10, u:16无符号,o:8, t:2, a:16, c:字符,f:浮点
    3. @操作符,int array = (int)malloc(len*sizeof(int)); p *array@len, 可以显示len长度个数据
    4. print x=4 改变变量的值
    5. 1,2…. 过往print的结果,可以直接引用
  7. watch
    1. watch 为表达式(变量)expr设置一个观察点,一旦表达式值由变化,马上停止运行
    2. rwatch 当表达式(变量) expr被读时,停止程序运行。
    3. awatch 当表达式(变量) expr的值被读或被写时,停止程序运行
    4. info watchpoints 列出当前设置的所有观察点
  8. examine (x) 查看内存
    1. x / [n/f/u] x/后面的n,f,u都是可选的参数, n表示显示内存的长度,f表示显示格式, 字符串为s,地址为i,u表示从当前地址往后请求的字节数,如果不指定,默认是4字节, b:单字节, h:双字节,w:四字节,g:八字节, 如 x/3uh 0x54320
  9. set 修改内存
    1. (gdb)set (unsigned char )p = ‘h’
    2. (gdb)set (unsigned char )(p+1) = ‘e’
    3. (gdb)set (unsigned char)(0x602010)=’l’
  10. jump 命令, 提供乱序执行代码功能
    1. jump [linespec] 后面跟行号,可以是file:line格式
    2. jump +num 偏移格式
    3. jump [address] 后面跟内存地址
    4. jump命令用在一个函数内部,跨函数出栈时会有问题
  11. signal 命令
    1. signal [signal] 1-15,产生SIGINT信号
  12. return 忽略断点后还没有执行的函数代码
  13. call命令 强制执行调用函数
    1. call strcpy(p,”hello world”);
    2. call printf(%s\n”,p)
  14. info命令
    1. info registers 查看除了浮点寄存器以外的寄存器
    2. info all-registers 查看所有寄存器 包括浮点寄存器
    3. info registers [regname …] 查看指定的寄存器
    4. info break 查看断点信息
    5. info watchpoints 查看所有观察点
    6. info signals 查看gdb正在检测的信号
    7. info handle 同info signals
    8. info line 查看源代码在内存中的地址, 后面可跟行号,函数名,文件名:行号,文件名:函数名等多种形式, 如 info line main.c:main
  15. disassemble 用于反汇编,查看当前执行时源代码的机器码,实际上只是把目前内存中的指令冲刷出来
    1. disassemble func
0 0
原创粉丝点击