gdb调试

GDB讲解GDB概述GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。

一般来说,GDB主要帮忙你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2、可让被调试的程序在你所指定的调置的断点处停住。

(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。

4、动态的改变你程序的执行环境。

gcc编译程序中必须加-g 选项。

GDB启动启动方式主要有三种1、gdb <program>program也就是你的执行文件,一般在当然目录下。

2、gdb <program> core用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。

3、gdb <program> -p <PID>如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。

gdb会自动attach上去,并调试他。

program应该在PATH环境变量中搜索得到。

用gdb –help 还可以gdb启动时的一些启动开关-symbols <file>-s <file>从指定文件中读取符号表。

一般可以用调试静态库或动态链接库。

-se file从指定文件中读取符号表信息,并把他用在可执行文件中。

-core <file>-c <file>调试时core dump的core文件。

-directory <directory>-d <directory>加入一个源文件的搜索路径。

默认搜索路径是环境变量中PATH所定义的路径。

GDB调试命令1.设置断点break <function>在进入指定函数时停住。

break <file> <linenum>在指定行号停住。

如果只有一个文件,不用指定file参数。

break +offsetbreak -offset在当前行号的前面或后面的offset行停住。

offiset为自然数。

break filename:function在源文件filename的function函数的入口处停住。

这是函数有重载的情况。

break *address在程序运行的内存地址处停住。

breakbreak命令没有参数时,表示在下一条指令处停住。

break ... if <condition>...可以是上述的参数,condition表示条件,在条件成立时停住。

比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。

condition <bnum> <expression>修改断点号为bnum的停止条件为expression。

condition <bnum>清除断点号为bnum的停止条件。

info breakpoints [n]info break [n]查看断点时,可使用info命令,如下所示:(注:n表示断点号)delete [breakpoints] [range...]删除断点如果不指定断点号,则表示删除所有的断点。

range 表示断点号的范围(如:3-7)。

disable [breakpoints] [range...]disable所指定的停止点,breakpoints为停止点号。

如果什么都不指定,表示disable所有的停止点。

简写命令是dis.enable [breakpoints] [range...]enable所指定的停止点,breakpoints为停止点号。

enable [breakpoints] once range...enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable。

enable [breakpoints] delete range...enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。

clear <function>clear <filename:function>清除所有设置在函数上的停止点。

clear <linenum>clear <filename:linenum>清除所有设置在指定行上的停止点。

2.设置观察点watch <expr>为表达式(变量)expr设置一个观察点。

一量表达式值有变化时,马上停住程序。

rwatch <expr>当表达式(变量)expr被读时,停住程序。

awatch <expr>当表达式(变量)的值被读或被写时,停住程序。

info watchpoints列出当前所设置了的所有观察点。

delete [breakpoints] [range...]也可用用来删除观察点3.断点命令我们可以使用GDB提供的command命令来设置停止点的运行命令。

也就是说,当运行的程序在被停止住时,我们可以让其自动运行一些别的命令,这很有利行自动化调试。

对基于GDB的自动化调试是一个强大的支持。

commands [bnum]... command-list ...end如Commands 1printf "x is %d\n",xcontinueend4.程序运行和单步调试continue [ignore-count]c [ignore-count]fg [ignore-count]恢复程序运行,直到程序结束,或是下一个断点到来。

ignore-count表示忽略其后的断点次数。

continue,c,fg三个命令都是一样的意思。

step <count>单步跟踪,如果有函数调用,他会进入该函数。

进入函数的前提是,此函数被编译有debug 信息。

很像VC等工具中的step in。

后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。

next <count>同样单步跟踪,如果有函数调用,他不会进入该函数。

很像VC等工具中的step over。

后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。

finish运行程序,直到当前函数完成返回。

并打印函数返回时的堆栈地址和返回值及参数值等信息。

until 或 u当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体stepi 或 sinexti 或 ni单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。

可以用于调试汇编5.信号处理handle <signal> <keywords...>在GDB中定义一个信号处理。

信号<signal>可以以SIG开头或不以SIG开头,可以用定义一个要处理信号的范围(如:SIGIO-SIGKILL,表示处理从SIGIO信号到SIGKILL的信号,其中包括SIGIO,SIGIOT,SIGKILL三个信号)nostop当被调试的程序收到信号时,GDB不会停住程序的运行,但会打出消息告诉你收到这种信号。

stop当被调试的程序收到信号时,GDB会停住你的程序。

print当被调试的程序收到信号时,GDB会显示出一条信息。

noprint当被调试的程序收到信号时,GDB不会告诉你收到信号的信息。

passnoignore当被调试的程序收到信号时,GDB不处理信号。

这表示,GDB会把这个信号交给被调试程序会处理。

nopassignore当被调试的程序收到信号时,GDB不会让被调试程序来处理这个信号。

info signalsinfo handle查看有哪些信号在被GDB检测中。

6.多线程调试break <linespec> thread <threadno>break <linespec> thread <threadno> if ...linespec指定了断点设置在的源程序的行号。

threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过“info threads”命令来查看正在运行程序中的线程信息。

如果你不指定thread <threadno>则表示你的断点设在所有线程上面。

你还可以为某线程指定断点条件。

当你的程序被GDB停住时,所有的运行线程都会被停住。

这方便你你查看运行程序的总体情况。

而在你恢复程序运行时,所有的线程也会被恢复运行。

那怕是主进程在被单步调试时。

当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。

当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。

你可以用GDB命令来查看当前的栈中的信息。

backtracebt打印当前的函数调用栈的所有信息frame <n>f <n>n是一个从0开始的整数,是栈中的层编号。

比如:frame 0,表示栈顶,frame 1,表示栈的第二层。

up <n>表示向栈的上面移动n层,可以不打n,表示向上移动一层。

down <n>表示向栈的下面移动n层,可以不打n,表示向下移动一层。

info frameinfo f这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内地址。

比如:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等7.查看源码用list命令来打印程序的源代码,可带下列参数<linenum> 行号。

<+offset> 当前行号的正偏移量。

<-offset> 当前行号的负偏移量。

<filename:linenum> 哪个文件的哪一行。

<function> 函数名。

<filename:function> 哪个文件中的哪个函数。

<*address> 程序运行时的语句在内存中的地址set listsize <count>设置一次显示源代码的行数。

8.运行时数据查看print <expr>print /<f> <expr><expr>是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),<f>是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x。

