调试php源代码需要使用工具gdb。让我们详细了解如何使用gdb来调试程序。
GDB简介
GDB是Linux/Unix下的GNU调试程序,主要用于调试C和C++程序。它允许用户在程序运行时观察程序的内部结构和内存使用情况。
作用:
可以按自定义方式启动并运行需要调试的程序。能够使用指定位置和条件表达式来设置断点。在程序暂停时监视变量的值。动态改变程序的执行环境。
基本操作命令:
这里介绍一些常用命令的基本用法。如需更深入的了解,请参考GDB手册或使用--help查看帮助。
基本命令列表:
file装入想要调试的可执行文件无list列出产生执行文件源代码的一部分lnext执行一行源代码但不进入函数内部nstep执行一行源代码并进入函数内部srun执行当前被调试的程序rcontinue继续执行程序cquit终止GDBqprint输出当前指定变量的值pbreak在代码里设置断点binfo break查看设置断点的信息i bdelete删除设置的断点dwatch监视一个变量的值,一旦值有变化,程序停住wahelpGDB中的帮助命令h
编程实例
创建一个C文件:test.c
#include#includevoid prints(int i){ printf("hello %dn", i);}void main (){ int i =0; for(i=1;i
编译这个文件,生成目标文件test:
gcc -o test test.c
运行这个程序:
./test
输出结果:
hello 1hello 2hello 3hello 4hello 5
GDB调试程序
如果需要使用GDB调试,在编译test.c时需要打开调试选项:
gcc -o -ggdb test test.c
调试选项资料:
GNU CC拥有许多特别选项,既可以调试用户的程序,也可以对GCC排错。-g选项以操作系统的本地格式(stabs, COFF, XCOFF,或DWARF)生成调试信息,GDB能够使用这些调试信息。在大多数使用stabs格式的系统上,-g选项启动只有GDB才使用的额外调试信息;这些信息使GDB调试效果更好,但有可能导致其他调试器崩溃或拒绝读入程序。如果需要控制是否生成额外信息,可以使用-gstabs+, -gstabs, -gxcoff+, -gxcoff, -gdwarf+, 或-gdwarf。GNU CC允许结合使用-g和-O选项。优化后的代码可能会产生一些令人惊讶的结果:某些声明过的变量根本不存在;控制流程直接跑到没有预料到的地方;某些语句因为计算结果是常量或已经确定而没有执行;某些语句在其他地方执行,因为它们被移到循环外面了。然而,调试优化后的输出是可能的,对可能含有错误的程序使用优化器是合理的。如果GNU CC支持输出多种调试信息,-ggdb选项非常有用,它以本地格式(如果支持)输出调试信息,尽可能包括GDB扩展。
启动GDB

载入文件:
使用file命令载入文件:
file test
结果:
gcc -o -ggdb test test.c
也可以通过直接启动的方式载入文件:
豆包AI编程
豆包推出的AI编程助手
483 查看详情
root@ubuntu:/opt/c++# gdb testGNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2Copyright (C) 2010 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law. Type "show copying"and "show warranty" for details.This GDB was configured as "i686-linux-gnu".For bug reporting instructions, please see:...Reading symbols from /opt/c++/test...done.
查看源代码:
使用list命令查看源代码:
(gdb) list1#include2#include3void prints(int i)4{5 printf("hello %dn", i);6}7void main ()89{10 int i =0;(gdb)
每次只列出10行,如果要从第11行开始继续列出源代码,可以输入:
(gdb) list
也可以直接按回车键,GDB提供了一个方便的功能,在提示符下直接按回车表示用适当的参数重复上一条命令。
回车:
(gdb) list1#include2#include3void prints(int i)4{5 printf("hello %dn", i);6}7void main ()89{10 int i =0;(gdb) 11 for(i=1;i
单步逐条执行:
首先使用start命令开始执行程序:
(gdb) startTemporary breakpoint 1 at 0x80483e9: file test1.c, line 10.Starting program: /opt/c++/test1 Temporary breakpoint 1, main () at test1.c:1010 int i =0;(gdb)
这表示程序停在main函数中变量定义之后的第一条语句处等待命令,GDB列出这条语句表示它还没执行,并且马上要执行。
我们可以使用next命令(简写为n)控制这些语句一条一条地执行:
(gdb) next11 for(i=1;i
逐条执行并进入函数:
使用start命令重新开始,然后使用step命令(简写为s)进入函数中执行:
(gdb) startTemporary breakpoint 2 at 0x80483e9: file test1.c, line 10.Starting program: /opt/c++/test1 Temporary breakpoint 2, main () at test1.c:1010 int i =0;(gdb) next11 for(i=1;i
进入到prints函数。
在函数中有几种查看状态的办法,backtrace命令(简写为bt)可以查看函数调用的栈帧:
(gdb) bt#0 prints (i=1) at test1.c:5#1 0x08048407 in main () at test1.c:12(gdb)
main函数传进来的参数是i=1。main函数的栈帧编号为1,prints的栈帧编号为0。
查看局部变量:
可以使用info命令(简写为i)查看局部变量:
i locals
如果想查看main函数当前局部变量的值,也可以做到,先使用frame命令(简写为f)选择1号栈帧,然后再查看局部变量:
(gdb) f 1#1 0x08048407 in main () at test1.c:1212 prints(i);(gdb)
输出当前指定变量的值:
使用print命令输出当前指定变量的值:
(gdb) p i$1 = 1(gdb)
以上就是gdb调式程序的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/465209.html
微信扫一扫
支付宝扫一扫