赞
踩
今天一早到了公司,策划就和我说,前几天出过问题的那台服务器,玩家又登陆不上游戏了。
上去一看,又是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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。