表达式可为const常量、变量、函数等,但不能为宏。

合集下载

实例—使用gdb调试器

实例—使用gdb调试器

2.4 实例—使用gdb调试器1.编写实例程序gcctest.c,见2.2小节的开头部分2.编译3.启动GDB,执行程序启动gdb,进入gdb调试环境,可以使用gdb的命令对程序进行调试。

[root@localhost gdbtest txt]# gdb //启动gdbGNU gdb Fedora (6.8-27.el5)Copyright (C) 2008 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later </licenses/gpl.html>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: gcctestNo 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命令指出要运行的程序gcctestReading 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 mainhello 1hello 2sum=54125560035401396161080590579269632.000000Program exited with code 057.(gdb) file gcctestg //使用file命令指出要运行的程序gcctestgReading symbols from /root/Desktop/gdbtest txt/gcctestg...done.(gdb) r //在gdb中,运行程序使用r或是run命令Starting program: /root/Desktop/gdbtest txt/gcctestg gcctesthello in mainhello 1hello 2sum=54125560035401396161080590579269632.000000Program exited with code 057.(gdb) q //使用q或是quit命令退出gdb[root@localhost gdbtest txt]#4.GDB命令简介support -- Support facilitiestracepoints -- Tracing of program execution without stopping the programuser-defined -- User-defined commandsType "help" followed by a class name for a list of commands in that class.Type "help all" for the list of all commands.Type "help" followed by command name for full documentation.Type "apropos word" to search for commands related to "word".Command name abbreviations are allowed if unambiguous.(gdb) help files //使用help <class>命令查看files类中的命令Specifying and examining files.List of commands:add-shared-symbol-files -- Load the symbols from shared objects in the dynamic linker's link mapadd-symbol-file -- Load symbols from FILEadd-symbol-file-from-memory -- Load the symbols out of memory from a dynamically loaded object filecd -- Set working directory to DIR for debugger and program being debuggedcore-file -- Use FILE as core dump for examining memory and registersdirectory -- Add directory DIR to beginning of search path for source filesedit -- Edit specified file or functionexec-file -- Use FILE as program for getting contents of pure memoryfile -- Use FILE as program to be debuggedforward-search -- Search for regular expression (see regex(3)) from last line listedgenerate-core-file -- Save a core file with the current state of the debugged processlist -- List specified function or lineload -- Dynamically load FILE into the running programnosharedlibrary -- Unload all shared object library symbolspath -- Add directory DIR(s) to beginning of search path for object filespwd -- Print working directoryremote -- Manipulate files on the remote systemremote delete -- Delete a remote fileremote get -- Copy a remote file to the local systemremote put -- Copy a local file to the remote system---Type <return> to continue, or q <return> to quit--- //一屏显示不完,敲回车键显示后面的内容reverse-search -- Search backward for regular expression (see regex(3)) from last line listedsearch -- Search for regular expression (see regex(3)) from last line listedsection -- Change the base address of section SECTION of the exec file to ADDRsharedlibrary -- Load shared object library symbols for files matching REGEXPsymbol-file -- Load symbol table from executable file FILEType "help" followed by command name for full documentation.Type "apropos word" to search for commands related to "word".Command name abbreviations are allowed if unambiguous.(gdb)5.显示源代码(gdb) file gcctestg //使用file命令指出要运行的程序gcctestgLoad new symbol table from "/root/Desktop/gdbtest txt/gcctestg"? (y or n) yReading symbols from /root/Desktop/gdbtest txt/gcctestg...done.(gdb) list //显示当前行后面的源程序1 #include <stdio.h>23 void print_hello1(char *p_str);4 void print_hello2(char *p_str);56 int main(int argc,char **argv)7 {8 double i,sum=0;9 char *pstr="hello in main";10 int arr[]={1,2,3,4,5};(gdb) list //显示当前行后面的源程序11 printf("%s\n",pstr);12 print_hello1("hello 1");13 print_hello2("hello 2");1415 for(i=1; i<=1020000020.01*1020000020.01*10100020.01*10100020.00202; i=i*1.0000016)16 sum=sum/1.0201809902203*1.000102101203*1.00006605+i*10.01016/1.0005;17 printf("sum=%f\n",sum);18 }1920 void print_hello1(char *p_str)(gdb) //敲回车键,继续执行list命令,显示当前行后面的源程序21 {22 printf("%s\n",p_str);23 }2425 void print_hello2(char *p_str)26 {27 printf("%s\n",p_str);28 }(gdb) list 8 //显示程序第8行的周围的源程序3 void print_hello1(char *p_str);4 void print_hello2(char *p_str);56 int main(int argc,char **argv)7 {8 double i,sum=0;9 char *pstr="hello in main";10 int arr[]={1,2,3,4,5};11 printf("%s\n",pstr);12 print_hello1("hello 1");(gdb) list 6,10 //显示程序第6-10行的源程序6 int main(int argc,char **argv)7 {8 double i,sum=0;9 char *pstr="hello in main";10 int arr[]={1,2,3,4,5};(gdb)gdb可以显示调试程序(编译程序时一定要加上-g参数,把源程序信息编译到执行文件中)的源代码。

