Linux的gdb的使用

目录
一、gdb简介
二、gdb使用流程
1、启动gdb
2、查看源码
3、运行程序
4、设置断点
5、单步执行
6、查看变量
7、退出gdb
三、gdb基本使用命令
1、运行命令
2、设置断点
3、查看源码
4、打印表达式
5、查看运行信息
6、分割窗口
7、cgdb强大工具
四、总结

一、gdb简介

GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c/c++程序员,gdb是必不可少的工具;

二、gdb使用流程

这里用c程序做基本演示,c++程序也是一样的;

1、启动gdb
编译一个测试程序,-g表示可以调试,命令如下:

gcc -g test.c -o test

启动gdb,命令如下:

gdb test 
gdb -q test //表示不打印gdb版本信息,界面较为干净;

测试如下:

root@ubuntu:/home/eit/c_test# gdb test
GNU gdb (Ubuntu 7.7-0ubuntu3) 7.7
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/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 "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...done.
(gdb) q
root@ubuntu:/home/eit/c_test# gdb -q test
Reading symbols from test...done.
(gdb) 

到此gdb启动完成!

2、查看源码
list(简写 l): 查看源程序代码,默认显示10行,按回车键继续看余下的。
测试如下:

(gdb) list 
9	#define MAX_SIZE
10	
11	int main()
12	{
13	    int i,fd,size1 ,size2 ,len;
14	    char *buf = "helo!I'm liujiangyong ";
15	    char buf_r[15];
16	    len = strlen(buf);
17	    fd = open("/home/hello.txt",O_CREAT | O_TRUNC | O_RDWR,0666);
18	    if (fd<0)
(gdb) 
19	        {
20	            perror("open :");
21	            exit(1);
22	        }
23	    else
24	        {
25	        printf("open file:hello.txt %d\n",fd);
26	        }
27	    size1 = write(fd,buf,len);
28	    if (fd<0)
(gdb) 
29	    {
30	        printf("writre erro;");
31	
32	    }
33	    else
34	    {
35	        printf("写入的长度:%d\n写入文本内容:%s\n",size1,buf);
36	
37	    }
38	    lseek(fd,0,SEEK_SET);
(gdb) 
39	    size2 = read(fd,buf_r,12);
40	    if (size2 <0)
41	    {
42	        printf("read  erro\n");
43	    }
44	    else
45	    {
46	        printf("读取长度:%d\n 文本内容是:%s\n",size2,buf_r);
47	    }
48	    close(fd);    
(gdb) 
49	
50	
51	}
(gdb) 
Line number 52 out of range; write.c has 51 lines.
(gdb) 

尝试使用gdb进行小程序的调试
gcc -g的选项
gdb gdb-test
一些GDB的命令

GDB的命令
启动方法
本地普通启动 gdb
本地段错误文件启动 gdb core
attch方式启动 gdb
远程启动 gdbserver 0.0.0.0:1234 /path/to/file

启动选项
–symbols < file >
-s < file >
从指定文件中读取符号表
-se < file >
从指定文件中读取符号表信息,并把它们用在可执行文件中
–core < file >
调试时core dump的core文件
–directory < directory>
-d < directory>
加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径
详细的开关可以使用gdb --help

基本命令
set listsize 设置调试中可以查看的行数
set args 10 20 30 40 50 设置程序所需要的参数
path
show paths
save breakpoint name.bp
gdb elf -x name.bp
print § 查看运行数据
print *array@10 查看数组
print file::variable 查看file文件下的variable
x/n、f、u 查看内存
n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示的格式,跟print 的格式参数相同
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

在这里插入图片描述
Linux程序发布流程
确定程序是否存在符号表
readelf -s test-1
生成符号表
objcopy --only-keep-debug test-1 test-1.symbol
生成发布程序
objcopy --strip-debug test-1 test-release
使用符号表进行程序debug
gdb -q --symbol=test-1.symbol --exec=test-release

GDB中暂停/恢复程序运行
断点
条件断点
break if
info breakpoints
delete
disable
enable

观察点
watch 地址
info watchpoints
rwatch

捕捉点
catch event
throw 抛出一个C++的异常 catch throw
catch 捕捉一个C++的异常 catch catch
exec 调用系统调用exev时停止 catch exec
fork 调用系统调用fork时停止 catch fork
load/load libname 载入动态链接库时 catch load / catch load libname

暂停命令
commands bnum
.
.
.
.
end

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值