热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gdb调式程序

gdb调式程序最近要调试PHP源代码,使用工具GDB.1.GDB简介GDB是LinuxUnix下一个GNU调试程序,是用来调试C与C程序的强力调试器。能
gdb调式程序
最近要调试PHP源代码,使用工具GDB.
1. GDB简介
GDB是Linux/Unix下一个GNU调试程序,是用来调试C与C++程序的强力调试器。能够让用户在程序运行时观察程序的内部结构和内存的使用情况。
作用:
1)按照自定义的方式启动运行需要调试的程序。
2)可以使用指定位置和条件表达式的方式来设置断点。
3)程序暂停时的值的监视。
4)动态改变程序的执行环境。

2.  基本操作命令:
这里只介绍常用命令的简单用法,如需读者想更加深入的了解,还请读者参照gdb手册。也可以使用--help查看。
基本命令列表:

命令
解释
简写
file
装入想要调试的可执行文件
list
列出产生执行文件源代码的一部分
l
next
执行一行源代码但不进入函数内部
n
step
执行一行源代码而且进入函数内部
s
run
执行当前被调试的程序
r
continue
继续执行程序
c
quit
终止GDB
q
print
输出当前指定变量的值
p
break
在代码里设置断点
b
info break
查看设置断点的信息
i b
delete
删除设置的断点
d
watch
监视一个变量的值,一旦值有变化,程序停住
wa
help
GDB中的帮助命令
h

3,编程实例

创建c文件:test.c