gdb指定内存断点

gdb指定内存断点

gdb指定内存断点标题:GDB指定内存断点引言概述:GDB(GNU调试器)是一种功能强大的调试工具,可用于调试C、C++和其他编程语言的程序。

其中一个重要的功能是设置断点,使程序在指定的位置停止执行,以便进行调试。

本文将重点介绍GDB中如何指定内存断点,以帮助开发者更好地定位和解决内存相关的问题。

正文内容:1. 指定内存断点的基本概念1.1 内存断点的定义1.2 内存断点的作用和意义1.3 内存断点的分类和使用场景2. GDB中指定内存断点的方法2.1 使用“watch”命令指定内存断点2.2 使用“rwatch”命令指定读取内存断点2.3 使用“awatch”命令指定写入内存断点2.4 使用“hwatch”命令指定硬件内存断点2.5 使用“catch”命令指定异常断点3. 指定内存断点的注意事项3.1 内存断点的限制和性能影响3.2 避免设置过多的内存断点3.3 内存断点的调试技巧和经验分享4. 实例演示:在GDB中指定内存断点的步骤4.1 准备工作:编译和调试程序4.2 使用“watch”命令指定内存断点4.3 调试过程中的内存断点触发和处理4.4 结束调试和移除内存断点5. GDB中指定内存断点的扩展应用5.1 结合其他调试技术和工具使用内存断点5.2 在多线程和多进程程序中使用内存断点5.3 使用内存断点进行内存泄漏和内存溢出的调试总结:通过本文的介绍,我们了解了GDB中指定内存断点的基本概念和方法。

指定内存断点是调试过程中非常有用的工具,可以帮助开发者快速定位和解决内存相关的问题。

然而,在使用内存断点时需要注意一些限制和性能影响,并且可以结合其他调试技术和工具进行更深入的调试。

希望本文对读者在使用GDB进行调试时有所帮助。

vgdb 用法

vgdb 用法

vgdb是用于执行GDB远程调试的命令行工具。

