GDB常用命令

GDB常用命令
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,用于在指定文件对应行设置断

点;

break + <0x...>,break 0x3400a,用于在内存某一位置处暂停;

break + 行号 + if + 条件,break 10 if i==3,用于设置条件断点,在循环中使用非常方便;

info breakpoints/watchpoints [n], info break,n表示断点号,查看断点/观察点的情况;

clear+要清除的断点行号, clear 10,用于清除对应行的断点,要给出断点的行号,清除时GDB会给出提示;

delete+要清除的断点编号,delete 3,用于清除断点和自动显示的表达式的命令,要给出断点的编号,清除时GDB不会给出任何提示;

disable/enable+断点编号,disable 3,让所设断点暂时失效/使能,如果要让多个编号处的断点失效/使能,可将编号之间用空格隔开;

awatch/watch+变量,awatch/watch i,设置一个观察点,当变量被读出或写入时程序被暂停;

rwatch+变量,rwatchi,设置一个观察点,当变量被读出时,程序被暂停;

catch,设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C++的异常;

tcatch,只设置一次捕捉点,当程序停住以后,应点被自动删除;

3.数据命令

display +表达式,display a,用于显示表达式的值,每当程序运行到断点处都会显示表达式的值;

info display,用于显示当前所有要显示值的表达式的情况;

delete+display 编号,delete 3,用于删除一个要显示值的表达式,被删除的表达式将不被显示;

disable/enable+display 编号, disable/enable 3,使一个要显示值的表达式暂时失效/使能;

undisplay+display 编号, undisplay 3,用于结束某个表达式值的显示;

whatis+变量, whatisi,显示某个表达式的数据类型;

print(p)+变量/表达式, p n,用于打印变量或表达式的值;

set+变量 = 变量值,set i = 3,改变程序中某个变量的值;

在使用print命令时,可以对变量按指定格式进行输出,其命令格式为print /变量名 + 格式。

其中常用的变量格式:x:十六进制;d:十进制;u:无符号数;o:八进制;c:字符格式;f:浮点数。

4.调试运行环境相关命令

set args,set args arg1 arg2,设置运行参数;

show args,show args,参看运行参数;

set width+数目,set width 70,设置GDB的行宽;

cd+工作目录,cd ../,切换工作目录;

run,r/run,程序开始执行;

step(s),s,进入式(会进入到所调用的子函数中)单步执行,进入函数的前提是,此函数被编译有debug信息;

next(n),n,非进入式(不会进入到所调用的子函数中)单步执行;

finish,finish,一直运行到函数返回并打印函数返回时的堆栈地址和返回值及参数值等信息

until+行数,u 3,运行到函数某一行;

continue(c),c,执行到下一个断点或程序结束;

return <返回值>,return 5,改变程序流程,直接结束当前函数,并将指定值返回;

call+函数,call func,在当前位置执行所要运行的函数;

5.堆栈相关命令

backtrace/bt bt 用来打印栈帧指针,也可以在该命令后加上要打印的栈帧指针的个数,查看程序执行到此时,是经过哪些函数呼叫的程序,程序“调用堆栈”是当前函数之前的所有已调用函数的列表(包括当前函数)。每个函数及其变量都被分配了一个“帧”,最近调用的函数在 0 号帧中(“底部”帧)frame frame 1 用于打印指定栈帧

info reg info reg 查看寄存器使用情况

info stack info stack 查看堆栈使用情况

up/down up/down 跳到上一层/下一层函数

6.跳转执行

jump 指定下一条语句的运行点。可以是文件的行号,可以是file:line 格式,可以是+num这种偏移量格式。表式着下一条运行语句从哪里开始。相当于改变了PC寄存器内容,堆栈内容并没有改变,跨函数跳转容易发生错误。

7.信号命令

signal signal SIGXXX 产生XXX信号,如SIGINT。一种速查Linux 查询信号的方法:# kill -l

handle 在GDB中定义一个信号处理。信号可以以SIG开头或不以SIG 开头,可以用定义一个要处理信号的范围(如:SIGIO-SIGKILL,表示处理从SIGIO 信号到SIGKILL的信号,其中包括SIGIO,SIGIOT,SIGKILL三个信号),也可以使用关键字all来标明要处理所有的信号。一旦被调试的程序接收到信号,运行程序马上会被GDB停住,以供调试。其可以是以下几种关键字的一个或多个:nostop/stop

当被调试的程序收到信号时,GDB不会停住程序的运行,但会打出消息告诉你收到这种信号/GDB会停住你的程序

print/noprint

当被调试的程序收到信号时,GDB会显示出一条信息/GDB不会告诉你收到信号的信息

pass

noignore

当被调试的程序收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程序会处理。

nopass

ignore

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

info signals

info handle

可以查看哪些信号被GDB处理,并且可以看到缺省的处理方式

single命令和shell的kill命令不同,系统的kill命令发信号给被调试程序时,是由GDB截获的,而single命令所发出一信号则是直接发给被调试程序的。

8.运行Shell命令

如(gdb)shell ls来运行ls。

