当前位置:文档之家› gdb笔记(二):条件断点命令列表监视点lesca技术宅

gdb笔记(二):条件断点命令列表监视点lesca技术宅

gdb笔记(二):条件断点命令列表监视点lesca技术宅
gdb笔记(二):条件断点命令列表监视点lesca技术宅

GDB笔记(二):条件断点、命令列表、监视点Lesca技术

GDB笔记(二):条件断点、命令列表、监视点

Posted by lesca on 2011/05/21

Leave a comment (0)

Go to comments

条件断点

break if

用法:

break [break-args] if (condition)

例如:

break main if argc > 1

break 180 if (string == NULL && i < 0)

break test.c:34 if (x & y) == 1

break myfunc if i % (j + 3) != 0

break 44 if strlen(mystring) == 0condition

与break if类似,只是condition只能用在已存在的断点上。

用法:

condition <break_list> (condition)

例如:

cond 3 i == 3

将会在断点3上附加条件(i == 3)

条件表达式的返回值

上面的条件表达式计算后结果的类型是什么?答案是int型。

这是因为唯一能在断点条件表达式中使用的返回值类型为int。

这意味着,如果调用了像cos()这样的数学函数,会导致预料之外的值。

如(在已经连接到libm库的前提下):

(gdb) print cos(0.0)

$1 = -1073776640

解决这个问题的方法是类型转换,我们来看这个例子(gdb) set $p = (double (*) (double)) cos

(gdb) print cos(0.0)

$2 = -1073776640

(gdb) print $p(0.0)

$3 = 1

在这里,通过设置变量$p为“一个参数为double,返回类型为double的指向cos函数入口地址的函数指针”,来对参数进行强制类型转换。

为断点设置命令列表

我们知道,设置一个断点并且在上面中断后,我们必然会查询一些变量或者做一些其他动作。

如果这些动作可以一气呵成,岂不妙哉!使用命令列表(commands)就能实现这个功能。

步骤如下:

建立断点使用commands命令用法:

commands break_list

例如:(gdb) commands 1

Type commands for when breakpoint 1 is hit, one per line.

End with a line saying just "end".

>silent

>printf "n = %d \n", n

>continue

>end

定义宏(define)

宏可以在调试期间录制,也可以事先录制在.gdbinit文件中。

GDB的宏就像shell脚本一样,可以传入参数,依次是$arg0, $arg1, …

定义好宏之后,可以用在命令列表中。

注意,宏并不支持所有的GDB命令,如silent就不能用在宏中。

以上节为例,我们录制一个宏:

define print_and_go

print $arg0

continue

然后在断点1处定义如下命令:

commands 1

silent

print_and_go

end

监视点(watch)

用法:

watch var

注意

监视点的设定不依赖于断点的位置,但是与变量的作用域有关,也就是说,要设置监视点必须在程序运行时才可设置。

在不确定发生问题的地方时,通过使用监视点的条件表达式,可以非常方便地找出问题代码:

watch i > 999

一旦i > 999,程序就会被中断,GDB指出改变条件的代

next, continue, step区别:

next表示跳往当前代码栈中的下一条指令,如果下一条指令是函数调用,并且函数中存在断点,则直接跑到该断点中止。

continue 表示跳往下一个断点,next和continue的区别是:

在当前代码堆栈中,step和next都会一条条的执行,而continue直接跑到下一个断点去执行去了。

如果当前代码中调用的是函数栈,则next和continue没有任何区别【直接跑到断点处中止】。

step 和next 在当前代码栈中相似,都是一条条语句执行,不同的是在函数栈调用时,next进入的方式直接跑到断点处中止(所以叫做"下一个"),step是从函数栈的起始位置中止(所以叫做“单步”)。

4. 执行run指令,则遇到断点,就会停止,通过watch + 变量名查看结果, next执行到下一个断点, continue下一个断点,kill结束

5. 为加快调试速度,以上命令都可以简写为第一个字母。在gdb 提示符下按回车健将重复上一个命令。

gdb手册

