gdb调试memcached

来源:互联网 发布:iphone4id锁破解软件 编辑:程序博客网 时间:2024/06/04 00:57

为了方便gdb调试,按照如下重新编译:

如果list命令不好用,说明没有把gdb编译进去(若执行完一下步骤依然不好用,可以先make clean然后再执行下面的命令,需要在执行该命令的终端或新的终端打开有效,之前开启的终端依然无效)


./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent CPPFLAGS='-ggdb3' 

make && make install

gdb memcached
gdb>set args -p 11211 -m 64 -uroot -t2 -vv

然后

gdb>b main

然后s,n,u,disp,printf跟踪。


gdb调试多线程代码


gdb调试代码的强大能力之前已经见识过了,让我这个之前只会在IDE中Debug的程序员深受震动。最近一个更大的震动来自到发现gdb在调试多程序程序 方便非常强大,还有能够直接连到一个正在执行的程序中debug,这真是太神奇了。下面讲一讲gdb如何连上一个正在运行的程序,又如何在连上后查看其中运行的多个线程并查看各线程中的运行信息。

gdb debug正在运行的程序
在开发调试一些程序过程中,会碰到某些时间系统CPU骤增,且长时间CPU不释放。Java程序碰到这种情况时,回想办法dump线程,看看线程堆栈中正在执行哪些方法。对于C/C++程序有一个更好的办法–用gdb attach的方法debug,查看各线程信息,发现正在执行的方法。下面说一下做法。

gdb attach方式连上正在运行的程序有两种方式,下面以memcached为例说明这两种方法:
gdb /path/to/memcached pid
先获取memcached的绝对路径,再ps aux获取其pid,最后运行上面的命令。下面是在我机器上的操作。
star@star:resources$ ps aux | grep memcached | grep -v grep
star 53662 0.0 0.1 2452380 5520 ?? Ss 18 512 0:11.16 memcached -d -m 256 -l 127.0.0.1 -p 11211
star@star:resources$ whereis memcached
/usr/bin/memcached
star@star:resources$ gdb /usr/bin/memcached 53662
GNU gdb 6.3.50-20050815 (Apple version gdb-1705) (Fri Jul 1 10:50:06 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for details.
This GDB was configured as “x86_64-apple-darwin”…Reading symbols for shared libraries .. done

/Users/star/Workspace/opensource/protobuf-java-format-read-only/src/test/resources/53662: No such file or directory
Attaching to program: `/usr/bin/memcached’, process 53662.
Reading symbols for shared libraries + done
Reading symbols for shared libraries ++…………………… done
Reading symbols for shared libraries + done
0x00007fff83a567e6 in kevent ()
(gdb)

另一种方式则是先进入gdb 交互环境,使用 attach pid 命令,attach到运行中的程序中。
gdb一旦attach上运行中的程序,该程序将会中断,这时可以使用gdb命令行的指令查看程序的各种信息,甚至可以更改程序中的变量。在gdb退出后这个改变的变量仍然有效。

如果是多线程程序,则需要找到各个线程正在执行的方法。这时需要使用到gdb多程序debug的指令。大致有如下指令:

thread threadno: 切换到某指定threadno的线程,该threadno为gdb为每个thread设置的值;

info threads:查看所有的thread,gdb会为每个thread分配一个标识,即threadno;

show print thread-events [on | off] :当gdb发现线程创建或退出时,是否打印信息;

bt 查看当前线程的堆栈,可以很方便看出当前正在调用的方法,如果多个线程或多次gdb中断是,都在调用同一个业务代码的方法时,便可断定该方法是瓶颈。


原创粉丝点击