#include
#include
void prints(int i)
{printf("hello %d\n", i);
}
void main (){int i &#61;0;for(i&#61;1;i<6;i&#43;&#43;){prints(i);}}

编译&#xff0c;其目标文件为test

gcc -o test test.c

这个程序执行

./test

时显示如下结果:

hello 1
hello 2
hello 3
hello 4
hello 5

4 gdb调试程序

如果需要使用gdb调试

在编译test.c的时候&#xff0c;并把调试选项打开&#xff1a;

gcc -o -ggdb test test.c

&#xff08;调试选项资料&#xff1a;

调试选项(DEBUGGING OPTION)

GNU CC拥有许多特别选项,既可以调试用户的程序,也可以对GCC排错: 
-g 
以操作系统的本地格式(stabs, COFF, XCOFF,或DWARF).产生调试信息. GDB能够使用这些调试信息. 
在大多数使用stabs格式的系统上, &#96;-g&#39;选项启动只有GDB才使用的额外调试信息;这些信息使GDB 调试效果更好,但是有可能导致其他调试器崩溃,或拒绝读入程序.如果你确定要控制是否生成额外的信息, 使用&#96;-gstabs&#43;&#39;, &#96;-gstabs&#39;, &#96;-gxcoff&#43;&#39;, &#96;-gxcoff&#39;, &#96;-gdwarf&#43;&#39;,或&#96;-gdwarf&#39; (见下文). 
和大多数C编译器不同, GNU CC允许结合使用&#96;-g&#39;和&#96;-O&#39;选项.优化的代码偶尔制造 一些惊异的结果:某些声明过的变量根本不存在;控制流程直接跑到没有预料到的地方;某些语句因为计算结果是常量或已经确定而 没有执行;某些语句在其他地方执行,因为他们被移到循环外面了. 
然而它证明了调试优化的输出是可能的.对可能含有错误的程序使用优化器是合理的. 
如果GNU CC支持输出多种调试信息,下面的选项则非常有用. 
-ggdb 

以本地格式(如果支持)输出调试信息,尽可能包括GDB扩展. 

&#xff09;


1&#xff09;启动

2&#xff09;载入文件&#xff1a;file命令

file test

结果&#xff1a;

gcc -o -ggdb test test.c

也可以通过直接启动的方式载入文件&#xff1a;

root&#64;ubuntu:/opt/c&#43;&#43;# gdb test
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3&#43;: 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&#43;&#43;/test...done.

3&#xff09;list命令

也可以过回车查看源代码

(gdb) list
1 #include
2 #include
3 void prints(int i)
4 {
5 printf("hello %d\n", i);
6 }
7 void main ()
8
9 {
10 int i &#61;0;
(gdb)

一次只列10行&#xff0c;如果要从11行开始继续列源代码可以输入

(gdb) list

也可以什么都不输直接敲回车&#xff0c;gdb提供了一个很方便的功能&#xff0c;在提示符下直接敲回车表示用适当的参数重复上一条命令

回车&#xff1a;

(gdb) list
1 #include
2 #include
3 void prints(int i)
4 {
5 printf("hello %d\n", i);
6 }
7 void main ()
8
9 {
10 int i &#61;0;
(gdb)
11 for(i&#61;1;i<6;i&#43;&#43;){
12 prints(i);
13 }
14
15 }
16
(gdb)


4&#xff09;单步逐条执行 next

首先用start命令开始执行程序&#xff1a;

(gdb) start
Temporary breakpoint 1 at 0x80483e9: file test1.c, line 10.
Starting program: /opt/c&#43;&#43;/test1 Temporary breakpoint 1, main () at test1.c:10
10 int i &#61;0;
(gdb)
这表示停在main函数中变量定义之后的第一条语句处等待我们发命令&#xff0c;gdb列出这条语句表示它还没执行&#xff0c;并且马上要执行

我们可以用next命令&#xff08;简写为n&#xff09;控制这些语句一条一条地执行&#xff1a;

(gdb) next
11 for(i&#61;1;i<6;i&#43;&#43;){
(gdb) &#xff08;直接回车&#xff09;
12 prints(i);
(gdb) hello 1
11 for(i&#61;1;i<6;i&#43;&#43;){
(gdb)
12 prints(i);
(gdb)
hello 2
11 for(i&#61;1;i<6;i&#43;&#43;){
(gdb)
12 prints(i);
(gdb)
hello 3
11 for(i&#61;1;i<6;i&#43;&#43;){
(gdb)
12 prints(i);
(gdb)
hello 4
11 for(i&#61;1;i<6;i&#43;&#43;){
(gdb)
12 prints(i);
(gdb)
hello 5
11 for(i&#61;1;i<6;i&#43;&#43;){
(gdb)
15 }
(gdb)

5&#xff09;逐条执行并进入函数&#xff1a;

用start命令重新来过&#xff0c;step命令&#xff08;简写为s&#xff09;进入 函数中去执行&#xff1a;

(gdb) start
Temporary breakpoint 2 at 0x80483e9: file test1.c, line 10.
Starting program: /opt/c&#43;&#43;/test1 Temporary breakpoint 2, main () at test1.c:10
10 int i &#61;0;
(gdb) next
11 for(i&#61;1;i<6;i&#43;&#43;){
(gdb) next
12 prints(i);
(gdb) step
prints (i&#61;1) at test1.c:5
5 printf("hello %d\n", i);
(gdb)
进入到了函数prints

在函数中有几种查看状态的办法&#xff0c;backtrace命令&#xff08;简写为bt&#xff09;可以查看函数调用的栈帧&#xff1a;

(gdb) bt
#0 prints (i&#61;1) at test1.c:5
#1 0x08048407 in main () at test1.c:12
(gdb)
main传进来的参数是i&#61;1。main函数的栈帧编号为1&#xff0c;prints的栈帧编号为0。

6&#xff09;在可以用info命令&#xff08;简写为i&#xff09;查看局部变量

i locals

如果想查看main函数当前局部变量的值也可以做到&#xff0c;先用frame命令&#xff08;简写为f&#xff09;选择1号栈帧然后再查看局部变量&#xff1a;

(gdb) f 1
#1 0x08048407 in main () at test1.c:12
12 prints(i);
(gdb)

7&#xff09;输出当前指定变量的值 print

(gdb) p i
$1 &#61; 1
(gdb)




转:https://www.cnblogs.com/iplus/archive/2012/04/09/4490256.html



推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
author-avatar
五洋顽石_449
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有