gdb调试命令

======================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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值