gdb调试手册

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

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


启动方式

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

 

断点相关指令

  • b 7                      //行号
  • 函数名
  • 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

 

 启动指令

  •      //运行被调式的程序,可加参数
  • 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 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

gdb调试手册_第1张图片

你可能感兴趣的:(linux系统)