======================gdb======================
显示当前位置:where
查看下/上一条命令 ctrl+n/ctrl+p
切换到命令行:focus cmd
切换到源码:focus src
查看堆栈:bt
查看局部变量:info locals
查看变量类型:whatis 变量
或者:ptype 变量
调试正在运行的程序:
gdb attach PID 或 gdb <Program> 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<CMysqlManager>::Instance().Init(dbserver, dbuser, dbpassword, dbname))
{
LOG_FATAL << "Init mysql failed, please check your database config..............";
}
当在Instance内调用return,再调用step进入Init函数,结果是CMysqlManager类的变量成员不可访问,
出现$33 = <error reading variable: Cannot access memory at address 0xd>
所以调试链式函数的时候用finsh命令比较好
until + 行号 //运行到指定行
直接until好像能跳出循环?
set follow-fork-mode child
p打印16进制:p /x 变量
打印2进制: p /t 变量
指定线程打断点:
b EventLoop.cpp:118 thread 4