用gdb调试运行中的程序

  今天一早到了公司,策划就和我说,前几天出过问题的那台服务器,玩家又登陆不上游戏了。
  上去一看,又是CPU使用100%。这问题最近经常出现,又不好查,就干脆让运维先别重启了,直接上线调试。
  一开始以为是lua脚本的死循环,后来才发现原来是底层的定时器问题。查了一整个上午,学到了一些gdb的东西,这里记录一下。

1、使用gdb调试正在运行的程序:
先使用top或者ps命令,查出进程的ID。
然后使用:
gdb 程序名 进程ID
可以看到Attaching to program:xxx,process 18675 这样的输出,表示已经附上进程开始调试。
对于多线程,可以先列出线程的信息
(gdb) info thread
得到线程的序号

  9 Thread 0xb7fb1b90 (LWP 18676)  0x0073f402 in __kernel_vsyscall ()
  8 Thread 0xb75b0b90 (LWP 18677)  0x0073f402 in __kernel_vsyscall ()
  7 Thread 0xb6bafb90 (LWP 18678)  0x0073f402 in __kernel_vsyscall ()
  6 Thread 0xb61aeb90 (LWP 18679)  0x0073f402 in __kernel_vsyscall ()
  5 Thread 0xb57adb90 (LWP 18680)  0x0073f402 in __kernel_vsyscall ()
  4 Thread 0xb4dacb90 (LWP 18681)  0x0073f402 in __kernel_vsyscall ()
  3 Thread 0xb41a9b90 (LWP 18682)  0x0073f402 in __kernel_vsyscall ()
  2 Thread 0xb37a8b90 (LWP 18683)  0x0073f402 in __kernel_vsyscall ()
* 1 Thread 0xb7fb26e0 (LWP 18675)  0x0073f402 in __kernel_vsyscall ()

然后就可以选择需要调试的线程:
(gdb) thread 2
调试完成后,要使用detach 命令,让程序可以继续跑起来。

(gdb) detach
Detaching from program: xxx, process 18675

2、查看lua脚本的调用
当前调用的数据,在L->ci中可以查到,上一层调用的数据保存在L->ci - 1中,一直到L->base_ci
调用的文件名,以及行数,可以查看:
l->ci->func->value->gc->cl->l->p->source
l->ci->func->value->gc->cl->l->p->lineinfo

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值