9.更多程序运行选项和调试

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)程序的输入输出。

info terminal 显示你程序用到的终端的模式。

使用重定向控制程序输出。如:run >outfile

tty命令可以指写输入输出的终端设备。如:tty /dev/ttyb

5)调试已运行的程序

两种方法:

(1)在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb PID 格式挂接正在运行的程序。

(2)先用gdb 关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。

6)暂停 / 恢复程序运行

当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops),如果要恢复程序运行,可以使用c或是continue 命令。

7)线程(Thread Stops)

如果程序是多线程,可以定义断点是否在所有的线程上,或是在某个特定的线程。

break thread

break thread if ...

linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,可以通过“info threads”命令来查看正在运行程序中的线程信息。如果不指定thread 则表示断点设在所有线程上面。还可以为某线程指定断点条件。如:

(gdb) break frik.c:13 thread 28 if bartab>lim

当你的程序被GDB停住时,所有的运行线程都会被停住。这方便查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。

10.调试core文件

Core Dump:Core的意思是内存,Dump的意思是扔出来,堆出来。开发和使用Unix程序时,有时程序莫名其妙的down了,却没有任何的提示(有时候会提示core dumped),这时候可以查看一下有没有形如core.进程号的文件生成,这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考

(1)生成Core文件

一般默认情况下,core file的大小被设置为了0,这样系统就不dump出core file了。修改后才能生成core文件。

#设置core大小为无限

ulimit -c unlimited

#设置文件大小为无限

ulimit unlimited

这些需要有root权限, 在ubuntu下每次重新打开中断都需要重新输入上面的第一条命令, 来设置core大小为无限

core文件生成路径:输入可执行文件运行命令的同一路径下。若系统生成的core文件不带其他任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的core文件。

1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。

可通过以下命令修改此文件:

echo "1" > /proc/sys/kernel/core_uses_pid

2)proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。

可通过以下命令修改此文件:

echo "/corefile/core-%e-%p-%t" >core_pattern,可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳以下是参数列表:

%p - insert pid into filename 添加pid

%u - insert current uid into filename 添加当前uid

%g - insert current gid into filename 添加当前gid

%s - insert signal that caused the coredump into the filename 添加导致产生core的信号

%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间

%h - insert hostname where the coredump happened into filename

添加主机名

%e - insert coredumping executable name into filename 添加命令名

(2)用gdb查看core文件

发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.

gdb [exec file] [core file]

如: gdb ./test core

或gdb ./a.out

core-file core.xxxx

gdb后, 用bt命令backtrace或where查看程序运行到哪里, 来定位core dump的文件->行.

待调试的可执行文件,在编译的时候需要加-g,core文件才能正常显示出错信息

1)gdb -core=core.xxxx

file ./a.out

bt

2)gdb -c core.xxxx

file ./a.out

bt

(3)用gdb实时观察某进程crash信息

启动进程

gdb -p PID

c

运行进程至crash

gdb会显示crash信息

bt

利用gdb调试core文件

利用gdb调试core文件 什么是core dump core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump。(linux中如果内存越界会收到SIGSEGV信号,然后就会core dump) 在程序运行的过程中,有的时候我们会遇到Segment fault(段错误)这样的错误。这种看起来比较困难,因为没有任何的栈、trace信息输出。该种类型的错误往往与指针操作相关。往往可以通过这样的方式进行定位。 造成segment fault,产生core dump的可能原因 1、内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符 c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。 2、多线程程序使用了线程不安全的函数。 3、多线程读写的数据未加锁保护。 对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成core dump 4、非法指针 a) 使用空指针 b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内

GDB基本使用方法

GDB基本使用方法 GDB是用来调试用户态程序的一款工具,可以追踪程序运行轨迹,打出调用栈,寄存器内容,查看内存等等 首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的-g 参数可以做到这一点。如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。 启动GDB 直接找到gdb的路径执行就ok,进入GDB后可以输入help命令查看帮助信息 加载可执行文件启动 gdb executable-file set args 参数列表 以上两步等同于 gdb –args executable-file 参数列表 run或者start都可以启动调试 多用于调试启动阶段就异常的程序 调试正在运行的程序 以下三种形式都可以attach到正在运行的程序上调试 ps -ef | grep http www-data 24470 1 0 Jan17 ? 00:00:14 /usr/sbin/lighttpd gdb attach 24470 gdb --pid 24470 gdb -p 24470 设置断点 break -- Set breakpoint at specified line or function b func1 break func1 设置在func1处 b file:line 设置在文件的第几行处 b *0x指令地址设置在具体的某条汇编指令处 设置断点后,代码执行到func1处会被断住,方便我们查看当时的信息 打印调用栈 backtrace bt 如果你要查看栈下面层的详细信息 frame 栈中的层编号 查看所有断点 info break 删除断点 delete 断点号 如果不加断点号为删除全部断点 禁用断点 disable 断点号 启用断点

如何高效使用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调试器

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命令简介

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

