linux下使用gdb调试程序
发布日期:2025-04-07 15:01:39 浏览次数:8 分类:精选文章

本文共 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=
, 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 ()
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: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]

上一篇:linux下使用logrotate切割nginx日志
下一篇:Linux下以C构建WEB服务并响应XHR(XMLHttpRequest)请求

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年05月01日 06时11分33秒