GDB使用手册


五、断点的管理
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) delete breakpoint 1
十一、用 GDB 调试程序
从上面看来, GDB 和一般的调试工具没有什么两样,基本上也是完成这些功能,不过 在细节上,你会发现 GDB 这个调试工具的强大,大家可能比较习惯了图形化的调试工具, 但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。 源程序: tst.c 1 #include 2 3 int func(int n) 4{ 5 int sum=0,i; 6 for(i=0; i 7{ 8 sum+=i; 9} 10 return sum;
GDB 使用手册
(转自 /view/639266.htm)
GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。或许,各位比较喜 欢那种图形界面方式的,像 VC、BCB 等 IDE 的调试,但如果你是 在 UNIX 平台下做软 件,你会发现 GDB 这个调试工具有比 VC、BCB 的图形化调试器更强大的功能。所谓 “寸有 所长,尺有所短 ”就是这个道理。 一般来说,GDB 主要帮忙你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、动态的改变你程序的执行环境。
一、列文件清单
List (gdb) list line1,line2
二、执程序
要想运行准备调试的程序,可使用 run 命令,在它后面可以跟随发给该程序的任何参 数,包括标准输入和标准输出说明符 (<和 > )和 shell 通配符(*、?、 [、])在内。如果你使 用不带参数的 run 命令,gdb 就再次使用你给予前一条 run 命令的参数,这是很有用的。利 用 set args 命令就可以修改发送给程序的参数,而使用 show args 命令就可以查看其缺省参 数的列表。 (gdb) set args –b –x (gdb) show args backtrace 命令为堆栈提供向后跟踪功能。 Backtrace 命令产生一张列表,包含着从最近的过程开始的所有有效过程和调用这些过 程的参数。
该命令将会删除编号为 1 的断点,如果不带编号参数,将删除所有的断点 (gdb) delete breakpoint 禁止使用某个断点 (gdb) disable breakpoint 1 该命令将禁止断点 1,同时断点信息的 (Enb)域将变为 n 允许使用某个断点 (gdb) enable breakpoint 1 该命令将允许断点 1,同时断点信息的 (Enb)域将变为 y 清除原文件中某一代码行上的所有断点 (gdb)clean number 注:number 为原文件的某个代码行的行号
11 } 12 13 14 main() 15 { 16 int i; 17 long result = 0; 18 for(i=1; i<=100; i++) 19 { 20 result += i; 21 } 22 23 printf("result[1-100] = %d \n", result ); 24 printf("result[1-250] = %d \n", func(250) ); 25 } 编译生成执行文件:( Linux 下) hchen/test> 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 7{ 8 sum+=i; 9} 10 return sum; (gdb) <-------------------- 直接回车表示,重复上一次命令 11 } 12 13 14 main() 15 {
八、函数的调用
call name 调用和执行一个函数 (gdb) call gen_and_sork( 1234,1,0 ) (gdb) call printf(“abcd”) =4 finish 结束执行当前函数,显示其返回值(如果有的话)
九、机器语言工具
有一组专用的 gdb 变量可以用来检查和修改计算机的通用寄存器,gdb 提供了目前每一 台计算机中实际使用的 4 个寄存器的标准名字: $pc : 程序计数器 $fp : 帧指针(当前堆栈帧) $sp : 栈指针 $ps : 处理器状态
16 int i; 17 long result = 0; 18 for(i=1; i<=100; i++) 19 { 20 result += i; (gdb) break 16 <-------------------- 设置断点,在源程序第 16 行处。 Breakpoint 1 at 0x8048496: file tst.c, line 16. (gdb) break func <-------------------- 设置断点,在函数 func()入口处。 Breakpoint 2 at 0x8048456: file tst.c, line 5. (gdb) info break <-------------------- 查看断点信息。 Num Type Disp Enb Address What 1 breakpoint keep y 0x08048496 in main at tst.c:16 2 breakpoint keep y 0x08048456 in func at tst.c:5 (gdb) r <--------------------- 运行程序, run 命令简写 Starting program: /home/hchen/test/tst Breakpoint 1, main () at tst.c:17 <---------- 在断点处停住。 17 long result = 0; (gdb) n <--------------------- 单条语句执行,next 命令简写。 18 for(i=1; i<=100; i++) (gdb) n 20 result += i; (gdb) n 18 for(i=1; i<=100; i++) (gdb) n 20 result += i; (gdb) c <--------------------- 继续运行程序, continue 命令简写。 Continuing. result[1-100] = 5050 <----------程序输出。 Breakpoint 2, func (n=250) at tst.c:5 5 int sum=0,i; (gdb) n 6 for(i=1; i<=n; i++) (gdb) p i <--------------------- 打印变量 i 的值,print 命令简写。 = 134513808 (gdb) n 8 sum+=i; (gdb) n 6 for(i=1; i<=n; i++) (gdb) p sum =1 (gdb) n 8 sum+=i;
(gdb)print (为历史记录变量,在以后可以直接引用的值 ) 人为数组 人为数组提供了一种去显示存储器块(数组节或动态分配的存储区)内容的方法。早期 的调试程序没有很好的方法将任意的指针换成一个数组。就像对待参数一样,让我们查看内 存中在变量 h 后面的 10 个整数,一个动态数组的语法如下所示: base@length 因此,要想显示在 h 后面的 10 个元素,可以使用 h@10: (gdb)print h@10 =(-1,345,23,-234,0,0,0,98,345,10) whatis 命令可以显示某个变量的类型 (gdb) whatis p type = int *
六、变量的检查和赋值
whatis:识别数组或变量的类型 ptype:比 whatis 的功能更强,他可以提供一个结构的定义 set variable:将值赋予变量 print 除了显示一个变量的值外,还可以用来赋值
七、单步执行
合集下载

gdb查找函数

gdb查找函数

gdb查找函数
GDB是一款非常强大的调试器,通过GDB我们可以对程序进行调试,调试的过程中,我们有时候需要查找某个函数的定义和调用情况,本文将介绍如何在GDB中查找函数的方法。

1.使用“info functions”命令
GDB中提供了一个“info functions”命令,可以列出程序中的所有函数,使用方法如下:
(gdb) info functions
该命令将输出所有函数的名称、返回类型、参数列表等信息,我们可以通过该命令查找到需要调试的函数并获取其名称。

2.使用“break”命令
在GDB中使用“break”命令可以在程序中设置断点,当程序执行到该断点时,程序会暂停执行,我们可以在此处查看函数的执行情况,使用方法如下:
(gdb) break function_name
其中function_name为需要调试的函数名称。

3.使用“backtrace”命令
使用“backtrace”命令可以查看函数的调用栈,即该函数被调用的位置和调用该函数的函数名称等信息,使用方法如下:
(gdb) backtrace
该命令将输出当前函数的调用栈,我们可以通过该命令查看函数的调用情况。

4.使用“search”命令
如果我们不知道函数的名称,只知道函数的一部分内容,可以使用“search”命令在程序中查找包含该内容的函数,使用方法如下: (gdb) search keyword
其中keyword为需要查找的关键字。

总结
通过以上方法,我们可以在GDB中查找函数的定义和调用情况,这对于程序调试和错误排查非常有帮助。

值得注意的是,以上方法只是GDB查找函数的几种基本方法,GDB还提供了许多其他的调试命令,可以根据需要选择使用。

gdb传入参数

gdb传入参数

gdb传入参数GDB是一款用于程序调试的工具,它可以帮助程序员定位和修复代码中的错误。

在使用GDB进行调试的过程中,我们需要传入一些参数来帮助GDB定位问题。

本文将介绍GDB传入参数的相关知识。

一、GDB的基本用法GDB能够对可执行文件进行调试,我们首先需要编译出可执行文件。

在编译时,我们需要加上-g选项以生成调试信息。

编译命令如下:$ gcc -g -o demo demo.c其中,-g选项用于生成调试信息,-o选项用于指定生成的可执行文件的名称,demo.c是源代码文件的名称。

执行可执行文件时,需要加上-gdb选项来告诉GDB需要对该程序进行调试,如下所示:$ gdb ./demo执行以上命令后,GDB就会启动。

此时我们可以使用GDB的各种命令来对程序进行调试。

二、GDB传入参数在使用GDB进行调试时,我们经常需要传入一些参数来辅助调试。

GDB支持多种方式传入参数。

1.在启动GDB时传入参数我们可以在启动GDB时传入参数,例如:$ gdb ./demo arg1 arg2其中,arg1、arg2表示程序执行时需要用到的参数。

2.在GDB中传入参数我们也可以在GDB中传入参数。

在GDB中,使用set命令可以设置参数,例如:$ set args arg1 arg2此时GDB就会设置好参数,等待我们进一步的调试命令。

3.在GDB中重新设置参数在GDB中,我们可以在任何时候使用set命令重新设置参数,例如:$ set args arg1 arg2 arg3此时GDB会将参数重新设置为arg1、arg2、arg3。

4.查看参数在GDB中,使用show命令可以查看当前设置的参数,例如:$ show args此时GDB会显示当前设置的参数。

5.删除参数在GDB中,使用unset命令可以删除参数,例如:$ unset args此时GDB会将参数删除,等待我们重新设置参数。

三、结论GDB是一款十分强大的工具,它可以帮助我们定位和修复程序中的错误。

gdb查找函数

gdb查找函数

gdb查找函数
gdb是一个功能强大的调试工具,它可以帮助程序开发者查找和解决程序中的问题。

其中一个重要的功能就是在程序中查找函数,这对于程序调试和代码优化非常有用。

在使用gdb时,可以通过以下命令来查找函数:
1. info functions:这个命令可以列出当前程序中所有的函数,包括函数名、函数地址和函数大小等信息。

2. info address function_name:这个命令可以查找指定函数的地址,可以用来调试函数中的问题。

3. disassemble function_name:这个命令可以查看指定函数的汇编代码,可以帮助理解函数的运行过程。

4. break function_name:这个命令可以在指定函数的入口处设置断点,方便对函数进行调试。

5. search pattern:这个命令可以在程序的内存中查找指定的字符串或者二进制模式,可以用来查找函数调用的位置。

使用gdb来查找函数需要一定的经验和技巧,但是掌握了这些技能之后,就可以更轻松地进行程序调试和优化。

- 1 -。

gdb 中set用法

gdb 中set用法

gdb 中set用法
在GDB中,set命令用于设置变量的值。它的语法如下:

set variable_name = value
这里的variable_name指的是要设置的变量的名称,value是要
设置的变量的新值。

set命令还可以用于设置GDB命令的选项。例如,可以使用以
下命令将反汇编模式设置为Intel格式:

set disassembly-flavor intel
可以使用以下命令将输出的基数设置为十六进制:
set radix 16
还可以使用set命令设置断点、调试器选项等。具体用法取决
于要设置的内容。

可以使用show命令来查看当前设置的变量值。例如,可以使
用以下命令查看当前的反汇编模式设置:

show disassembly-flavor

gdb 调试函数

gdb 调试函数

gdb 调试函数
要调试一个函数,你需要以下步骤:1. 使用`gdb` 命令行工具启动你的程序:`gdb <executable>`,其中`<executable>` 是你要调试的可执行文件。

2. 设置断点:使用`break` 命令在你要调试的函数的位置设置断点。

例如,如果你要调试的函数是`my_function()`,可以使用`break my_function` 来设置断点。

3. 启动程序:使用`run` 命令启动程序,然后程序将在断点处停止执行。

4. 执行程序:使用`next` 命令按行执行代码,或使用`step` 命令进入函数内部执行。

5. 在调试过程中查看变量的值:使用`print` 命令来查看变量的值。

例如,可以使用`print variable_name` 来查看变量`variable_name` 的值。

6. 继续执行程序:使用`continue` 命令继续执行程序,直到下一个断点或程序结束。

7. 在调试结束后退出`gdb`:使用`quit` 命令退出`gdb`。

这些是基本的
`gdb` 调试函数的使用方法。

你还可以使用其他命令来查看堆栈信息、设置条件断点、跳到指定行等。

可以使用`help` 命令来获取更多有关`gdb` 命令的信息。

Linux应用调试使用gdb和gdbserver命令详解

Linux应用调试使用gdb和gdbserver命令详解

Linux应⽤调试使⽤gdb和gdbserver命令详解1.gdb和gdbserver调试原理通过linux虚拟机⾥的gdb,来向开发板⾥的gdbserver发送命令,⽐如设置断点,运⾏setp等,然后开发板上的gdbserver收到命令后,便会执⾏应⽤程序做相应的动作,来实现调试的功能和之前学的裸板GDB调试⼀样,只不过之前学的是在win下的,本次是在linux⾥的gdb1.1同样,它们都会需要⼀个带调试信息的编译⽂件.通过Makefile⾥的arm-linux-gcc -g 来的, -g:表⽰编译⽂件⾥包含gdb调试信息1.2为什么需要调试信息的编译⽂件?⽐如读开发板的应⽤程序⾥的变量a:⾸先gdb通过应⽤程序的带调试信息的编译⽂件,来找出变量a存的地址位置然后将地址发送给开发板⾥的gdbserver,来读出a地址的值2.安装gdb和gdbserver2.1在虚拟机上安装GDB: # tar xjf gdb-7.4.tar.bz2 //解压# cd gdb-7.4/ //进⼊gdb-7.4⽬录#./configure --target=arm-linux//GDB需要在pc本机⾥运⾏,并调试开发板⾥的应⽤程序,所以--target设为arm-linux#make //编译#mkdir tmp#make install prefix=$PWD/tmp //安装到./tmp⽬录下sudo cp tmp/bin/arm-linux-gdb /bin/ //复制到/bin⽬录下/bin/arm-linux-gdb -v //-v: 确定⼀下gdb的版本VID,是否是7.42.2 在开发板上安装GDBServer:cd gdb/gdbserver/ //在gdb-7.4⽬录下输⼊./configure --target=arm-linux --host=arm-linux //设GDBServer的⼯作环境make //编译出现以下错误:指在linux-arm-low.c⾥,没有找到PTRACE_GETSIGINFO 定义2.3 解决:1)#echo $PATH //来查看PATH环境变量找到编译器gcc位于/work/tools/gcc-3.4.5-glibc-2.3.6/bin2)#cd /work/tools/gcc-3.4.5-glibc-2.3.6/ # grep "PTRACE_GETSIGINFO" * -nR在gcc根⽬录下,搜索到在linux/ptrace.h中定义:3)#vi linux-arm-low.c添加: #define PTRACE_GETSIGINFO 0x42024)最后重新make,⽣成gdbserver命令⽂件然后将gdbserver命令⽂件,放⼊我们开发板的根⽬录/bin中,便能使⽤了cp gdbserver /nfs_root/bin/ //nfs_root:开发板的nfs系统根⽬录3.测试程序如下(test_debug.c)#include <stdio.h>void C(int *p){ *p = 0x12;}void B(int *p){ C(p);}void A(int *p){ B(p);}void A2(int *p){ C(p);}int main(int argc, char **argv){ int a; int *p = NULL; A2(&a); // A2 > C printf("a = 0x%x\n", a); A(p); // A > B > C return 0;}其中A2(&a)会调⽤A2()->C(),然后将a赋值为0x12.A(p)会调⽤A()->B()->C(),由于p是个空指针,这⾥将会出错.接下来,我们便以这个应⽤程序为例.4.编译#arm-linux-gcc -g -o test_debug test_debug.c //-g:附带调试信息5.调试test_debug.c在开发板上:⾸先,需要让gdbserver建⽴本地服务器,以及要测试的哪个⽂件:#gdbserver 192.168.2.107:2345 ./test_debug//192.168.2.107:本地IP地址//2345:端⼝号,⽤来让gdb来连接⽤的//./test_debug:要测试的哪个⽂件在虚拟机上:#/bin/arm-linux-gdb ./test_debug // 启动gdb,指定调试⽂件为test_debug#target remote 192.168.2.107:2345 //与gdbserver建⽴连接5.1连接成功,便使⽤gdb命令来调试列出所有源代码break [file]:[row]打断点,⽐如:break test_debug.c:21 //在test_debug.c⽂件的第21⾏处打断点info br查看断点info file列出当前的⽂件,共享库。

gdb tui用法

gdb tui用法GDB (GNU Debugger) 是一款强大的源代码级别调试工具,它能够帮助开发者找出程序中的错误和异常。

在 GDB 中,TUI 模式是一种简洁的用户界面,它允许你在不依赖图形界面的情况下进行调试。

本篇文章将详细介绍 GDB TUI 的用法。

一、进入 TUI 模式要进入 GDB 的 TUI 模式,可以在命令行中输入 `set tty command` 命令。

该命令将 TUI 模式设置为默认的命令行界面。

二、基本操作1. 启动调试会话:在 GDB 中输入 `run` 命令即可启动调试会话。

2. 单步执行:使用 `step` 命令逐行执行代码,遇到函数调用时会进入函数内部,继续执行直到出栈。

`next` 命令与 `step` 类似,但是会进行表达式求值,这在调试涉及到大量代码的情况下更加方便。

3. 查看变量:使用 `print` 命令可以查看当前变量的值。

三、窗口管理TUI 模式支持窗口管理功能,可以使用窗口来显示不同信息,例如调用栈、变量值等。

可以通过 `window` 命令来管理窗口,例如`window list` 可以列出当前所有的窗口,`window new` 可以新建一个窗口。

四、断点操作在代码中设置断点,可以方便我们在特定位置暂停执行,查看当前变量的值,单步执行等。

可以使用 `break` 命令来设置断点,例如`break main` 会在当前源代码文件的 main 函数处设置一个断点。

五、综合示例下面是一个简单的示例程序,用于演示 GDB TUI 的用法:```c// example.c#include <stdio.h>int main() {int a = 10;int b = 20;printf("a = %d, b = %d\n", a, b);a += b; // 设置断点在这里return 0;}```使用 GDB TUI 进行调试:1. 编译程序:`gcc -g example.c -o example`。

gdb break用法

gdb break用法
GDB(GNU Debugger)是一款功能强大的调试工具,它支持在程序运行时设置和删除断点,以帮助开发人员检查程序的执行情况和排查错误。

以下是GDB中关于`break`命令的用法介绍:
- `break`:不带参数时,在所选栈帧中执行的下一条指令处设置断点。

- `break <function>`:在函数体入口处打断点。

- `break <line>`:在当前源码文件指定行的开始处打断点。

- `break -N`或`break +N`:在当前源码行前面或后面的N行开始处打断点,N为正整数。

- `break <filename:line>`:在源码文件`filename`的`line`行处打断点。

- `break <filename:function>`:在源码文件`filename`的`function`函数入口处打断点。

- `break <address>`:在程序指令的地址处打断点。

- `break ... if <cond>`:设置条件断点,... 代表上述参数之一(或无参数),cond 为条件表达式,仅在`cond`值非零时停住程序。

你可以根据需要选择合适的断点设置方式,以帮助你在调试程序时更加高效和便捷。

如需了解更多关于GDB的信息,请参考相关文档或技术资料。

gdb中x的用法 -回复

gdb中x的用法-回复标题:GDB中的“x”命令使用方法一、引言GDB是GNU Project发布的一个强大的源代码级调试工具。

它可以让我们查看程序运行时的内部情况,设置断点,改变变量值,单步执行等等。

本文将详细介绍GDB中的"x"命令的使用方法。

二、"x"命令的基本格式在GDB中,“x”命令用于查看内存中的数据。

它的基本格式如下:x/<size letters> <address>其中,- `<size letters>` 是指定要显示的数据大小,可以是如b(单字节),h(双字节),w(四字节)等。

- `<address>` 是要查看的内存地址。

三、“x”命令的详细说明1. “x”命令的`<size letters>`参数`b`:单字节,即8位;`h`:半字,即两个字节,通常用于短整型;`w`:字,即四个字节,通常用于整型和指针类型;`g`:八字,即八个字节,通常用于长整型和浮点数。

2. “x”命令的`<address>`参数`<address>` 参数可以是一个具体的内存地址,也可以是一个表达式,其结果是一个内存地址。

3. “x”命令的输出格式输出格式如下:(addr)(addr+1): value1(addr+2): value2...其中,`(addr)` 表示开始查看的内存地址,`(addr+n)` 表示第n个元素的内存地址,`valueN`表示该地址处的数据值。

四、“x”命令的实例下面通过几个实例来演示“x”命令的使用。

1. 查看一个整型变量的内存内容假设我们有一个整型变量`int a = 10;`,我们可以使用以下命令来查看它的内存内容:x/w &a输出结果可能是这样的:0x7fffffffe4f4: 0xa这表示从地址`0x7fffffffe4f4`开始的四个字节的内容是十进制数10(十六进制数0xa)。

GDB及strace使用及移植介绍

GDB章节GDB是linux下常用的应用程序调试工具,本文介绍linux环境下一些常用的调试命令,并通过交叉编译移植GDB到Android开发板上。

主机系统环境:Linux TS-Server2.6.32-21-generic-pae#32-Ubuntu SMP Fri Apr1609:39:35UTC 2010i686GNU/Linux目标板环境:Linux localhost3.0.31-00003-OMAP-Android-01831-gf9b35ae#4SMP PREEMPT Fri Sep708:19:55CST2012armv7l GNU/Linux交叉编译工具版本:gcc version4.4.1(Sourcery G++Lite2010q1-202)(target:arm-none-linux-gnueabi)GDB源码版本7.2:下载地址http://202.109.143.228:82/down/gdb-7.2.tar.gz或/gnu/gdb/gdb-7.3.1.tar.gz(官网最新版)GDB依赖库ncurses:下载地址/pub/gnu/ncurses/ncurses-5.8.tar.gz环境变量说明:export CC_PATH=/home/lichao/android/arm/opt/CodeSourcery/bin//交叉编译工具链路径export SRC_GDB=~/Download一.GDB常用命令命令介绍:gdb>list//列出源码,默认源码文件和执行文件同路径gdb><回车>//重复上次命令gdb>break10//在第十行下断点gdb>break func//在函数func入口下断点gdb>info break//查看断点信息gdb>info args//打印当前函数参数名和值gdb>info locals//打印当前函数所有局部变量和值gdb>disassemblefunc//查看函数func的汇编代码gdb>run//运行程序gdb>next//单条语句执行gdb>n//等同nextgdb>continue//继续运行gdb>p i//打印变量值,等同于printgdb>bt//查看函数堆栈gdb>shell<command>//执行shell命令gdb>clear<linenum>//清除断点,相关命令有delete/disable/enablegdb>step//单步运行二.移植GDB到Omap4460开发板(跑的是Android4.0)1.解压配置$mkdir~/gdb$cp$SRC_GDB/gdb-7.2.tar.gz~/gdb$cd~/gdb$tar xvf gdb-7.2.tar.gz-C.$cd gdb-7.2$export PATH=$CC_PATH:$PATH//追加交叉编译工具链至path中,请确保成功添加$./configure--host=arm-none-linux-gnueabi--prefix=/home/lichao/gdb/arm_gdb(上面指定的host表示目标主机所需的编译器前缀,而prefix有可能设置全路径而不是带环境变量的路径安装路径,请注意)以上都ok,如果有问题,请检查你的交叉编译工具链环境变量和相关操作是否正确。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档