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