GDB是一个用于调试C、C++和其他编程语言的调试器。

通过使用vgdb,可以在远程服务器上执行GDB调试,并将调试信息传输到本地机器上显示。

以下是vgdb的基本用法:
1. 安装vgdb:首先,确保已经安装了GDB和Qt,并设置好相关的环境变量。

然后,从github下载vgdb源码,并进行编译安装。

2. 启动vgdb:在命令行中输入vgdb命令来启动vgdb。

也可以将vgdb 的路径添加到环境变量中,以便在任何位置直接调用vgdb。

3. 连接到远程服务器:使用target remote命令来连接到远程服务器上的GDB实例。

例如,target remote my_server:2345将连接到IP地址为my_server,端口号为2345的远程服务器上的GDB实例。

4. 加载可执行文件:使用file命令加载要调试的可执行文件。

例如,file my_program将加载名为my_program的可执行文件。

5. 设置断点:使用break命令在指定位置设置断点。

例如,break main 将在main函数的入口处设置断点。

6. 开始调试:使用run命令开始执行调试。

程序将在第一个断点处停止。

7. 查看调试信息:在调试过程中,可以使用各种GDB命令来查看变量的值、调用栈等信息。

这些命令可以在vgdb中使用,也可以在远程GDB实例中使用。

8. 结束调试:使用quit命令结束调试会话。

gdb的安装及使用流程

gdb的安装及使用流程

gdb的安装及使用流程1. 简介gdb是GNU Debugger的缩写,是一款功能强大的调试工具,可用于调试C、C++等程序。

本文将介绍如何安装和使用gdb。

2. 安装gdb以下是在Ubuntu系统上安装gdb的步骤:1.打开终端。

2.输入以下命令安装gdb:sudo apt-get install gdb3.输入系统密码确认安装。

4.等待安装完成。

3. 使用gdb进行调试以下是使用gdb进行调试的基本流程:1.编写带有调试信息的程序。

2.编译程序时需要添加-g选项,以保留调试信息。

例如:gcc -g -o program program.c3.在终端中输入以下命令启动gdb:gdb program这里的program是编译后生成的可执行文件。

4.使用gdb的命令进行调试。

下面是一些常用的gdb命令:•run:运行程序。

•break:设置断点。

•continue:继续执行程序直到下一个断点。

•next:单步执行程序。

•print:打印变量的值。

•finish:执行完当前函数并返回到调用该函数的地方。

•quit:退出gdb。

5.根据需要重复步骤4进行调试,直到找到和解决问题。

