
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=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]
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年05月01日 06时11分33秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux 命令大全
2023-02-01
Linux 命令大全
2023-02-01
linux 命令拾遗
2023-02-01
linux 命令详解 十二
2023-02-01
Linux 命令集
2023-02-01
Linux 基本bash命令
2023-02-01
Linux 基金会与 RISC-V 基金会合作推广开源芯片
2023-02-01
linux 复制文件到当前目录
2023-02-01
linux 如何使用命令行隐藏特定进程和端口信息?一文教会你
2023-02-01
Linux 子系统(Windows Subsystem for Linux)启用详解
2023-02-01
Linux 学习总结(84)—— 回顾下正则表达式
2023-02-01
Linux 学习总结(85)—— 后端开发人员需要知道的 Linux 服务器性能指标总结
2023-02-01
Linux 学习总结(88)—— Linux 系统中的 Swap 交换分区总结
2023-02-01
Linux 学习总结(89)—— sed 入门详解
2023-02-01
Linux 学习总结(91)—— 100 个网络基础概念问答
2023-02-01
Linux 学习总结(92)—— Linux 高效率使用技巧
2023-02-01
Linux 学习总结(93)—— Linux 管道符使用总结
2023-02-01
Linux 学习总结(六十九)docker-1
2023-02-01