本文共 3222 字,大约阅读时间需要 10 分钟。
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 , 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=backtrace 命令产生一张列表,包含着从最近的过程开始的所有有效过程和调用这些过程的参数。, return_value=0xef62d8, return_value_ptr= , this_ptr=0xef5058, return_value_used= , by_key= ) 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 ()
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:386386 libmemcached/connect.c: No such file or directory. in libmemcached/connect.c(gdb) next383 in libmemcached/connect.c(gdb) next389 in libmemcached/connect.c现在进入了逐行调试,接下来,使用命令打印变量的值。
whatis命令:识别数组或变量的类型
ptype命令:比whatis的功能更强,他可以提供一个结构的定义(gdb) whatis usetype = struct addrinfo *(gdb) ptype usetype = 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]
转载地址:http://obzfk.baihongyu.com/