Linux下GDB调试
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 产生一个信号 量,这种精确的在某处产生信号非常有利于程序的调试。
语法是:signalp, 而在 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调试的更多相关文章
- Linux知识(5)----LINUX下GDB调试
命令 解释 示例 file 加载被调试的可执行程序文件.因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径. (gdb) file gdb-sample r c Run的简 ...
- 一文入门Linux下gdb调试(二)
作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的 ...
- Linux下GDB调试简单示例
这里介绍对文件first.c的基本GDB调试操作,只有部分命令,只是一个示例,运行环境为装有gcc编译器和gdb调试器的Linux环境,基本GDB调试命令如下表: 命令 ...
- 一文入门Linux下gdb调试(一)
作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 在window下我们习惯了IDE的各种调试按钮,说实话确实挺方便的,但到了Linux下,没有那么多的IDE ...
- Linux下GDB调试C/C++
首先先编译程序并生成调试符号: gcc -g -c main.cpp gcc -o exefile main.o 以上的exefile为可执行程序的文件名 然后: gdb exefile 可以开始gd ...
- Linux下gdb调试(tui)
1 处于TUI模式的GDB 为了以TUI模式运行GDB,可以在调用GDB时在命令行上指定-tui选项,或者处于非TUI模式时在GDB中使用Ctrl+X+A组合键.如果当前处于TUI模式,后一种命令方式 ...
- (十五)linux下gdb调试
一.gdb常用命令: 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或 ...
- linux下gdb调试方法与技巧整理
参考博客: https://blog.csdn.net/niyaozuozuihao/article/details/91802994 1.运行命令run:简记为 r ,其作用是运行程序,当遇到断点 ...
- 25. Linux下gdb调试
1.什么是core文件?有问题的程序运行后,产生"段错误 (核心已转储)"时生成的具有堆栈信息和调试信息的文件. 编译时需要加 -g 选项使程序生成调试信息: gcc -g cor ...
随机推荐
- 用HttpWebRequest提交带验证码的网站
using System; using System.Drawing; using System.IO; using System.Net; using System.Text; using Syst ...
- 表示即将废弃一个方法,或不赞成使用的一个方法或属性或其它,关键词 deprecated
- Nginx限制访问速率和最大并发连接数模块--limit (防止DDOS攻击)
Tengine版本采用http_limit_req_module进行限制 具体连接请参考 http://tengine.taobao.org/document_cn/http_limit_req_cn ...
- 并发下常见的加锁及锁的PHP具体实现-转载
并发下常见的加锁及锁的PHP具体实现 http://www.cnblogs.com/scotoma/archive/2010/09/26/1836312.html 在最近的项目中有这样的场景 1.生成 ...
- WAP端 穿透问题和解决方法
1. 穿透问题可这么理解, 共有2种问题: 问题1: 有A 和 B 两个弹层,B 弹层盖在A 弹层上面,B 弹层绑定 touchend 事件,当用户点击B 的时候 B隐藏,由于touchend 事件触 ...
- 嵌套移动APP端的H5页面meta标签
<meta charset="utf-8"> <meta content="width=device-width, initial-scale=1.0, ...
- 循序渐进Python3(十)-- 1 -- pymysql
使用pymsql 模块操作数据库 #!/usr/bin/env python , ),()]), user='root', passwd='123456', db='test')# 创建游标curso ...
- Erlang 从入门到精通(三) 改变工作目录
对于初学者来书,经常会碰到下面的错误: no such file or directoryerror 提示找不到文件,这时候就需要将文件放到工作目录下,或者直接修改工作目录到文件所在位置. 右键ERl ...
- Centos 7U盘安装
1. 8G U盘 老毛桃软件 centos 7 everything.iso 7.4G左右 2.遇到问题 安装一刚开始 报错 unexpected exception attribute error ...
- ATPCS和AAPCS
1. 基本概念 ATPCS (ARM-Thumb Procedure Call Standard) 规定了一些子程序间调用的基本规则,这些规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参 ...