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. CSS特殊性值

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. python3.5-day5_迭代器_生成器_装饰器_模块

    笔者QQ 360212316 迭代器&生成器 生成器: 一个函数调用返回一个迭代器,那这个函数叫做生成器,如果函数中包含yield语法,那么这个函数就会变成生成器 生成器的特点: 1.生成器必 ...

  3. ( 转)UVM验证方法学之一验证平台

    在现代IC设计流程中,当设计人员根据设计规格说明书完成RTL代码之后,验证人员开始验证这些代码(通常称其为DUT,Design Under Test).验证工作主要保证从设计规格说明书到RTL转变的正 ...

  4. 318. Maximum Product of Word Lengths

    Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...

  5. VC++ 中CDC与HDC的区别以及二者之间的转换

    MFC类的前缀都是C开头的  H开头的大多数是句柄  这是为了助记,是编程读\写代码的好的习惯.  CDC中所有MFC的DC的基类.常用的CClientDC dc(this);就是CDC的子类(或称派 ...

  6. Linux课程实践三:简单程序破解

    一.基本知识 1. 常用指令机器码 不同版本对应机器码不同,这里以我做实验的kali(Intel 80386)为例. 指令 作用 机器码 nop 无作用(no operation) 90 call 调 ...

  7. python安装tkinter

    python2安装tkinter sudo apt-get install python-tk python3 安装tkinter sudo apt-get install python3-tk

  8. 新年SO交期更新——FP_SO2SAP

    (一)         以下逻辑落在12月26日-2月4日生效,2月5日此段逻辑失效: (二)         针对SO创建日期落在N-1天的新单进行处理: (三)         根据FP运算逻辑: ...

  9. 新版react踩坑总结

    使用es6语法与原本es5语法几个有区别的地方 1.React.creatClass与React.Component var Component = React.createClass({ rende ...

  10. 配置FastReport,FastReport报表加载不出来

    插件链接: Demo地址:http://pan.baidu.com/s/1dEXUvsP FastReport.Net软件地址:https://pan.baidu.com/s/1c2kNBVi     ...