GDB 是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行 序列,形成脚本。UNIX 下的软件全是命令行的,这给程序开发提供了极大的便利,命令行 软件的优势在于, 他们可以非常容易的集成在一起, 使用几个简单的已有工具的命令,可就 以做出一个非常强大的功能。

于是 UNIX 下的软件比 windows 下的软件更能有机的结合,各自发挥各自的长处,组合 成更为强筋的功能。而 windows 下的图形软件基本上各自为营,互相不能条用,很不利于 各种软件的相互集成。在这里并不是要和 windows 做个什么比较,所谓“寸有所长,尺有 所短”,图形化工具还是有不如命令行的地方。

用 GDB 调试程序 GDB 概述

GDB 是 GNU 开源组织发布的一个强大的 UNIX 下调试程序工具。 或许各位比较喜欢种那 图形界面方式的,像 VC,BCB 等 IDE 的调试,但如果是在 UNIX 平台下作软件,GDB 这个调试工具有比 VC,BCB 的图形化调试器更强大的功能。所谓 “寸有所长, 尺有所短”就是这个道理。

一般来说,GDB 主要帮助你完成下面四个方面的功能: 1、启动你的程序,可以按照你自定义的要求随心所欲的运行程序。 2、可以让调试程序在你所指定的位置的断点处停止。 3、当程序停止时,可以检查此时你的程序中所发生的事情。 4、动态的改变你程序的执行环境。

从上面看来,GDB 和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在 细节上, 你会发现GDB 这个调试工具的强大, 大家可能习惯图形化的调试工具, 但有时候, 命令行的调试工具却有着图形化工具所不能完成的功能。

让我们来看一个例子: 源程序:test.c

1 #include

0 func (n=250) at tst.c:5

1 0x080484e4 in main () at tst.c:24

2 0x400409ed in __libc_start_main () from /lib/libc.so.6

(gdb) finish ——————推出函数

Run till exit from #0 func (n=250) at tst.c:5

0x080484e4 in main () at tst.c:24

24 printf("result[1-250] = %d \n", func(250) );

Value returned is $6 = 31375

(gdb) continue

Continuing.

result[1-250] = 31375 ——————程序输出。

Program exited with code 027.——————程序退出,调试结束。 (gdb) quit ——————退出 gdb

好了,有了以上的感性认识,还是让我们来系统的认识一下gdb 吧。 使用 GDB

一般来说 GDB 主要调试的是 C/C++程序。要调试 C/C++程序,首先在编译时,我们必须 要把调试信息加到可执行文件中。 使用编译器 (cc/gcc/g++)的-g 参数可以做到这一点, 如:

$ cc –g hello.c –o hello

$ g++ -g hello.cpp –o hello

如果没有-g, 你将看不见程序的函数名, 变量名, 所代替的全是运行的内存地址。 当你用

-g 把调试信息假如之后,并成功编译目标代码以后,让我们来看看如果用GDB 调试它。 启动 GDB 的方法有以下几种:

1、 gdb

0 func (n=250) at tst.c:6

1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30

2 0x400409ed in __libc_start_main () from /lib/libc.so.6 从上可以看出函数的调用栈信息:__libc_start_main --> main() --> func()

backtrace

0 set_quotes (lq=0x34c78 "<<", rq=0x34c88 ">>")

at input.c:530

530 if (lquote != def_lquote)

set print address off

关闭函数的参数地址显示,如:

(gdb) set print addr off

(gdb) f

0 set_quotes (lq="<<", rq=">>") at input.c:530 530 if (lquote != def_lquote)

show print address

查看当前地址显示选项是否打开。

set print array set print array on

打开数组显示, 打开后当数组显示时, 每个元素占一行, 如果不打开的话, 每个元则素 以逗号分隔。这个选项默认是关闭的。与之相关的两个命令如下,就不多说了。

set print array off

show print array

set print elements

是代码行的内存地址。

注意,jump 命令不会改变当前的程序栈中的内容,所以,当你从一个函数跳到另一个函 数时, 当函数运行完返回时进行弹栈操作时必然会发生错误, 可能结果还是非常奇怪的甚, 至产生 core dump。所以最好是同一个函数中进行跳转。

熟悉汇编的人都知道, 程序运行时, 有一个寄存器用于保存当前代码所在的内存地址所。 以 jump 命令也就是改变了这个寄存器中的值。于是,你可以使用“set $pc”来更改跳转执 行的地址。如:

set $pc = 0x485

三、 产生信号量

使用 singal 命令,可以产生一个信号量给被调试的程序。如:中断信号ctrl+c。这非常方

便于程序的调试,可以在程序运行的任意位置设置断点,并在该断点用GDB 产生一个信号 量,这种精确的在某处产生信号非常有利于程序的调试。

语法是:signal
p, 而在 Modula-2 中则是 p^。 并且, 如果你当前的程序是由几种不同语言一同编译成的,调在 试过程中,GDB 也能根据不同的语言自动的切换语言环境。这种跟着语言环境而改变的功 能,真是体贴开发人员的一种设计。

下面是几个相关于 GDB 语言环境的命令:

show language

查看当前的语言环境。如果GDB 不能识别为你所调试的编程语言,那么,C 语言被认为

是默认的环境。

info frame

查看当前函数的程序语言。

info source

查看当前文件的程序语言。

如果 GDB 没有检测出当前的程序语言,那么我们也可以手动设置当前的程序语言,使用 set language 命令即可做到。

当 set language 命令后什么也不跟的话,你可以查看GDB 所支持的语言种类: (gdb) set language

The currently understood settings are:

local or auto Automatic setting based on source file

c

c++

asm

chill fortran java modula-2

Use the C language Use the C++ language

Use the Asm language Use the Chill language

Use the Fortran language Use the Java language

Use the Modula-2 language

pascal Use the Pascal language

scheme Use the Scheme language

于是你可以在 set language 后跟上被列出来的程序语言名,来设置当前的语言环境。

Linux下GDB调试的更多相关文章

  1. Linux知识(5)----LINUX下GDB调试

    命令 解释 示例   file 加载被调试的可执行程序文件.因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径. (gdb) file gdb-sample     r c Run的简 ...

  2. 一文入门Linux下gdb调试(二)

    作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的 ...

  3. Linux下GDB调试简单示例

    这里介绍对文件first.c的基本GDB调试操作,只有部分命令,只是一个示例,运行环境为装有gcc编译器和gdb调试器的Linux环境,基本GDB调试命令如下表: 命令                 ...

  4. 一文入门Linux下gdb调试(一)

    作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 在window下我们习惯了IDE的各种调试按钮,说实话确实挺方便的,但到了Linux下,没有那么多的IDE ...

  5. Linux下GDB调试C/C++

    首先先编译程序并生成调试符号: gcc -g -c main.cpp gcc -o exefile main.o 以上的exefile为可执行程序的文件名 然后: gdb exefile 可以开始gd ...

  6. Linux下gdb调试(tui)

    1 处于TUI模式的GDB 为了以TUI模式运行GDB,可以在调用GDB时在命令行上指定-tui选项,或者处于非TUI模式时在GDB中使用Ctrl+X+A组合键.如果当前处于TUI模式,后一种命令方式 ...

  7. (十五)linux下gdb调试

    一.gdb常用命令: 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或 ...

  8. linux下gdb调试方法与技巧整理

    参考博客:  https://blog.csdn.net/niyaozuozuihao/article/details/91802994 1.运行命令run:简记为 r ,其作用是运行程序,当遇到断点 ...

  9. 25. Linux下gdb调试

    1.什么是core文件?有问题的程序运行后,产生"段错误 (核心已转储)"时生成的具有堆栈信息和调试信息的文件. 编译时需要加 -g 选项使程序生成调试信息: gcc -g cor ...

随机推荐

  1. zt:Linux查看程序端口占用情况

    http://www.cnblogs.com/benio/archive/2010/09/15/1826728.html yxr注: 由于安装eda工具libero,license要配端口,为确认端口 ...

  2. Ajax的封装03

    一.Ajax   1.原理:基于http协议的     内置对象:XMLHttpRequest 发起请求 那会相应     步骤: var xhr=new XMLHttpRequest(); // 请 ...

  3. 树莓派上Java程序作为linux服务并开机自动启动

    http://www.iigrowing.cn/shu_mei_pai_shang_java_cheng_xu_zuo_wei_linux_fu_wu_bing_kai_ji_zi_dong_qi_d ...

  4. 查询数据库最大id加1

    SELECT ISNULL(MAX(id),0)+1 AS MaxId FROM TABLE ISNULL(MAX(id),0) 就是如果id为空 就返回0,然后再加1

  5. Angular JS中$timeout的用法及其与window.setTimeout的区别

    $timeout的用法 angular.js的$timeout指令对window.setTimeout做了一个封装,它的返回值是一个promise对象.当定义的时间到了以后,这个promise对象就会 ...

  6. iOS 类的判断方法

    -(BOOL) isKindOfClass: classObj 用来判断是否是某个类或其子类的实例 -(BOOL) isMemberOfClass: classObj 用来判断是否是某个类的实例 -( ...

  7. 8 TIPS TO BECOME A MICROSOFT TECHNICAL EVANGELIST

    8 TIPS TO BECOME A MICROSOFT TECHNICAL EVANGELIST By Thomas Lewis February, 28 2012 I have had a pai ...

  8. 深入理解js——作用域

    "javaScript没有块级作用域",所谓"块",就是{}中间的内容.所以在声明变量的时候不要在"块"里面,要在一开始声明就好了. 其实j ...

  9. xpath爬取网页评论,网址的的调用方法,数据库特殊字符的替换

    # -*- coding:utf-8-*-from lxml import etreeimport urllibimport jsonimport requestsimport MySQLdbid=0 ...

  10. Endless Sky源码学习笔记-5

    游戏启动后的UI划分为三个区域,左侧滚动显示credits等信息以及偏好设置和退出按钮,中间显示载入动画,右侧显示玩家信息以及载入存档按钮,调用void MenuPanel::Draw()实现.首先画 ...