4. 调试示例下面以一个简单的C程序进行演示:```c #include <stdio.h>int factorial(int n) { if (n == 1) return 1; else return n * factorial(n-1); } int main() { int n = 5; printf(。

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列出当前的⽂件,共享库。

(2021年整理)GDB调试命令手册.

(2021年整理)GDB调试命令手册.

(完整版)GDB调试命令手册.编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整版)GDB调试命令手册.)的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整版)GDB调试命令手册.的全部内容。

(完整版)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 退出 gdbreverse-search 在源文件中反向搜索正规表达式run 执行该程序search 在源文件中搜索正规表达式set variable 给变量赋值signal 将一个信号发送到正在运行的进程step 执行下一个源程序行,必要时进入下一个函数undisplay display 命令的反命令,不要显示表达式until 结束当前循环up 上移栈帧,使另一函数成为当前函数watch 在程序中设置一个监测点(即数据断点whatis 显示变量或函数类型GDB 命令分类详解一:列文件清单。

gdbserver调试步骤

gdbserver调试步骤编译gdb/gdbserver编译arm-linux-gdb下载gdb-7.12,解压缩进⼊⽬录./configure --target=arm-linux --program-prefix=arm-linux- --prefix=/opt/arm-linux-gdb/修改gdb/remote.c//==================================如果gdb提⽰:GDB7.6 Remote 'g' packet reply is too long修改gdb/remote.c⽂件,屏蔽process_g_packet函数中的下列两⾏:if (buf_len > 2 * rsa->sizeof_g_packet)error (_(“Remote ‘g’ packet reply is too long: %s”), rs->buf);在其后添加:if (buf_len > 2 * rsa->sizeof_g_packet) {rsa->sizeof_g_packet = buf_len ;for (i = 0; i < gdbarch_num_regs (gdbarch); i++){if (rsa->regs[i].pnum == -1)continue;if (rsa->regs[i].offset >= rsa->sizeof_g_packet)rsa->regs[i].in_g_packet = 0;elsersa->regs[i].in_g_packet = 1;}}make && make install编译gdbserver进⼊gdb/gdbserver⽬录./configure --target=arm-linux --host=arm-linux修改⽣成的makefile,将CC AR GXX都修改为交叉编译⼯具链中的⼯具make将⽣成的gdbserver移植到⽬标机即可⽬标机:arm 假设正在运⾏的程序名字为hello,其进程ID 为6622,⽬标机IP为192.168.0.11,那么在⽬标机端开启gdbserver的命令格式:#命令格式gdbserver IP:PORT --attach PID具体到⽬标机开启的命令为:[root@test ~]# gdbserver 192.168.0.11:8888 --attach 6622Attached; pid = 6622Listening on port 8888调试机:PCroot@liangwode:# arm-linux-gdbGNU gdb (GDB) 7.12Copyright (C) 2016 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later </licenses/gpl.html>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 "--host=x86_64-pc-linux-gnu --target=arm-linux".Type "show configuration" for configuration details.For bug reporting instructions, please see:</software/gdb/bugs/>.Find the GDB manual and other documentation resources online at:</software/gdb/documentation/>.For help, type "help".Type "apropos word" to search for commands related to "word".(gdb) target remote 192.168.0.11:8888Remote debugging using 192.168.0.11:8888warning: Can not parse XML target description; XML support was disabled at compile timeReading /home/storm/ftp/hello from remote target...warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead. Reading /home/storm/ftp/hello from remote target...Reading symbols from target:/home/storm/ftp/hello...done.Reading /lib/libc.so.6 from remote target...Reading /lib/ld-linux-armhf.so.3 from remote target...Reading symbols from target:/lib/libc.so.6...done.Reading symbols from target:/lib/ld-linux-armhf.so.3...done.0x76f0a8d4 in nanosleep () at ../sysdeps/unix/syscall-template.S:8484 ../sysdeps/unix/syscall-template.S: No such file or directory.。

gdb调试coredump文件过程:


gdb coredump应用程序 coredump文件 调试coredump文件
通过以上三步就可以调试coredump文件了 通过以下命令调试coredump文件 info threads 显示所有线程 bt 显示线程堆栈信息 thread thread_num 切换线程 frame num 切换栈 info r 显示当前帧的寄存器信息 (每一帧的寄存器信息都是不相同的)
readelf应用coredump readelf -h 读取coredump文件头 readelf -wl 读取应用程序debug_line readelf -源自f 读取应用程序fde和cie信息
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
gdb调试 coredump文件过程:
第一步:首先需要一个进程的 coredump文件,怎么搞出 coredump文 件 呢 ?
1、 ps -fax|grep
进程名称 找到进程的pid
2、gdb -p pid
调试进程
3、gcore coredump名称 则生成core文件
第二步:找出coredump文件的应用程序
1、gdb -c corefile 使用gdb调试core文件
2、info auxv
索引31对应的是core文件的应用程序
第三部:gdb使用应用程序调试coredump文件

gdb 带命令行选项的参数

gdb 带命令行选项的参数详解GDB(GNU Debugger)是一个用于调试程序的强大工具,它允许你在程序执行过程中观察程序的状态、检查变量的值,以及定位和修复错误。

你可以在命令行中使用一些选项来配置GDB 的行为。

以下是一些常见的GDB 命令行选项:1. 指定要调试的程序:```gdb [program]```这是最基本的用法,`program` 是你要调试的可执行文件的名称。

2. 指定核心转储文件:```gdb [program] core```如果程序崩溃并生成了核心转储文件,你可以使用该选项来调试核心转储文件。

3. 加载符号文件:```gdb [program] -s [symbol-file]```使用`-s` 选项可以指定符号文件,这对于调试没有调试信息的二进制文件很有用。

4. 指定启动参数:```gdb --args [program] [args...]```使用`--args` 选项可以将参数传递给正在调试的程序。

5. 使用批处理模式:```gdb -batch -ex "command1" -ex "command2" [program]````-batch` 选项可以使GDB 在执行完指定命令后立即退出。

`-ex` 选项用于指定在启动GDB 后要执行的命令。

6. 使用交互式Shell:```gdb -i=mi [program]````-i=mi` 选项启用了GDB 的机器接口模式,这对于与其他程序(如IDE)进行集成很有用。

7. 设置断点:```gdb -ex "break [function]" [program]```使用`-ex` 选项可以在启动时设置断点。

8. 设置环境变量:```gdb [program] --eval-command="set environment VARNAME=VALUE"```使用`--eval-command` 选项可以在启动时设置GDB 命令。

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`。

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