导航:首页 > 程序命令 > gdb调试命令

gdb调试命令

发布时间:2022-02-07 13:07:45

㈠ 如何gdb调试一个运行中的进程

第一步 编译一个死循环程序。

/* File name malloc.c*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void getmem(void **p, int num){
*p = (void *)malloc(num);
}

void test(void){
char *str = NULL;
getmem((void **)&str, 100);
strcpy(str, "Hello");
printf("%s\n", str);
}

int main(void){
int i = 0;
while(1){
if (i == 1){
test();
return 1;
}
}
return 0;
}

我们可以看出,这个程序就是malloc一段内存空间,用来供strcpy使用,由于只是调试一下,就没有在test程序中加上一些关于strcpy的正确性判断语句。
函数的正常退出的情况是i==1,但是程序运行过程中根本无法使i==1成立。i的变量的值将会在使用gdb时用到。

开始编译
$gcc -g malloc.c

得用gdb,加上-g还是需要的。生成的可执行文件为a.out

第二步 让gdb连接到正在执行的进程上去
首先运行程序。
$./a.out
明显的,是一个死循环。

重新开一个shell
$ps -u
我的机器的运行情况如下所示:
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
wyc 7712 0.0 0.1 6092 3644 pts/8 Ss 10:24 0:00 bash
wyc 7880 0.0 0.1 6092 3608 pts/9 Ss 10:27 0:00 bash
wyc 7929 0.0 0.3 10848 6468 pts/9 S+ 10:28 0:00 gdb
wyc 8347 93.0 0.0 1652 284 pts/8 R+ 10:42 0:13 ./a.out
...

看到没有? ./a.out的进程号是8347。

现在启动gdb
$gdb

由于是调试运行的进程,不是可执行文件,后面不需要跟任何参数。在用 gdb调试运行状态下的程序时,最核心的就是gdb内部的attach命令
用法为
(gdb) attach

这是我的机器上的例子:
$ gdb
GNU gdb (GDB) 7.1.50.20100621
Copyright (C) 2010 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 ing"
and "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu".
For bug reporting instructions, please see:
.
(gdb) attach 8347
Attaching to process 8347
Reading symbols from /home/wyc/desktop/my_program/review/a.out...done.
Reading symbols from /lib/tls/i686/cmov/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/tls/i686/cmov/libc.so.6
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
main () at malloc.c:19
19 if (i == 1){
(gdb) p i
$1 = 0
(gdb) set i=1
Ambiguous set command "i=1": .
(gdb) i=1
Undefined info command: "=1". Try "help info".
(gdb) set i=1
Ambiguous set command "i=1": .
(gdb) set var i=1
(gdb) l
14 }
15
16 int main(void){
17 int i = 0;
18 while(1){
19 if (i == 1){
20 test();
21 return 1;
22 }
23 }
(gdb) n
20 test();
(gdb)
21 return 1;
(gdb)
25 }
(gdb)
0xb7f47775 in __libc_start_main () from /lib/tls/i686/cmov/libc.so.6
(gdb)
Single stepping until exit from function __libc_start_main,
which has no line number information.

Program exited with code 01.
(gdb)

在运行到第20行命令的时候,可以看一下到运行./a.out的那个shell,应该hello字符串在标准输出上了。当gdb中显示进程退出时,./a.out的shell应该结束了当前进程了。
在gdb中用set var i=1 来修改变量i的值(用set i=1不能识别命令),使程序能够正常退出。

在调试时,当前程序调用的所有库也全部都出来了。这个例子中的
Reading symbols from /home/wyc/desktop/my_program/review/a.out...done.
Reading symbols from /lib/tls/i686/cmov/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/tls/i686/cmov/libc.so.6
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
是a.out程序所调用的全部库。可以用这种办法分析当前运行的程序的库的调用情况。

千万不要关掉gdb,以下调试更精彩:

第三步 在gdb中重启程序
在上面已经知道了程序正常退出了,但是gdb还没有退出,这时在gdb中运行run效果如何?

(gdb) run
Starting program: /home/wyc/desktop/my_program/review/a.out
下面是死循环了...
接下Ctrl+c,给gdb发个SIGINT的信号。

^C
Program received signal SIGINT, Interrupt.
main () at malloc.c:19
19 if (i == 1){
(gdb) p i
$2 = 0
(gdb) set var i=1
(gdb) n
20 test();
(gdb) n
Hello
21 return 1;
(gdb) n
25 }
(gdb) n
0xb7e7b775 in __libc_start_main () from /lib/tls/i686/cmov/libc.so.6
(gdb) n
Single stepping until exit from function __libc_start_main,
which has no line number information.

Program exited with code 01.

可以看出,用gdb连接进程后,他会找到运行这个进程所需的全部文件,当前进程关闭后,仍然可以在gdb中启动这个程序。

不得不佩服GDB的调试功能的强大

gdb中的其它命令,就看你分析程序时是否用到了,例如下面的一些简单的命令:

常用的bt, p , p/x , setp, info registers, break , jump ......

㈡ linux入门基础(四)Gdb调试程序

Gdb调试
注意:在Gcc编译选项中一定要加入
–g
退出GDB:quit

Ctrl+d
调试过程:
1.
查看文件
命令:
(gdb)
l
命令:(gdb)
b
行号
注:到第17行停止,并没有执行17行
3.
查看断点情况
info
b
4.
运行代码
r
命令:
(gdb)
r
(也可以指定行开始运行,在r后面加上行号)
5.
查看变量值
p
命令:(gdb)
p
变量名
6.
设置监视点:
watch
z
(变量名)
也可以是复杂的表达式
7.
单步运行
命令:(gdb)
n
(逐过程)
8.逐步,会进入函数
命令:(gdb)
s
9.条件断点
将正常断点转变为条件断点:condition
如:condition
1
i
==
10
只有当满足条件i
==
1时,才会在断点1处暂停
10.
恢复程序运行
c
命令:
(gdb)
c
(程序就会运行,如果没有断点,就运行剩下部分,如果有断点,就会运行到下一个断点)
11.
去除断点
clear
line_number
clear
filename:line_number
12.
help
12.1
help找出类别
12.2help从列表中

㈢ Linux下gdb调试的几个简单命令

和在IDE上差不多,无非是单步 继续 断点之类的
list列出代码
run运行
step单步
break断点
watch查看变量
。。。。

㈣ gcc编译器可以直接使用gdb命令调试吗

vs是自带编译器跟调试器的。如果你想使用gcc和gdb的话,可以使用code::block这个IDE。他会自己默认自带gcc编译器的,他是可以在Windows下使用的

㈤ 如何用GDB进行调试

1: 对于在应用程序中加入参数进行调试的方法:
直接用 gdb app -p1 -p2 这样进行调试是不行的。
需要像以下这样使用:
#gdb app
(gdb) r -p1 -p2
或者在运行run命令前使用set args命令:
(gdb) set args p1 p2
可以用show args 命令来查看

2. 加入断点:
break <linenumber>
break <funcName>
break +offset
break -offset
(在当前行号的前面或后面的offset行停住。)

break filename:linenum
在源文件filename的linenum行处停住。

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

break ... if
...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置 break if i=100,表示当i为100时停住程序。

3. 查看运行时的堆栈:
使用bt命令

4. 打印某个变量的值:
print val

5. 单步: n
继续运行:c
step
单步跟踪,如果有函数调用,他会进入该函数。
next
同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step over。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。
set step-mode
set step-mode on
打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。
set step-mod off
关闭step-mode模式。
finish
运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。
until 或 u
当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。

6.在GDB中执行shell命令:
在gdb环境中,你可以执行UNIX的shell的命令,使用gdb的shell命令来完成:
eg. shell make

7. 运行环境
可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=hchen
show environment [varname] 查看环境变量。

8.观察点(WatchPoint)
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程 序。我们有下面的几种方法来设置观察点:
watch
为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
rwatch
当表达式(变量)expr被读时,停住程序。
awatch
当表达式(变量)的值被读或被写时,停住程序。
info watchpoints
列出当前所设置了的所有观察点。

9. 维护breakpoint
clear
清除所有的已定义的停止点。
clear func
清除所有设置在函数上的停止点。
delete [breakpoints] [range...]
删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。
比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站一样。
disable [breakpoints] [range...]
disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止 点。简写命令是dis.
enable [breakpoints] [range...]
enable所指定的停止点,breakpoints为停止点号。

10、程序变量
查看文件中某变量的值:
file::variable
function::variable
可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:
gdb) p 'f2.c'::x

查看数组的值
有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:
int *array = (int *) malloc (len * sizeof (int));
于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:
p *array@len
如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。

11.输出格式
一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:

x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
(gdb) p/f i
$24 = 1.41531145e-43
(gdb) p/x i
$25 = 0x65
(gdb) p/t i
$26 = 1100101

11.查看内存
使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:
x/
n、f、u是可选的参数。
n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

n/f/u三个参数可以一起使用。例如:
命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。

12.自动显示

你可以设置一些自动显示的变量,当程序停住时,或是在你单步跟踪时,这些变量会自动显示。相关的GDB命令是display。
display
display/
display/ expr
expr是一个表达式,fmt表示显示的格式,addr表示内存地址,当你用display设定好了一个或多个表达式后,只要你的程序被停下来,GDB会自动显示你所设置的这些表达式的值。

格式i和s同样被display支持,一个非常有用的命令是:
display/i $pc

undisplay
delete display
删除自动显示,dnums意为所设置好了的自动显式的编号。

disable display
enable display
disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。

info display
查看display设置的自动显示的信息。GDB会打出一张表格,向你报告当然调试中设置了多少个自动显示设置,其中包括,设置的编号,表达式,是否enable。

13. 设置显示选项
set print address
set print address on
打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。系统默认为打开的,
show print address
查看当前地址显示选项是否打开。

set print array
set print array on
打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔。这个选项默认是关闭的。与之相关的两个命令如下,我就不再多说了。

set print array off
show print array

set print elements
这个选项主要是设置数组的,如果你的数组太大了,那么就可以指定一个来指定数据显示的最大长度,当到达这个长度时,GDB就不再往下显示了。如果设置为0,则表示不限制。

show print elements
查看print elements的选项信息。

set print null-stop
如果打开了这个选项,那么当显示字符串时,遇到结束符则停止显示。这个选项默认为off。

set print pretty on
如果打开printf pretty这个选项,那么当GDB显示结构体时会比较漂亮。

14.关于显示源码list

㈥ 一本关于GDB调试的书籍,书中详细的介绍了,如何在LINUX中使用GDB及其命令!-It is a book abo

.rar] -gdb相关资料,整理的真的很辛苦,希望大家好好珍惜[gdb调试工具指南.rar] -gdb调试工具指南[PrintBar_src.zip ] - 关于打印票据的源代码,支持固定行数的分页[centermanifold06.rar ] - 该程序用来处理微分方程系统的,用来化简一个微分系统的[gdb .rar] - 一本介绍gdb调试的书籍,想要深入学习在linux下编程的朋友们可以看下[gdb

㈦ gdb 的 l 命令

gcc test.c -o test -g

那个-g是告诉gcc把调试信息加进来的。 具体你可以man gcc看看。
-g:
Proce debugging information in the operating system's native format. GDB can work with this debugging information.

㈧ 我下载了一个gdb调试器,然后我在命令行调试程序,它说gdb不内部或外部命令,也不是可运行的程序或批处理

win下把 gdb 全部放到 c:\windows\system32 下面
在cmd下启动 gdb。

或者 你把 gdb 解压到某个文件夹比如: d:\gdb
然后在系统环境变量里设置 PATH 变量,在里面添加 d:\gdb 就可以了。路径之间用分号隔开。
然后你启动一个cmd 就可以运行gdb了。
我把修改PATH 的资料发到你消息里面。

㈨ 如何在Windows的命令行下进行程序编译和gdb调试

1、概念介绍。

1、Windows下的cmd就是Windows的命令行终端,其中的一些命令和Ubuntu的有些许区别,不过在这个博客的范畴中没有涉及。
2、Windows的环境变量,大概可以说是如果设置好了在path路径里面了,就可以直接在cmd命令行里直接调用程序。

2、配置操作

1、选择计算机,右键,选择“属性”
2、“高级系统设置” –> “环境变量”

3、选择“环境变量”里面的“系统变量” ,选择path, 编辑

4、添加环境变量。注意:最好不要动原来的东西,在原来的东西的基础上在前面或后面加上一个分号,然后把Dev C++安装目录下的MinGW64/bin文件夹的路径复制到环境变量里面去。。(此处是巧借了dev的自带编译器,如果各位以其他方法找到了新版的MinGW文件的话,也可以配置成自己喜欢的)注意,路径中不要出现中文,否则可能出现有趣的问题

(ps:博主这边用的就不是dev 的MinGW64包了,而是师兄传下来的 :))

4、一路确定,配置完成。

3、使用操作

在你代码所在的文件夹,按住shift加右键,点击“在此处打开命令窗口”,进入到cmd终端,接下来就可以愉快地使用g++,gcc编译器,和gdb调试器了。

4、后期优化

大家还可以给自己配一个用的顺手的编辑器,比如sublime,gvim,(甚至是notepad ,hhh)同理把它放在环境变量里,那么也可以在cmd中直接打开,这时在win下的编程过程就和Ubuntu的非常像了。。

5、备注

1、此处以win7为例,其他版本的应该大同小异。

2、另附片面的gdb调试方法

3、使用编辑器和命令行编译的方法对于了解程序的运行过程更加有好处,但是从方便性上的确不如IDE,特别是用熟了vs的同学们就应该更能体会得到,所以各有利弊,大家自己选择最符合自己口味的编程环境就好:)

㈩ 请指出gdb调试中命令"n"和"s"的区别

set 功能较多,简易修改变量时总加上var (gdb) p n $1 = 0 (gdb) set n=5 "on" or "off" expected. (gdb) set var n=5 (gdb) p n $2 = 5

阅读全文

与gdb调试命令相关的资料

热点内容
农商银行app账号是什么格式 浏览:977
liunx安装androidsdk 浏览:595
显卡云服务器对比知乎 浏览:178
怎么判断雨棚旁柱子是否加密 浏览:397
android挂号源码 浏览:397
买车有什么app可以查看车型 浏览:1002
如何保证公司服务器安全 浏览:586
如何在本地iis服务器写代码 浏览:938
剑灵电信服务器怎么样 浏览:652
骨科手术学pdf 浏览:772
监控服务器与交换机需要什么技术 浏览:58
为什么文件解压txt后乱码 浏览:785
力学轴向拉伸和压缩 浏览:115
一点公益系统源码 浏览:1003
python怎么创建新文本 浏览:963
redis操作命令 浏览:284
安卓加密后输入密码黑屏 浏览:527
如何让安卓没有升降按键 浏览:770
网易服务器炸了游戏怎么办 浏览:815
会逐年减产的加密货币有哪些 浏览:780