gdb是强大的UNIX下的程序调试工具,提供4个主要的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
步骤一:启动程序
file命令:指定执行的程序
set args命令:设置执行程序的参数
show args命令:显示设置执行程序的参数
run命令:执行程序
(gdb) file /***/php #设置启动的程序
Reading symbols from /***/php...(no debugging symbols found)...done.
(gdb) set args /***/core_test.php #设置启动的参数
(gdb) show args #显示启动的参数
Argument list to give program being debugged when it is started is "/***/core_test.php ".
(gdb) run #启动程序
Starting program: /***/php /***/core_test.php
[Thread debugging using libthread_db enabled]
[New Thread 0x2aaab0858940 (LWP 1685)]
[Thread 0x2aaab0858940 (LWP 1685) exited]
步骤二:线程程序的堆栈
backtrace命令:打印程序的调用栈信息,使用backtrace默认显示最近10个堆栈信息,backtrace [n],显示最近n个调用栈信息,backtrace full显示所有调用栈信息。执行一下backtrace命令,看看结果
#0 network_connect (ptr=0xf22180) at libmemcached/connect.c:400
#1 memcached_connect (ptr=0xf22180) at libmemcached/connect.c:537
#2 0x00002aaaafa2ffa4 in memcached_mget_by_key_real (ptr=0xf21e70, master_key=0x0,
master_key_length=0, keys=0x7fffffffbe60, key_length=0x7fffffffbe58, number_of_keys=1,
mget_mode=true) at libmemcached/get.c:241
#3 0x00002aaaafa305d0 in memcached_mget_by_key (ptr=0x0,
master_key=0x2 <Address 0x2 out of bounds>, master_key_length=0, keys=0x0,
key_length=0x2aaaab6adaa0, number_of_keys=18374404375085870190) at libmemcached/get.c:295
#4 0x00002aaaaf815b3e in php_memc_get_impl (ht=<value optimized out>, return_value=0xef62d8,
return_value_ptr=<value optimized out>, this_ptr=0xef5058,
return_value_used=<value optimized out>, by_key=<value optimized out>)
at /tmp/source/pecl/memcached-1.0.2/php_memcached.c:451
#5 0x000000000073379b in zend_do_fcall_common_helper_SPEC ()
#6 0x00000000007329b3 in execute ()
#7 0x0000000000714283 in zend_execute_scripts ()
#8 0x00000000006d3d4d in php_execute_script ()
#9 0x0000000000793bac in main ()
backtrace 命令产生一张列表,包含着从最近的过程开始的所有有效过程和调用这些过程的参数。
步骤三:设置断点和打印变量
break命令:可以在程序中设置断点,有以下4种形式:
1)break [c-file]:[line-number] 在指定的源文件,指定的行数设置断点,如果不指定c-file,则在main函数所在的源文件行数设置断点
2)break [c-file]:[function-name] 使程序恰好在进入指定的函数之前停止。
3)break line-or-function if condition 如果condition(条件)是真,程序到达指定行或函数时停止。
4)break routine-name 在指定例程的入口处设置断点
delete breakpoint 1 #这里我删除了刚建的断点
从断点继续运行,有2种形式:
1)使用continue命令:继续程序执行,直到程序结束,或遇到下一个断点
2)使用next命令:执行程序的下一行
OK,断点设置完毕,可以执行run命令将程序跑起来
Starting program: /***/php /***/core_test.php
[Thread debugging using libthread_db enabled]
[New Thread 0x2aaab0858940 (LWP 6470)]
[Thread 0x2aaab0858940 (LWP 6470) exited]
Breakpoint 2, network_connect (ptr=0xf22180) at libmemcached/connect.c:386
386 libmemcached/connect.c: No such file or directory.
in libmemcached/connect.c
(gdb) next
383 in libmemcached/connect.c
(gdb) next
389 in libmemcached/connect.c
现在进入了逐行调试,接下来,使用命令打印变量的值。
whatis命令:识别数组或变量的类型
ptype命令:比whatis的功能更强,他可以提供一个结构的定义
(gdb) whatis use
type = struct addrinfo *
(gdb) ptype use
type = struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_t ai_addrlen;
struct sockaddr *ai_addr;
char *ai_canonname;
struct addrinfo *ai_next;
} *
print命令:print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。
使用print [var-name]