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: 切换线程
- 正常情况下多个线程会一起执行,不会因为在一个线程打了断点,另一个线程就不执行了
调度器锁模式
- 理解调度器锁模式
- set scheduler-locking off: 不锁定任何线程,所有线程可以继续执行.
- set scheduler-locking on: 只有当前线程可以执行,其他线程暂停运行.
- set scheduler-locking step: 当单步执行某一线程时,保证在调试过程中当前线程不会发生改变.其他线程也会随着被调试线程的单步执行而执行;但如果该模式下执行continue,until,finish命令,则其他线程也会执行,并且如果某一线程执行过程中遇到断点,则GDB会将该线程作为当前线程.(只有线程创建后这个命令的暂停效果才有效)
- 查看调度器锁模式:show scheduler-locking
调试coredump文件
什么是coredump文件?
- coredump文件又称之为核型转储文件.进程运行时,突然崩溃时的那一瞬间的进程内存快照,会把进程此刻内存,寄存器状态,运行堆栈等信息转储保存在一个文件
怎么产生?
- ulimit -a 查看core file size
调试coredump文件
- gdb [binfile] [coredump file]
- 查看调用堆栈,寻找崩溃原因.
- 根据崩溃点,查找代码,分析原因.
- 修复bug.