常用的 gdb 命令
backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where breakpoint 在程序中设置一个断点
cd 改变当前工作目录
clear 删除刚才停止处的断点
commands 命中断点时,列出将要执行的命令
continue 从断点开始继续执行
delete 删除一个断点或监测点;也可与其他命令一起使用
display 程序停止时显示变量和表达时
down 下移栈帧,使得另一个函数成为当前函数
frame 选择下一条 continue 命令的帧
info 显示与该程序有关的各种信息
jump 在源程序中的另一点开始运行
kill 异常终止在 gdb 控制下运行的程序
list 列出相应于正在执行的程序的原文件内容
next 执行下一个源程序行,从而执行其整体中的一个函数
print 显示变量或表达式的值
pwd 显示当前工作目录
pype 显示一个数据结构 (如一个结构或 C++类的内容
quit 退出 gdb
reverse-search 在源文件中反向搜索正规表达式
run 执行该程序
search 在源文件中搜索正规表达式
set variable 给变量赋值
signal 将一个信号发送到正在运行的进程
step 执行下一个源程序行, 必要时进入下一个函数
undisplay display 命令的反命令, 不要显示表达式
until 结束当前循环
up 上移栈帧,使另一函数成为当前函数
watch 在程序中设置一个监测点(即数据断点
whatis 显示变量或函数类型
GDB 命令分类详解
一:列文件清
单 ........................................................................................................................................... .. (2)
二 :执行程
序 ........................................................................................................................................... (2)
三 :显示数
据 ........................................................................................................................................... (2)
四 :断点
(breakpoint ............................................................................................................................ . (3)
五. 断点的管
理 ........................................................................................................................................... .. (3)
六. 变量的检查和赋
值 (4)
七.单步执
行 ........................................................................................................................................... (4)
八. 函数的调
用 ........................................................................................................................................... .. (4)
九.机器语言工
具 ........................................................................................................................................... .4
十. 信
号 ........................................................................................................................................... ................4 十一 . 原文件的搜
索 ........................................................................................................................................... .5 十二 . UNIX接
口 ........................................................................................................................................... ....5 十三 . 命令的历
史 ........................................................................................................................................... ..5 十四 . GDB 帮
助 ........................................................................................................................................... ...5 十五 . GDB 多线
程 ..........................................................................................................................................
6 十六 . GDB 使用范
例 (7)
一:列文件清单
1. List
(gdb list line1,line2
二:执行程序
要想运行准备调试的程序,可使用 run 命令,在它后面可以跟随发给该程序的任何参数, 包括标准输入和标准输出说明符 (<和 >和外壳通配符 (*、?、[、 ]在内。
如果你使用不带参数的 run 命令, gdb 就再次使用你给予前一条 run 命令的参数, 这是很有用的。利用 set args 命令就可以修改发送给程序的参数, 而使用 show args 命令就可以查看其缺省参数的列表。
(gdb set args – b – x
(gdb show args
backtrace 命令为堆栈提供向后跟踪功能。
Backtrace 命令产生一张列表, 包含着从最近的过程开始的所以有效过程和调用这些过程的参数。三:显示数据
利用 print 命令可以检查各个变量的值。
(gdb print p (p为变量名
whatis 命令可以显示某个变量的类型
(gdb whatis p
type = int *
print 是 gdb 的一个功能很强的命令, 利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外 , 还可以包含以下内容 :
l 对程序中函数的调用
(gdb print find_entry(1,0
l 数据结构和其他复杂对象
(gdb print *table_start
$8={e=reference=’ \000’ ,location=0x0,next=0x0}
l 值的历史成分
(gdbprint $1 ($1为历史记录变量 , 在以后可以直接引用 $1 的值
l 人为数组
人为数组提供了一种去显示存储器块 (数组节或动态分配的存储区内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。
就像对待参数一样 , 让我们查看内存中在变量 h 后面的 10个整数,一个动态数组的语法如下所示:
base@length
因此 ,要想显示在 h 后面的 10个元素 ,可以使用 h@10:
(gdbprint h@10
$13=(-1,345,23,-234,0,0,0,98,345,10
四:断点 (breakpoint
break 命令(可以简写为 b 可以用来在调试的程序中设置断点,该命令有如下四种形式 :
l break line-number 使程序恰好在执行给定行之前停止。
l break function-name 使程序恰好在进入指定的函数之前停止。
l break line-or-function if conditio 如果 condition (条件是真 , 程序到达指定行或函数时停止。 l break routine-name 在指定例程的入口处设置断点
如果该程序是由很多原文件构成的, 你可以在各个原文件中设置断点, 而不是在当前的原文件中设置断点,其方法如下:
(gdb break filename:line-number
(gdb break filename:function-name
要想设置一个条件断点,可以利用 break if 命令,如下所示:
(gdb break line-or-function if expr
例 :
(gdb break 46 if testsize==100
从断点继续运行:countinue 命令
五.断点的管理
1.显示当前 gdb 的断点信息:
(gdb info break
他会以如下的形式显示所有的断点信息:
Num Type Disp Enb Address What
1 breakpoint keep y 0x000028bc in init_random at qsort2.c:155
2 breakpoint keep y 0x0000291c in init_organ at qsort2.c:168
(gdb
2. 删除指定的某个断点:
(gdb delete breakpoint 1
该命令将会删除编号为 1的断点,如果不带编号参数,将删除所有的断点(gdb delete breakpoint
3. 禁止使用某个断点
(gdb disable breakpoint 1
该命令将禁止断点 1, 同时断点信息的 (Enb域将变为 n
4.允许使用某个断点
(gdb enable breakpoint 1
该命令将允许断点 1, 同时断点信息的 (Enb域将变为 y
5.清除原文件中某一代码行上的所有断点
(gdbclean number
注 :number 为原文件的某个代码行的行号
六.变量的检查和赋值
l whatis: 识别数组或变量的类型
l ptype: 比 whatis 的功能更强 ,他可以提供一个结构的定义
l set variable: 将值赋予变量
l print: 除了显示一个变量的值外 , 还可以用来赋值
七.单步执行
next 不进入的单步执行
step 进入的单步执行
finish 如果已经进入了某函数, 而想退出该函数返回到它的调用函数中,可使用命令 finish
八.函数的调用
l call name 调用和执行一个函数
(gdb call gen_and_sork( 1234,1,0
(gdb call printf(“ abcd ”
$1=4
l finish 结束执行当前函数,显示其返回值 (如果有的话
九.机器语言工具
有一组专用的 gdb 变量可以用来检查和修改计算机的通用寄存器 , gdb 提供了目前每一台计算机中实际使用的 4个寄存器的标准名字 :
$pc程序计数器
$fp帧指针 (当前堆栈帧
$sp栈指针
$ps处理器状态
十.信号
gdb 通常可以捕捉到发送给它的大多数信号 , 通过捕捉信号 , 它就可决定对于正在运行的进程要做些什么工作。例如, 按 CTRL-C 将中断信号发送给 gdb , 通常就会终止 gdb 。但是你或许不想中断 gdb , 真正的目的是要中断 gdb 正在运行的程序, 因此 , gdb 要抓住该信号并停止它正在运行的程序, 这样就可以执行某些调试操作。
Handle 命令可控制信号的处理 ,他有两个参数,一个是信号名 ,另一个是接受到信号时该作什么。
几种可能的参数是 :
nostop 接收到信号时, 不要将它发送给程序,也不要停止程序。
stop 接受到信号时停止程序的执行,从而允许程序调试;显示一条表示已接受到信号的消息(禁止使用消息除外
print 接受到信号时显示一条消息
noprint 接受到信号时不要显示消息(而且隐含着不停止程序运行
pass 将信号发送给程序,从而允许你的程序去处理它、停止运行或采取别的动作。
nopass 停止程序运行, 但不要将信号发送给程序。
例如, 假定你截获 SIGPIPE 信号 , 以防止正在调试的程序接受到该信号 , 而且只要该信号一到达, 就要求该程序停止, 并通知你。要完成这一任务 ,可利用如下命令:
(gdb handle SIGPIPE stop print
请注意 , UNIX 的信号名总是采用大写字母! 你可以用信号编号替代信号名
如果你的程序要执行任何信号处理操作, 就需要能够测试其信号处理程序,为此 , 就需要一种能将信号发送给程序的简便方法 , 这就是 signal 命令的任务。该命令的参数是一个数字或者一个名字 , 如 SIGINT 。假定你的程序已将一个专用的 SIGINT (键盘输入 ,或 CTRL-C ;信号 2信号处理程序设置成采取某个清理动作,要想测试该信号处理程序, 你可以设置一个断点并使用如下命令:
(gdb signal 2
continuing with signal SIGINT(2
该程序继续执行, 但是立即传输该信号 , 而且处理程序开始运行 .
十一 . 原文件的搜索
Search text: 该命令可显示在当前文件中包含 text 串的下一行。
Reverse-search text: 该命令可以显示包含 text 的前一行。
十二 . UNIX接口
shell 命令可启动 UNIX 外壳 , CTRL-D 退出外壳 , 返回到 gdb.
十三 . 命令的历史
为了允许使用历史命令,可使用 set history expansion on命令
(gdb set history expansion on
十四 . GDB 帮助
在 gdb 提示符处键入 help ,将列出命令的分类 , 主要的分类有:
* aliases :命令别名
* breakpoints :断点定义;
* data :数据查看 ;
* files :指定并查看文件 ;
* internals :维护命令;
* running :程序执行;
* stack :调用栈查看 ;
* statu :状态查看 ;
* tracepoints :跟踪程序执行。
键入 help 后跟命令的分类名 ,可获得该类命令的详细清单。
GDB 调试命令十五. GDB 多线程先介绍一下 GDB 多线程调试的基本命令。l info threads 显示当前可调试的所有线程,每个线程会有一个 GDB 为其分配的
ID,后面操作线程的时候会用到这个 ID。前面有*的是当前调试的线程。 l l l l l thread ID 切换当前调试的线程为指定 ID 的线程。 break thread_test.c:123 thread all 在所有线程中相应的行上设置断点 thread apply ID1 ID2 command thread apply all command 让一个或者多个线程执行 GDB 命令 command。让所有被调试线程执行GDB 命令 command。 set scheduler-locking off|on|step 估计是实际使用过多线程调试的人都可以发现,在使用 step 或者 continue 命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。 off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行。 step 在单步的时候,除了 next 过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后 continue 的行为以外,只有当前线程会执行。在介绍完基本的多线程调试命令后,大概介绍一下 GDB 多线程调试的实现思路。比较主要的代码是 thread.c,前面介绍的几个命令等都是在其中实现。thread_list 这个表存储了当前可调试的所有线程的信息。函数 add_thread_silent 或者 add_thread(不同版本 GDB 不同用来向 thread_list 列表增加一个线程的信息。函数 delete_thread 用来向 thread_list 列表删除一个线程的信息。上面提到的这 2 个函数会被有线程支持的 target 调用,用来增加和删除线程,不同的 OS 对线程的实现差异很大,这么实现比较好的保证了 GDB 多线程调试支持的扩展性。函数
info_threads_command 是被命令 info threads 调用的,就是显示 thread_list 列表的信息。函数 thread_command 是被命令 thread 调用,切换当前线程最终调用的函数是switch_to_thread,这个函数会先将当前调试线程变量 inferior_ptid,然后对寄存器和 frame 缓冲进行刷新。函数 thread_apply_command 被命令 thread apply 调用,这个函数的实际实现其实很简单,就是先切换当前线为指定线程,然后调用函数execute_command 调用指定函数。比较特别的是 set scheduler-locking 没有实现在thread.c 中,而是实现在控制被调试程序执行的文件 infrun.c 中。对其的设置会保存到变量 scheduler_mode 中,而实际使用这个变量的函数只有用来令被调试程序执行的函数 resume。在默认情况下,传递给 target_resume 的变量是 resume_ptid,默认情况下其的值为 RESUME_ALL,也就是告诉 target 程序执行的时候所有被调试线程都要被执行。而当 scheduler_mode 设置为只让当前线程执行的时候,
resume_ptid 将被设置为 inferior_ptid,这就告诉 target 只有 inferior_ptid 的线程会被执行。最后特别介绍一下 Linux 下多线程的支持,基本的调试功能在 linux-nat.c 中,这里有对 Linux 轻量级别进程本地调试的支持。但是其在调试多线程程序的时候,还需要对 pthread 调试的支持,这个功能实现在 linux-thread-db.c 中。对pthread 的调试要通过调用 libthread_db 库来支持。这里有一个单独的 target"multi-thread",这个 target 有 2 点很特别: 6
GDB 调试命令第一,一般 target 的装载是在调用相关 to_open 函数的时候调用 push_target 进行装载。而这个 target 则不同,在其初始化的时候,就注册了函数 thread_db_new_objfile 到库文件 attach 事件中。这样当 GDB 为调试程序的动态加载库时候 attach 库文件的时候,就会调用这个函数 thread_db_new_objfile。这样当 GDB 装载 libpthread 库的时候,最终会装载 target"multi-thread"。第二,这个target 并没有像大部分 target 那样自己实现了全部调试功能,其配合 linux-nat.c 的代码的功能,这里有一个 target 多层结构的设计,要介绍的比较多,就不详细介绍了。最后介绍一下我最近遇见的一个多线程调试和解决。基本问题是在一个Linux 环境中,调试多线程程序不正常,info threads 看不到多线程的信息。我先用命令 maintenance print target-stack 看了一下 target 的装载情况,发现 target"multi-thread"没有被装载,用 GDB 对 GDB 进行调试,发现在函数 check_for_thread_db 在调用 libthread_db 中的函数 td_ta_new 的时候,返回了 TD_NOLIBTHREAD,所以没有装载 target"multi-thread"。在时候我就怀疑是不是 libpthread 有问题,于是
检查了一下发现了问题,这个环境中的 libpthread 是被 strip 过的,我想可能就是
以为这个影响了 td_ta_new 对 libpthread 符号信息的获取。当我换了一个没有 strip 过的 libpthread 的时候,问题果然解决了。最终我的解决办法是拷贝了一个.debug 版本的 libpthread 到 lib 目录中,问题解决了。多线程如果 dump,多为段错误,一般都涉及内存非法读写。可以这样处理,使用下面的命令打开系统开关,让其可以在死掉的时候生成 core 文件。 ulimit -c unlimited 这样的话死掉的时候就可以在当前目录看到 core.pid(pid 为进程号的文件。接着使用 gdb: gdb ./bin ./core.pid 进去后,使用 bt 查看死掉时栈的情况,在使用 frame 命令。还有就是里面某个线程停住,也没死,这种情况一般就是死锁或者涉及消息接受的超时问题(听人说的,没
有遇到过。遇到这种情况,可以使用: gcore pid (调试进程的 pid 号)手动生成core 文件,在使用 pstack(linux 下好像不好使查看堆栈的情况。如果都看不出来,就仔细查看代码,看看是不是在 if,return,break,continue 这种语句操作是忘记解锁,还有嵌套锁的问题,都需要分析清楚了。十六. GDB 使用范例清单代码: ----------------1 #include 2 3 static 4 static 5 int 6 { 7 8 9 10 } 7 printf gets printf ("Please (string; ("\nYour string is: %s\n", string; input a string: "; char char* main ( buff [256]; 一个有错误的 C 源程序 bugging.c string;
GDB 调试命令 ----------------上面这个程序非常简单,其目的是接受用户的输入,然后将用户的输入打印出来。该程序使用了一个未经过初始化的字符串地址$ $ gcc -o bugging -g string,因此,编译并运行之后,将出现 bugging.c Segment Fault 错误: ./bugging input a fault string: (core asfd dumped gdb,并按如下的步骤进行: bugging 可执行文件;命令,装入命令 run;函数附近的代码; string。用print 命令查看 string string 的值;取一个合法的指针值就可以了,为此,命令修改的取值; Please Segmentation 为了查找该程序中出现的问题,我们利用 1.运行gdb bugging bugging 2.执行装入的 3.使用 4.利用 6.在 where list 命令查看程序出错的地方;命令查看调用 gets gets 函数出错的因素就是变量 5.唯一能够导致gdb 中,我们可以直接修改变量的值,只要将 break 8; 8 行处停止,这时,我们可以用我们在第 8 行处设置断点 7.程序重新运行到第 set variable string 8.然后继续运行,将看到正确的程序运行结果 8
在gdb中,断点通常有三种形式 断点(BreakPoint): 在代码的指定位置中断,这个是我们用得最多的一种。设置断点的命令是break,它通常有如下方式: 可以通过info breakpoints [n]命令查看当前断点信息。此外,还有如下几个配套的常用命令: 观察点(WatchPoint): 在变量读、写或变化时中断,这类方式常用来定位bug。
捕捉点(CatchPoint): 捕捉点用来补捉程序运行时的一些事件。如:载入共享库(动态链接库)、C++的异常等。通常也是用来定位bug。 捕捉点的命令格式是:catch
break
2.4 实例—使用gdb调试器 1.编写实例程序gcctest.c,见2.2小节的开头部分 2.编译 3.启动GDB,执行程序 启动gdb,进入gdb调试环境,可以使用gdb的命令对程序进行调试。 [root@localhost gdbtest txt]# gdb //启动gdb GNU gdb Fedora (6.8-27.el5) Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later
GDB命令大全 GDB的使用 当程序出错并产生core 时 快速定位出错函数的办法 gdb 程序名 core文件名(一般是core,也可能是core.xxxx) 调试程序使用的键 r run 运行.程序还没有运行前使用 c cuntinue 继续运行。运行中断后继续运行 q 退出 kill 终止调试的程序 h help 帮助
b breakpoint 设置断点。 用法: b 函数名对此函数进行中断 b 文件名:行号对此文件中指定行中断.如果是当前文件,那么文件名与:号可以省略 看当前断点数使用info break.禁止断点disable 断点号.删除delete 断点号. l list 列出代码行。一次列10 行。连接使用list将会滚动显示. 也可以在list 后面跟上文件名:行号 watch 观察一个变量的值。每次中断时都会显示这个变量的值 p print 打印一个变量的值。与watch不同的是print只显示一次 这里在顺便说说如何改变一个 value. 当你下指令 p 的时候,例如你用 p b, 这时候你会看到 b 的 value, 也就是上面的 $1 = 15. 你也同样可以用 p 来改变一个 value, 例如下指令 p b = 100 试试看,
这时候你会发现, b 的 value 就变成 100 了:$1 = 100. 网上抄录 基本的使用方法简介 前言 程序代码中的错误可分为数类,除了最容易除错的语法错误,编译程序会告诉你错误所在外,大部分的错误都可以归类为执行时错误。GDB 的功能便是寻找执行时错误。如果没有除错程序,我们只能在程序中加入输出变量值的指令来了解程序执行的状态。有了 GDB 除错程序,我们可以设定在任何地方停止程序的执行,然后可以随意检视变量值及更动变量,并逐行执行程序。 一个除错程序执行的流程通常是这样的: 1. 进入除错程序并指定可执行文件。 2. 指定程序代码所在目录。 3. 设定断点后执行程序。 4. 程序于断点中断后,可以 (1)检视程序执行状态;检视变量值或变更变量值 (2) 逐步执行程序,或是全速执行程序到下一个断点或是到程序结束为止。 5. 离开除错程序。 以下将分为下列数项分别介绍:
嵌入式Linux视频教程 相关搜索:简体中文, 学习方法, 视频教程, 普通话, 嵌入式 中文名: 嵌入式Linux视频教程 资源格式: 光盘镜像 学校: 成都国嵌嵌入式培训中心版本: 成都国嵌嵌入式培训中心的基于广州友善之发行日期: 2010年 地区: 大陆 对白语言: 普通话 文字语言: 简体中文 视频光盘目录结构 国嵌视频1.iso -学习方法与课程体系介绍(学前必看) -学习方法介绍.avi -国嵌嵌入式课程体系.pdf -嵌入式Linux学习方法.pdf -国嵌课程1-嵌入式入门体验班(上) -第1天(嵌入式系统概述) -国嵌体验入门班-1-1(嵌入式系统概述).avi -国嵌体验入门班-1-2(ARM概述).avi -国嵌体验入门班-1-3(嵌入式Linux概述).avi -国嵌体验入门班-1-4(2440开发板介绍).avi -国嵌体验入门班-1-5(软硬件环境搭建).avi -第2天(开发板快乐体验) -国嵌体验入门班-2-1(开发板系统安装).avi -国嵌体验入门班-2-1(开发板系统安装-Jlink方式).avi -国嵌体验入门班-2-1(开发板系统安装-并口方式).avi -国嵌体验入门班-2-2(裸机程序体验).avi -国嵌体验入门班-2-3(QT系统体验).avi -国嵌体验入门班-2-4(Android系统体验).avi 国嵌视频2.iso
-国嵌课程1-嵌入式入门体验班(下) -第3天(Linux系统体验) -国嵌体验入门班-3-1(Linux定制安装).avi -国嵌体验入门班-3-2(Linux命令).avi -国嵌体验入门班-3-3(VI使用).avi -国嵌体验入门班-3-4(Linux系统管理).avi -国嵌体验入门班-3-5(Shell编程).avi -国嵌体验入门班-3-6(Qcd功能演示).avi -国嵌体验入门班-3-7(必修实验).avi -国嵌课程2-嵌入式Linux应用开发班 -第1天(编程基础) -国嵌应用班-1-1(GCC程序编译).avi -国嵌应用班-1-2(GDB程序调试).avi -国嵌应用班-1-3(makefile工程管理).avi -国嵌应用班-1-4(必修实验).avi -第2天(文件时间编程) -国嵌应用班-2-1(系统调用方式访问文件).avi -国嵌应用班-2-2(库函数访问文件).avi -国嵌应用班-2-3(时间编程).avi -国嵌应用班-2-4(必修实验).avi -第3天(多进程程序设计) -国嵌应用班-3-1(进程控制原理).avi -国嵌应用班-3-2(进程控制程序设计).avi -国嵌应用班-3-3(必修实验).avi -第4天(进程间通讯) -国嵌应用班-4-1(进程间通讯概述).avi -国嵌应用班-4-2(管道通讯).avi -国嵌应用班-4-3(信号通讯).avi -国嵌应用班-4-4(共享内存通讯).avi -国嵌应用班-4-5(必修实验).avi -第5天(进程间通讯) -国嵌应用班-5-1(消息队列).avi
淮海工学院计算机工程学 实验报告书 评语: 成绩:指导教师: 批阅时间:年月
实验目的与要求 1. 掌握Linux C 开发过程中的基本概念; 2. 掌握如GCC GDB等开发工具的使用。 二、实验内容 1. 将参考代码录入到文件中,编译执行后发现结果与预期不一致,请使用GDE调试, 完成字符串反序输出功能。 三、参考源代码 #include <> #include <> #include <> int reverse_str(char *string); int main (void) { char string[] = "Linux C Tools : GCC and GDB"; printf ("The original string is %s \n", string); reverse_str (string); } int reverse_str (char *str) { char *new_str; int i, size; size = strlen (str); if((new_str = (char *) malloc (size + 1)) == NULL) { return -1; } for (i = 0; i < size; i++) new_str[size - i] = str[i]; new_str[size+1] = ' '; printf("The reversed string is %s\n",new_str); free(new_str); return 0 ; } 四、实验步骤 步骤1. 编辑源代码 mkdir test1 cd test1 gedit (1) 使用gedit 编辑器,建议课外学习vim; (2) 分析代码中语句功能。 步骤 2. 编译源代码
一、设置断点(BreakPoint ) 我们用break 命令来设置断点。正面有几点设置断点的方法: break
附录A:GDB使用 1.基本命令 1)进入GDB #gdb test test是要调试的程序,由gcctest.c -g -o test生成。进入后提示符变为(gdb) 。 2)查看源码(gdb) l 源码会进行行号提示。 如果需要查看在其他文件中定义的函数,在l后加上函数名即可定位到这个函数的定义及查看附近的其他源码。或者:使用断点或单步运行,到某个函数处使用s进入这个函数。 3)设置断点(gdb) b 6 这样会在运行到源码第6行时停止,可以查看变量的值、堆栈情况等;这个行号是gdb的行号。 4)查看断点处情况(gdb) info b 可以键入"info b"来查看断点处情况,可以设置多个断点; 5)运行代码(gdb) r 6)显示变量值(gdb) p n 在程序暂停时,键入"p 变量名"(print)即可; GDB在显示变量值时都会在对应值之前加上"$N"标记,它是当前变量值的引用标记,以后若想再次引用此变量,就可以直接写作"$N",而无需写冗长的变量名; 7)观察变量(gdb) watch n 在某一循环处,往往希望能够观察一个变量的变化情况,这时就可以键入命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点; 8)单步运行(gdb) n 9)程序继续运行(gdb) c 使程序继续往下运行,直到再次遇到断点或程序结束; 10)退出GDB (gdb) q 2.断点调试 break+设置断点的行号,break n,在n行处设置断点; tbreak+行号或函数名,tbreak n/func,设置临时断点,到达后被自动删除; break+filename+行号, break main.c:10,用于在指定文件对应行设置断
Ubuntu下Vim+GCC+GDB安装及使用 一)安装 vim)打开命令行运行sudo apt-get install vim,并按提示输入管理员密码。 gcc+gdb)输入命令行运行 sudo apt-get install build-essential build-essential包含gcc和gdb等工具,是C语言的开发包。 安装完了可以执行 gcc --version 的命令来查看版本,输出如下: gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 则表明安装好了。 二)常用编译命令选项 假设源程序文件名为test.c。 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。 2. 选项 -o 用法:#gcc test.c -o test 作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。 3. 选项 -E 用法:#gcc -E test.c -o test.i 作用:将test.c预处理输出test.i文件。 4. 选项 -S 用法:#gcc -S test.i 作用:将预处理输出文件test.i汇编成test.s文件。 5. 选项 -c 用法:#gcc -c test.s 作用:将汇编输出文件test.s编译输出test.o文件。 6. 无选项链接 用法:#gcc test.o -o test
用GDB调试程序 GDB概述 ———— GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UN IX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 一般来说,GDB主要帮忙你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、动态的改变你程序的执行环境。 从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。 一个调试示例 —————— 源程序:tst.c
1 #include
GDB调试精粹及使用实例 一:列文件清单 1. List (gdb) list line1,line2 二:执行程序 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、?、[、])在内。 如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。 利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。 (gdb)set args –b –x (gdb) show args backtrace命令为堆栈提供向后跟踪功能。 Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。 三:显示数据 利用print 命令可以检查各个变量的值。 (gdb) print p (p为变量名) whatis 命令可以显示某个变量的类型 (gdb) whatis p type = int * print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容: l 对程序中函数的调用 (gdb) print find_entry(1,0) l 数据结构和其他复杂对象 (gdb) print *table_start $8={e=reference=’\000’,location=0x0,next=0x0} l 值的历史成分 (gdb)print $1 ($1为历史记录变量,在以后可以直接引用 $1 的值) l 人为数组 人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示: base@length 因此,要想显示在h后面的10个元素,可以使用h@10: (gdb)print h@10 $13=(-1,345,23,-234,0,0,0,98,345,10)
GDB调试及实例 一:列文件清单 1.List (gdb) list line1,line2 二:执行程序 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、?、[、])在内。 如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。 利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。 (gdb)set args –b –x (gdb) show args backtrace命令为堆栈提供向后跟踪功能。 Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。 三:显示数据 利用print 命令可以检查各个变量的值。 (gdb) print p (p为变量名) whatis 命令可以显示某个变量的类型 (gdb) whatis p type = int * print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容: l 对程序中函数的调用 (gdb) print find_entry(1,0) l 数据结构和其他复杂对象 (gdb) print *table_start $8={e=reference=’\000’,location=0x0,next=0x0} l 值的历史成分 (gdb)print $1 ($1为历史记录变量,在以后可以直接引用$1 的值) l 人为数组 人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内存中在变量h后面的10个整数,一个动态数组的语法如下所示: base@length 因此,要想显示在h后面的10个元素,可以使用h@10: (gdb)print h@10 $13=(-1,345,23,-234,0,0,0,98,345,10)
ARM汇编指令调试方法 学习ARM 汇编时,少不了对ARM 汇编指令的调试。作为支持多语言的 调试器,gdb 自然是较好的选择。调试器工作时,一般通过修改代码段的内容 构造trap 软中断指令,实现程序的暂停和程序执行状态的监控。为了在x86 平 台上执行ARM 指令,可以使用qemu 模拟器执行ARM 汇编指令。一、准备ARM 汇编程序首先,我们构造一段简单的ARM 汇编程序作为测试代码 main.s。 .globl _start_start:mov R0,#0swi0x00901 以上汇编指令完成了0 号系统调用exit 的调用。mov 指令将系统调用号传入寄存器R0,然后使用0x00901 软中断 陷入系统调用。 为了运行ARM 汇编代码,需要使用交叉编译器arm-linux-gcc 对ARM 汇编 代码进行编译。下载交叉编译器安装完毕后,对ARM 汇编代码进行编译。 arm-linux-gcc main.s -o main -nostdlib 编译选项-nostdlib 表示不使用任何运行时库文件,编译生成的可执行文件main 只能在ARM 体系结构的系统上运行。二、编译安装qemu 模拟器为了x86 的Linux 系统内运行ARM 体系结构的可 执行程序,需要安装qemu 模拟器。 首先下载qemu 源码,然后保证系统已经安装了flex 和bison。 编译安装qemu。 ./configure --prefix=/usrsudo make && make install 然后使用qemu 的ARM 模拟器执行ARM 程序。 qemu ./main 三、编译安装arm-gdb 为了调试ARM 程序,需要使用gdb 的源码编译生成arm-gdb。 首先下载gdb 源代码,编译安装。
如何在Linux中使用gdb调试C程序 无论多么有经验的程序员,开发的任何软件都不可能完全没有bug。因此,排查及修复bug 成为软件开发周期中最重要的任务之一。有许多办法可以排查bug(测试、代码自审等等),但是还有一些专用软件(称为调试器)可以帮助准确定位问题的所在,以便进行修复。 如果你是C/C++ 程序员,或者使用Fortran 和Modula-2 编程语言开发软件,那么你将会很乐意知道有这么一款优秀的调试器- GDB - 可以帮你更轻松地调试代码bug 以及其它问题。在这篇文章中,我们将讨论一下GDB 调试器的基础知识,包括它提供的一些有用的功能/选项。 在我们开始之前,值得一提的是,文章中的所有说明和示例都已经在Ubuntu 14.04 LTS 中测试过。教程中的示例代码都是 C 语言写的;使用的shell 为bash(4.3.11);GDB 版本为7.7.1。 GDB 调试器基础 通俗的讲,GDB 可以让你看到程序在执行过程时的内部流程,并帮你明确问题的所在。我们将在下一节通过一个有效的示例来讨论GDB 调试器的用法,但在此之前,我们先来探讨一些之后对你有帮助的基本要点。 首先,为了能够顺利使用类似GDB 这样的调试器,你必须以指定的方式编译程序,让编译器产生调试器所需的调试信息。例如,在使用gcc 编译器(我们将在本教程之后的章节用它来编译C 程序示例)编译代码的时候,你需要使用 -g 命令行选项。 IT网,http://it 想要了解gcc 编译器手册页中关于 -g 命令行选项相关的内容,请看这里。 下一步,确保在你的系统中已经安装GDB 调试器。如果没有安装,而且你使用的是基于Debian 的系统(如Ubuntu),那么你就可以使用以下命令轻松安装该工具: sudo apt-get install gdb 在其他发行版上的安装方法,请看这里。 现在,当你按照上述的方式编译完程序(gcc -g 命令行选项),同时也已经安装好GDB 调
Linux下GDB调试命令_1 2008-11-21 18:39 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,不过现在在Linux下也可以用了。它使你能在程序运行时观察程和内存的使用情况。Linux不比Windows,没有那么多方便的图形界面方式的,像.Net、Eclipse等IDE的调试器。但上天逼着我在Li 软件,用了一段时间,你会发现GDB这个调试工具一点不比其它的差,所谓“寸有所长,尺有所短”就是这个道理。 一般来说,我可以用GDB来: ?加载程序 ?设置监视点、断点、入口条件等 ?动态的改变你程序的执行环境 ?单步调试、追踪 一、加载文件 启动GDB的方法有以下几种: 1、>gdb [exe] 2、>gdb pid [pid] GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数: -symbols -s 从指定文件中读取符号表。 -se file 从指定文件中读取符号表信息,并把他用在可执行文件中。 -core -c 调试时core dump的core文件。 -directory -d 加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。 二、运行命令 当以gdb 方式启动gdb后,gdb会在PATH路径和当前目录中搜索的源文件。 在gdb中,运行程序使用r或是run命令。程序的运行,你有可能需要设置下面四方面的事。 1、程序运行参数。 set args 可指定运行时参数。(如:set args 10 20 30 40 50) show args 命令可以查看设置好的运行参数。 2、运行环境。 path 可设定程序的运行路径。 show paths 查看程序的运行路径。 set environment varname [=value] 设置环境变量。如:set env USER=hchen show environment [varname] 查看环境变量。 3、工作目录。 cd 相当于shell的cd命令。 pwd 显示当前的所在目录。 4、程序的输入输出。
一,GDB调试器简介 GDB是Linux下的常用调试器,主要用于调试源代码、调试运行中的进程和查看core dump文件。Linux下的调试器主要有gdb、cgdb、ddd、eclipse。GDB调试器的运行速度快、能够进行源代码同步显示。 使用-tui 选项开启gdb命令输入和源代码的分屏显示,tui即Terminal User Interface。 二,GDB常用调试命令 a)调试可执行文件 以源代码为/home/zebra/目录下的test.c文件产生的可执行文件test为例(可执行文件使用gcc进行编译,并使用-g选项以产生调试信息),进行命令的说明(详细源代码参见第三部分:三,调试实例分析 )。 gdb调试源代码流程: 1,开启gdb程序,即运行如下命令:gdb -q (-q用以使得gdb不输出gdb程序的版本等信息)2,指定调试的二进制文件:file test 3,list查看源代码 4,设定断点breakpoint main breakpoint sub 上述分别在main函数和sub函数处设定了断点。 断点可以设置在任意已知源代码文件的某一行,某一个函数,同时可以指定是设置在哪个/哪些线程上(见下边描述)。 5,运行可执行文件: run 6,这样程序会运行到断点处停止下来,gdb会打印当前断点的信息。 7,使用s 或者n进行单步调试。 s即step,n即next都是执行一条语句,然后停下来。 如果想执行一条汇编语句,则可以使用si ,ni,即step instruction,next instruction。 8,bt命令查看当前的调用栈,bt即backtrace。 9,info frame查看函数帧信息。 10,frame n 进入某个函数帧(编号为n) 11,info 命令可以对当前的函数帧的寄存器、局部变量、函数的参数进行查看。 info register;info local;info args。 12,disassemble对当前函数对应的二进制进行反汇编。 13,x/nfu address 查看内存其中address是内存开始的地址,从该地址向高地址增加, x是examinate的缩写,n表示重复次数,f表示输出格式,u表示内存大小的单位(默认是字,即4个字节)。 一般我都用x/nx address,即打印n个从address开始的内存,每个是4字节,以十六进制打印。14,continue,执行至该函数退出 15,info threads,显示当前可调试的所有线程 16,thread
linux下的静态库与动态库的区别 1.什么是库 在windows平台和linux平台下都大量存在着库。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。 由于windows和linux的本质不同,因此二者库的二进制是不兼容的。 2.库的种类 linux下的库有两种:静态库和共享库(动态库)。 二者的不同点在于代码被载入的时刻不同。 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。 共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。 3.库存在的意义 库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。 共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。 4.库文件是如何产生的在linux下 静态库的后缀是.a,它的产生分两步 Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表 Step 2.ar命令将很多.o转换成.a,成文静态库 动态库的后缀是.so,它由gcc加特定参数编译产生。 例如: $ gcc -fPIC -c *.c $ gcc -shared -Wl,-soname, libfoo.so.1 -o libfoo.so.1.0 *. 5.库文件是如何命名的,有没有什么规范 在linux下,库文件一般放在/usr/lib /lib下, 静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称 动态库的名字一般为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号,minor是副版本号 6.如何知道一个可执行程序依赖哪些库 ldd命令可以查看一个可执行程序依赖的共享库, 例如# ldd /bin/lnlibc.so.6 => /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2 => /lib/ld- linux.so.2 (0×40000000) 可以看到ln命令依赖于libc库和ld-linux库 Gdb调试段错误 1.段错误是什么
1. 本文介绍使用gdb调试程序的常用命令。 主要内容: [简介] [举例] [其他] [简介] ============= GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。同时GDB也具有例如ddd这样的图形化的调试端。 一般来说,GDB主要完成下面四个方面的功能: (1)启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 (2)可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) (3)当程序被停住时,可以检查此时你的程序中所发生的事。 (4)动态的改变你程序的执行环境。 [举例] ============= *启动gdb $gdb 这样可以和gdb进行交互了。 *启动gdb,并且分屏显示源代码: $gdb -tui 这样,使用了'-tui'选项,启动可以直接将屏幕分成两个部分,上面显示源代码,比用list方便多了。这时候使用上下方向键可以查看源代码,想要命令行使用上下键就用[Ctrl]n和[Ctrl]p. *启动gdb调试指定程序app: $gdb app 这样就在启动gdb之后直接载入了app可执行程序,需要注意的是,载入的app程序必须在编译的
时候有gdb调试选项,例如'gcc -g app app.c',注意,如果修改了程序的源代码,但是没有编译,那么在gdb中显示的会是改动后的源代码,但是运行的是改动前的程序,这样会导致跟踪错乱的。 *启动程序之后,再用gdb调试: $gdb
常用的gdb命令 backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)breakpoint 在程序中设置一个断点 cd 改变当前工作目录 clear 删除刚才停止处的断点 commands 命中断点时,列出将要执行的命令 continue 从断点开始继续执行 delete 删除一个断点或监测点;也可与其他命令一起使用 display 程序停止时显示变量和表达时 down 下移栈帧,使得另一个函数成为当前函数 frame 选择下一条continue命令的帧 info 显示与该程序有关的各种信息 jump 在源程序中的另一点开始运行 kill 异常终止在gdb 控制下运行的程序 list 列出相应于正在执行的程序的原文件内容 next 执行下一个源程序行,从而执行其整体中的一个函数 print 显示变量或表达式的值 pwd 显示当前工作目录 pype 显示一个数据结构(如一个结构或C++类)的内容 quit 退出gdb reverse-search 在源文件中反向搜索正规表达式 run 执行该程序 search 在源文件中搜索正规表达式 set variable 给变量赋值 signal 将一个信号发送到正在运行的进程 step 执行下一个源程序行,必要时进入下一个函数 undisplay display命令的反命令,不要显示表达式 until 结束当前循环 up 上移栈帧,使另一函数成为当前函数 watch 在程序中设置一个监测点(即数据断点) whatis 显示变量或函数类型
GDB命令分类详解 一:列文件清单 (2) 二:执行程序 (2) 三:显示数据 (2) 四:断点(breakpoint) (3) 五.断点的管理 (3) 六.变量的检查和赋值 (4) 七.单步执行 (4) 八.函数的调用 (4) 九.机器语言工具 (4) 十.信号 (4) 十一.原文件的搜索 (5) 十二. UNIX接口 (5) 十三. 命令的历史 (5) 十四. GDB帮助 (5) 十五. GDB多线程 (6) 十六. GDB使用范例 (7) 一:列文件清单 1.List (gdb) list line1,line2 二:执行程序 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、?、[、])在内。 如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。 利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。 (gdb)set args –b –x (gdb) show args backtrace命令为堆栈提供向后跟踪功能。 Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。 三:显示数据 利用print 命令可以检查各个变量的值。 (gdb) print p (p为变量名) whatis命令可以显示某个变量的类型 (gdb) whatis p type = int * print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容:
用 GDB 调试程序 用 gdb 调试 GCC 程序 Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能: ?它使你能监视你程序中变量的值. ?它使你能设置断点以使程序在指定的代码行上停止执行. ?它使你能一行行的执行你的代码. 在命令行上键入 gdb 并按回车键就可以运行 gdb 了, 如果一切正常的话, gdb 将被启动并且你将在屏幕上看到类似的内容: GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.14 (i486-slakware-linux), Copyright 1995 Free Software Foundation, Inc. (gdb) 当你启动 gdb 后, 你能在命令行上指定很多的选项. 你也可以以下面的方式来运行 gdb : gdb