GDB用户手册 目录 目录 (1) 摘要 (2) 自由软件 (2) 自由软件急需自由文档 (2) GDB的贡献者们 (4) 1.一个简单的GDB会话 (8) 2.征服GDB的进与出 (13) 2.1调用GDB (13) 2.1.1 选择文件 (14) 2.1.2 选择模式 (16) 2.1.3 启动期间,GDB做了什么 (19) 2.2 退出GDB (20) 2.3 Shell命令 (21) 2.4 Loging输出 (21) 3.GDB命令 (22) 3.1命令语法 (22) 3.2命令完成 (23) 3.3获得帮助 (25) 4.在GDB下运行程序 (29) 4.1 适合调试的编译 (29) 4.2 启动程序 (30) 4.3 程序的参数 (32) 4.4 程序的环境 (32) 4.5 程序的工作目录 (34) 4.6 程序的输入输出 (35) 4.7 调试某个已运行的进程 (36) 4.8 杀掉子进程 (37) 4.9 多线程程序的调试 (37) 4.10 多进程程序的调试 (40) 5.0停止与继续 (42)

摘要 象GDB这样的调试程序,目的就是让你可以查看其它程序的内部运行过程,或者是在它崩溃的那一时刻它在做什么。 GDB能做4件事(这些还需附加其他的一些事),帮助你捕获在场的错误: ·启动程序,设定任何可以影响它行为的东西。 ·在特定的条件下使程序停止。 ·当程序停止时,分析发生了什么。 ·改变程序里的一些东西,进行一个由于bug所导致的结果的矫正性试验,同时继续了解另外一个bug。 可以使用GDB调试用C和C++编写的程序,更多信息参见支持的语言,及C与C++。部分支持Modula-2,Modula-2的更多信息参见Modula-2。 在调试使用sets、subranges、file variables或嵌套函数的Pascal程序时,目前不能工作。GDB不支持entering expressions、printing values或者类似特性的Pascal语法。 GDB可以调试Fortran写的程序,尽管那必然会涉及到带有下划线后缀的一些变量。 GDB可以调试Objective-C写的程序,既可以使用Apple/NeXT运行时库,也可以使用GNU Objective-C运行时库。 自由软件 GDB是自由软件,受GNU公共许可证(GPL)保护。GPL给予了你自由复制或改编程序的许可——就是说获得拷贝的人也就获得了自由修改它的权利(这意味着他们必须有权访问源代码),而且可以自由的发布更多的拷贝。大部分软件公司所使用的版权限制了你的自由。自由软件基金会利用GLP保护了这些自由。 基本上来说,公共许可证是一个说明你拥有这些自由的许可证,而且你不能把这些自由从任何人那里占为己有。 自由软件急需自由文档 当今的自由软件社区所存在的最大缺憾不在于软件——而在于没有我们可以随同自由

如何高效使用GDB断点

在gdb中,断点通常有三种形式 断点(BreakPoint): 在代码的指定位置中断,这个是我们用得最多的一种。设置断点的命令是break,它通常有如下方式: 可以通过info breakpoints [n]命令查看当前断点信息。此外,还有如下几个配套的常用命令: 观察点(WatchPoint): 在变量读、写或变化时中断,这类方式常用来定位bug。

捕捉点(CatchPoint): 捕捉点用来补捉程序运行时的一些事件。如:载入共享库(动态链接库)、C++的异常等。通常也是用来定位bug。 捕捉点的命令格式是:catch ,event可以是下面的内容 自动删除。 捕捉点信息的查看方式和代码断点的命令是一样的,这里就不多介绍了。 在特定线程中中断 你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工作。

break thread break thread if ... linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过"info threads"命令来查看正在运行程序中的线程信息。如果你不指定thread 则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如: (gdb) break frik.c:13 thread 28 if bartab > lim 当你的程序被GDB停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。 在特定条件下中断 条件断点的一种特殊场景是在断点命中指定次数后停下来。事实上每个断点都有一个 ignore count, 他是一个正整数。通常情况下它的值为0,所以看不出来它的存在。但是如果它是一个非0值, 那么它将在每次命中后都将 count 减 1,直到它为 0. ignore bnum count 恢复程序运行和单步调试 在gdb中,和调试步进相关的命令主要有如下几条: 参考资料

GDB命令大全

GDB命令大全 GDB的使用 当程序出错并产生core 时 快速定位出错函数的办法 gdb 程序名 core文件名(一般是core,也可能是core.xxxx) 调试程序使用的键 r run 运行.程序还没有运行前使用 c cuntinue 继续运行。运行中断后继续运行 q 退出 kill 终止调试的程序 h help 帮助 命令补全功能 step 跟入函数 next 不跟入函数

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. 离开除错程序。 以下将分为下列数项分别介绍:

