gdb调试命令

======================gdb======================

显示当前位置:where

查看下/上一条命令    ctrl+n/ctrl+p

切换到命令行:focus cmd
切换到源码:focus src

查看堆栈:bt

查看局部变量:info locals

查看变量类型:whatis 变量 
或者:ptype 变量


调试正在运行的程序:
gdb attach PID 或 gdb PID

显示list(l)命令一次显示的行数
设置list命令显示的行数

查看当前栈帧:frame
切换到指定堆栈编号:frame(f) + 堆栈编号

gdb调试时,显示的是将要执行的下一行代码

gdb链式调用函数有个问题:
例如:a.fcn1().fcn2()
如果我想进入fcn2,必须要先step(s)进入fcn1直到fcn1返回前再输入step才能进入fcn2
但是如果我直接在fcn1最后输入next(n)(或finish),则调用堆栈会回到a.fcn1().fcn2(),这时候再step会跳 到下一行,而不是fcn2


从当前选定的栈帧的函数返回,return或者finish(返回该函数返回值)
return和finish的区别:
finish会继续执行直到当前栈帧的函数返回
而return会从当前栈帧的函数立即返回,不会往下执行,当前栈帧的剩余代码不被执行,然后返回该函数的返回值


当用gdb调试链式函数的时候,如果用return命令可能会出现段错误:
例如:
if (!Singleton::Instance().Init(dbserver, dbuser, dbpassword, dbname))
    {
        LOG_FATAL << "Init mysql failed, please check your database config..............";
    }
当在Instance内调用return,再调用step进入Init函数,结果是CMysqlManager类的变量成员不可访问,
出现$33 =
所以调试链式函数的时候用finsh命令比较好


until + 行号 //运行到指定行
直接until好像能跳出循环?


set follow-fork-mode child


p打印16进制:p /x 变量
打印2进制:     p /t 变量


指定线程打断点:
b EventLoop.cpp:118 thread 4

你可能感兴趣的:(Linux)