gdb调式程序

调试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

gdb调式程序

载入文件:

使用file命令载入文件:

file test

结果:

gcc -o -ggdb test test.c

也可以通过直接启动的方式载入文件:

豆包AI编程 豆包AI编程

豆包推出的AI编程助手

豆包AI编程 483 查看详情 豆包AI编程

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=1main函数的栈帧编号为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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 05:07:48
下一篇 2025年11月8日 05:12:42

相关推荐

发表回复

登录后才能评论
关注微信