【精品】gdb调试手册

2016/08/30 - C/C++ 工具

gdb原理:利用操作系统提供的系统调用ptrace。详情请看

gdb进行调试的进程建议编译参数添加-g、并去掉strip(-g3可在gdb打印宏)。

启动方式

  • gdb 进程名 //(支持相对或绝对路径)
  • gdb -p 进程pid
  • gdb进入后使用file指令指定调试进程或者attach pid
  • detach //不调试时可脱离进程,让其继续运行,不被暂停

断点相关指令

  • b 7 //行号
  • b 函数名
  • b *0x400522 //地址
  • b *main //在 main 函数的 prolog 代码处设置断点(prolog、epilog,分别表示编译器在每个函数的开头和结尾自行插入的代码
  • b test.c:5
  • b Foo::foo //命名空间
  • b (anonymous namespace)::bar //匿名空间
  • b 10 if i==101 //条件断点
  • tb a.c:15 //临时断点,使用一次就失效
  • ignore 1 5 //忽略接下来5次的编号为1的断点的暂停

  • j 15 //跳到15行,但是局部变量不会跟着改变

  • info breakpoints //查看所有断点
  • d //删除所有断点
  • d 1 //删除编号为1的断点

保存与恢复断点

  • save breakpoints file-name-to-save
  • source file-name-to-save

启动指令

  • r //运行被调式的程序,可加参数
  • c //继续往下运行,直到遇到下一个断点

单步调试相关指令

  • s //执行一行源代码,如果这行代码有函数则进入函数,如果是库函数也就是不带调试信息的函数,则即使s指令也不会进入,解决方法set step-mode on
  • fin/re //退出函数
  • return 40 //退出函数并以40为返回值
  • call func() //直接调用函数,跟print指令一样
  • n //执行一行源代码,不进入函数
  • si、ni //执行一行汇编指令,是否进入函数同上
  • util //退出循环

观察点相关指令

  • watch a //当一个a变量值发生变化时,程序暂停
  • info watchpoints //查看所有观察点
  • watch a thread 2 //针对特定线程(编号为2的线程)生效
  • rwatch a //设置读观察点
  • awatch a //设置读写观察点

堆栈相关指令

  • bt //打印所有调用栈
  • bt full //打印所有调用栈并输出所有局部变量
  • frame 1 //bt打印所有调用栈,frame切换到特定的栈。
  • up/down 1 //上下切换堆栈

打印相关指令

  • p 变量名
  • p func2::b
  • p ‘static-1.c’::var //打印静态变量
  • p *(vec._M_impl._M_start)@vec.size() //打印STL容器的内容
  • p array[60]@10 //打印数组第60~69个元素的值
  • p $_exitcode //打印程序退出时的exit_code
  • set print elements 10 //设置最多打印数组中的前10个元素
  • set print array-indexes on //数组打印下标
  • set print pretty on //显示结构体时缩进
  • set print object on //打印基类指针时,显示其实际的派生类

设置每步都打印的内容

  • display 变量名 //每步调试都打印变量值
  • display /i $pc //每步调试都打印当前汇编指令

  • x/s str1 //打印ASCII字符串
  • x/ws str2 //打印宽字符字符串
  • x/16xb a //以16进制格式打印数组a前16个byte的值
  • x/16ub a //以无符号10进制格式打印数组a前16个byte的值
  • x/16tb a //以2进制格式打印数组a前16个byte的值
  • x/16xw a //以16进制格式打印数组a前16个word(4个byte)的值
  • x/i $pc //打印将要执行的汇编指令
  • l/list //打印当前上下文源代码(源码需放置到二进制目录下)
  • directory ../newdir/ //设置源码搜索目录

  • disassemble //输出汇编指令,也可以指定函数
  • disas /m main //将函数源代码和汇编指令映射起来

info指令

  • info registers //打印当前寄存器值
  • info args //打印当前函数参数
  • info files //打印当前进程的地址映射
  • info proc mappings //同上
  • info thread //打印进程内各个线程的信息
  • info functions //打印所有函数,支持正则表达式
  • info frame //打印被选中(frame num)的堆栈
  • info watchpoints //打印所有观察点
  • info locals //打印当前栈中的所有局部变量
  • info variables //打印所有全局、静态变量
  • info inferiors //打印进程状态
  • info signals //打印信号信息 -info sharedlibrary //打印共享链接库信息

修改变量值相关指令

  • set main::p1=”Jil”
  • set var i = 8
  • set var $eax = 8
  • set {int}0x8047a54 = 8

  • q //退出

信号相关指令

  • handle SIGHUP nostop //当SIGHUP信号发生时,gdb不暂停程序
  • handle SIGHUP noprint //当SIGHUP信号发生时,gdb不打印信号信息
  • handle SIGHUP nopass //当SIGHUP信号发生时,gdb不把信号丢给程序处理
  • signal SIGHUP //立即给程序发送信号

批量执行相关指令

gdb -p `ps -ef |grep worker | grep -v grep  | awk '{print $2}'`  -x ../a.txt
//a.txt文件内容
b recvfrom//设置断点
commands
silent
watch stOidbAddr//监控变量
watch iOidbAddrLen
watch m_sTempBuf
cont
end
c

catchpoint相关指令

  • catch fork //到当程序调用fork时暂停
  • catch exec
  • catch syscall
  • catch syscall 9
  • catch syscall ptrace

调试多进程指令

  • show follow-fork-mode //查看当前父子调试模式
  • set follow-fork-mode [parent|child]
  • set detach-on-fork off //同时调试父子进程,在调试一个进程时,另外一个进程处于挂起状态
  • info inferiors //查看进程状态
  • inferior 2 //切换到id为2的进程进行调试

  • set schedule-multiple on //父子进程都同时运行
  • set scheduler-locking on //调试一个线程时,让其它线程暂停执行

coredump相关指令

原因:内存越界、线程不安全函数、非法指针、堆栈溢出

查看core文件限制

ulimit -c

取消core文件限制,只在本次shell的会话有效,可以在系统配置文件中添加。

ulimit -c unlimited

查看coredump后文件生成的地方,如果不是绝对路径则core文件生成的地方是相对于进程启动时的路径。

cat /proc/sys/kernel/core_pattern

调用seteuid()/setegid()改变了进程的有效用户或组,则在默认情况下系统不会为这些进程生成coredump。将/proc/sys/fs/suid_dumpable设置为1则仍会生成core文件。

gdb 进程名 core文件
bt    //即可查看core的调用栈了。前提当然是-g、nostrip。

/proc/PID/coredump_filter决定过滤什么内存写到core文件中。

其他调试命令及方法

  • readelf -l 进程名 //查看文件地址映射,跟gdb中info file指令类似(readelf -wliaprmfFsoR 进程名,可查看函数地址)
  • dmesg //查看系统错误日志 /var/log/message
  • objdump //进程反汇编,其中包含进程逻辑地址
  • nm
  • strings
  • 即通segv组件

命令缩写

  • b -> break
  • c -> continue
  • d -> delete
  • f -> frame
  • i -> info
  • j -> jump
  • l -> list
  • n -> next
  • p -> print
  • r -> run
  • s -> step
  • u -> until
  • aw -> awatch
  • bt -> backtrace
  • dir -> directory
  • disas -> disassemble
  • fin -> finish
  • ig -> ignore
  • ni -> nexti
  • rw -> rwatch
  • si -> stepi
  • tb -> tbreak
  • wa -> watch
  • win -> winheight

如果文章对您有帮助,欢迎扫描下方二维码赞助(一分也是爱噢),谢谢

Search

    一分也是爱噢 一分也是爱

    目录