一、设置断点(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

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

gbd调试

用GDB调试程序 GDB概述 ———— GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UN IX平台下做软件,你会发现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调试:

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,用于在指定文件对应行设置断

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

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 源代码,编译安装。

使用QEMU+GDB调试Linux内核

使用QEMU调试Linux内核 一.使用QEMU安装Ubuntu10.04 1.安装qemu ubuntu下使用sudo apt-get install 安装的qemu版本是0.12.3,该版本中存在bug,使得无法在断点处停下;因此需要在qemu官方网站https://www.360docs.net/doc/3b11612818.html,/Download上下载最新的版本qemu-0.12.5.tar.gz的源代码包自己进行编译安装: ●Sudo apt-get install zlib1g-dev libsdl-dev ●解压源代码后,进入源代码所在目录执行./confingure ●执行make ●执行sudo make install 2.创建QEMU格式的硬盘 qemu-img create –f qcow2name.img size 例如:qemu-img create –f qcow2 ubuntu10.04.img 4GB 3.在创建的硬盘上安装操作系统 qemu–hdaname.img–cdrom ~/Download/ubuntu10.04.iso –boot d 说明:使用hda指定硬盘镜像,使用CDROM选定光驱。-boot d 指从cdrom启动,-boot a是软盘,-boot c 是硬盘;使用qemu或qemu-system-x86_64(64为机子),有时安装系统会很慢,这是可以考虑使用kvm来代替。 例如:kvm–hda ubuntu10.04.img –cdrom ./ubuntu-10.04.iso -boot

d 4.从已经装好操作系统的硬盘启动 qemu–hda ubuntu10.04.img 5.在64位的主机上要使用qemu-system-x86_64命令来代替qemu 二.自己编译内核 现将Linux的编译调节过程简述为: 1. 下载自己要调试的Linux内核的源代码,这个可以从Linux内 核的官方网站上得到:https://www.360docs.net/doc/3b11612818.html, 2. 编译内核最主要的便是配置文件.config,为了能够准确的得到 结果(第一次不要求编译时间),将本机的config文件直接拷 贝到解压后的源代码中。 3.然后进行make操作,结束后将产生的bzImage文件拷到boot 目录下,重启,选择自己编译的内核,这样一般不会出问题,但时间较慢,大约编译一次需要40分钟。 3.1以前编译内核是为调试内核服务的,现在做华为的项目, 发现需要在实际的机器上运行自己编译的内核,参考网站: https://www.360docs.net/doc/3b11612818.html,/tips/compiling-linux-kernel-26.html 4.为了降低编译时间,就需要对配置文件进行裁剪,在配置文件 中有好多是本机不需要的模块,参考: https://www.360docs.net/doc/3b11612818.html,/Linux/kernel_options.html。另外调试内 核与模块无关,所以辨识为M的直接可以不选。 5.剪裁的时候采用“逐步瘦身”法,先剪裁掉某个或某几个模块, 然后在进行编译,若没错,在进行模块裁剪,这样可以最大程

如何在Linux中使用gdb调试C程序

如何在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 调

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)

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通配符(*、?、[、])在内。

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

用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软件开发之GCC,GDB用法篇

(转贴)linux 下的软件开发之GCC,GDB用法篇 -|tinylee 发表于 2005-8-22 1:02:00 在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C编译器。目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada等。 开放、自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程。在使用GCC编译程序时,编译过程可以被细分为四个阶段: ◆ 预处理(Pre-Processing) ◆ 编译(Compiling) ◆ 汇编(Assembling) ◆ 链接(Linking) Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。 GCC提供了30多条警告信息和三个警告级别,使用它们有助于增强程序的稳定性和可移植性。此外,GCC 还对标准的C和C++语言进行了大量的扩展,提高程序的执行效率,有助于编译器进行代码优化,能够减轻编程的工作量。 GCC起步 在学习使用GCC之前,下面的这个例子能够帮助用户迅速理解GCC的工作原理,并将其立即运用到实际的项目开发中去。首先用熟悉的编辑器输入清单1所示的代码: 清单1:hello.c #i nclude int main(void) { printf ("Hello world, Linux programming!n"); return 0; } 然后执行下面的命令编译和运行这段程序: # gcc hello.c -o hello # ./hello Hello world, Linux programming! 从程序员的角度看,只需简单地执行一条GCC命令就可以了,但从编译器的角度来看,却需要完成一系列非常繁杂的工作。首先,GCC需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入“#i nclude”语句所包含的内容;接着,GCC会调用ccl和as将处理后的源代码编译成目标代码;最后,GCC会调用链接程序ld,把生成的目标代码链接成一个可执行程序。 为了更好地理解GCC的工作过程,可以把上述编译过程分成几个步骤单独进行,并观察每步的运行结果。第一步是进行预编译,使用-E参数可以让GCC在预处理结束后停止编译过程:# gcc -E hello.c -o hello.i 此时若查看hello.cpp文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而其它应当被预处理的宏定义也都做了相应的处理。下一步是将hello.i编译为目标代码,这可以通过使用-c参数来完成:

相关文档
最新文档