linux下使用gdb调试程序

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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值