实例—使用gdb调试器

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 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 "i386-redhat-linux-gnu". (gdb) run gcctest //在gdb中,运行程序使用r或是run命令,注意,gcctest没有调试信息Starting program: gcctest No executable file specified. Use the "file" or "exec-file" command. //要使用file或exec-file命令指出要运行的程序 (gdb) file gcctest //使用file命令指出要运行的程序gcctest,注意,对gdb命令也可以使用Tab gcctest gcctest.c gcctestg (gdb) file gcctest //使用file命令指出要运行的程序gcctest Reading symbols from /root/Desktop/gdbtest txt/gcctest...(no debugging symbols found)...done. (gdb) r //在gdb中,运行程序使用r或是run命令 Starting program: /root/Desktop/gdbtest txt/gcctest gcctest (no debugging symbols found) (no debugging symbols found) (no debugging symbols found) hello in main hello 1 hello 2 sum=54125560035401396161080590579269632.000000 Program exited with code 057. (gdb) file gcctestg //使用file命令指出要运行的程序gcctestg Reading symbols from /root/Desktop/gdbtest txt/gcctestg...done. (gdb) r //在gdb中,运行程序使用r或是run命令 Starting program: /root/Desktop/gdbtest txt/gcctestg gcctest hello in main hello 1 hello 2 sum=54125560035401396161080590579269632.000000 Program exited with code 057. (gdb) q //使用q或是quit命令退出gdb [root@localhost gdbtest txt]# 4.GDB命令简介

国嵌视频教程下载

嵌入式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

实验一LinuxC编程工具GCC和GDB

淮海工学院计算机工程学 实验报告书 评语: 成绩:指导教师: 批阅时间:年月

实验目的与要求 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. 编译源代码

GDB常用命令

附录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安装及使用

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单步调试(中)

一、设置断点(BreakPoint ) 我们用break 命令来设置断点。正面有几点设置断点的方法: break 在进入指定函数时停住。C++ 中可以使用class::function 或function(type,type) 格式来指定函数名。 break 在指定行号停住。 break +offset break -offset 在当前行号的前面或后面的offset 行停住。offiset 为自然数。 break filename:linenum 在源文件filename 的linenum 行处停住。 break filename:function 在源文件filename 的function 函数的入口处停住。 break *address 在程序运行的内存地址处停住。 break break 命令没有参数时,表示在下一条指令处停住。 break ... if ... 可以是上述的参数,condition 表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100 ,表示当i 为100 时停住程序。 查看断点时,可使用info 命令,如下所示:(注:n 表示断点号) info breakpoints [n] info break [n] 二、设置观察点(WatchPoint ) 观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点: watch 为表达式(变量)expr 设置一个观察点。一量表达式值有变化时,马上停住程序。 rwatch

GDB调试精粹及使用实例

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学习资料

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 用GDB调试程序 GDB概述 ———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 一般来说,GDB主要帮忙你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、动态的改变你程序的执行环境。 从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。 一个调试示例 —————— 源程序:tst.c 1 #include 2 3 int func(int n) 4 { 5 int sum=0,i; 6 for(i=0; i cc -g tst.c -o tst 使用GDB调试: hchen/test> gdb tst <---------- 启动GDB GNU gdb 5.1.1 Copyright 2002 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or 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. This GDB was configured as "i386-suse-linux"... (gdb) l <-------------------- l命令相当于list,从第一行开始例出原码。 1 #include 2 3 int func(int n) 4 { 5 int sum=0,i; 6 for(i=0; i

GDB调试及实例

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 汇编时,少不了对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环境下的调试命令

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基本命令

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 这里,是程序的可执行文件名,是要调试程序的PID.如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。 *启动程序之后,再启动gdb调试: $gdb 这里,程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID,是要调试程序的PID.这样gdb就附加到程序上了,但是现在还没法查看源代码,用file命令指明可执行文件就可以显示源代码了。 **启动gdb之后的交互命令: 交互命令支持[Tab]补全。 *显示帮助信息: (gdb) help *载入指定的程序: (gdb) file app 这样在gdb中载入想要调试的可执行程序app。如果刚开始运行gdb而不是用gdb app启动的话可以这样载入app程序,当然编译app的时候要加入-g调试选项。 *重新运行调试的程序: (gdb) run 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和> )和shell通配符(*、?、[、])在内。

用GDB调试程序--调试器GDB常用功能

一,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 ,切换当前调试的线程为指定ID的线程break File:LineNumber thread if x==y。 17,thread apply command让一个/多个/所有线程执行GDB的命令command。

LINUX 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的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容:

相关主题
文本预览
相关文档 最新文档