GDB基础操作

GDB

基础操作

  • l: 看当前行上下文/ l func 看func上下文
  • p: 打印变量/调用函数. p $寄存器名
  • bt: 打印栈回溯
  • f stack_id: 切换栈(只是能打印该栈的信息,并不会重新执行指令)
  • b: 打断点(b main.cc:5)/(b func有函数重载时会给多个函数下断点, b func(int)只会在这个函数打断点)/(b func if 表达式)
  • i b: 查看断点(info break); d num: 删除断点
  • tb:创建临时断点
  • s: 进入函数
  • n: 下一步
  • si:执行下一条机器指令。
  • ni:执行下一条机器指令,但不进入函数内部
  • c: 继续运行
  • watch 变量名/if 变量名 == ?(写入时打断)
  • rwatch 变量名/if 变量名 == ?(读取时打断)
  • awatch (写入和读取都会打断点)
  • tui enable/layout src
  • layout asm/src
  • r 参数(表示传入main的参数argc, argv)
  • finish: 继续执行程序,直到当前函数完成并返回到它的调用者

多线程调试

  • info threads: 查看线程信息
  • t thread_id: 切换线程
  • 正常情况下多个线程会一起执行,不会因为在一个线程打了断点,另一个线程就不执行了

调度器锁模式

  • 理解调度器锁模式
    1. set scheduler-locking off: 不锁定任何线程,所有线程可以继续执行.
    2. set scheduler-locking on: 只有当前线程可以执行,其他线程暂停运行.
    3. set scheduler-locking step: 当单步执行某一线程时,保证在调试过程中当前线程不会发生改变.其他线程也会随着被调试线程的单步执行而执行;但如果该模式下执行continue,until,finish命令,则其他线程也会执行,并且如果某一线程执行过程中遇到断点,则GDB会将该线程作为当前线程.(只有线程创建后这个命令的暂停效果才有效)
  • 查看调度器锁模式:show scheduler-locking

调试coredump文件

什么是coredump文件?

  • coredump文件又称之为核型转储文件.进程运行时,突然崩溃时的那一瞬间的进程内存快照,会把进程此刻内存,寄存器状态,运行堆栈等信息转储保存在一个文件

怎么产生?

  • ulimit -a 查看core file size

调试coredump文件

  • gdb [binfile] [coredump file]
    1. 查看调用堆栈,寻找崩溃原因.
    2. 根据崩溃点,查找代码,分析原因.
    3. 修复bug.