Linux下gdb用法简单介绍

ps:前不久好像说过linux的ARM-CPU结构体系。最近一直在搬家,很忙,上网时间少,也没写什么文章,也不知道写点什么,因为很多东西baidu一大堆。今天随便补充点儿东西!B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
makefile的一些用法:再了解makefile之前,希望大家好好了解一下vi的用法,有兴趣也可了解一下Emacs的高级用法,掌握一下GCC的用法。还有由于linux的shell命令很多也不想一一讲解。在此之前我先深入浅出的介绍一下GDB的用法。B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
我们先看一个例子(">"先用这个符号代表注释部分):B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
//源代码B9n中国红客联盟-全球最大的红客组织
#include<stdio.h>B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
int func(int n)B9n中国红客联盟-全球最大的红客组织
{B9n中国红客联盟-全球最大的红客组织
    int sum = 0,i;B9n中国红客联盟-全球最大的红客组织
    for(i = 0; i < n; i++)B9n中国红客联盟-全球最大的红客组织
    {B9n中国红客联盟-全球最大的红客组织
    sum += i;B9n中国红客联盟-全球最大的红客组织
    }B9n中国红客联盟-全球最大的红客组织
    return sum;B9n中国红客联盟-全球最大的红客组织
}B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
main()B9n中国红客联盟-全球最大的红客组织
{B9n中国红客联盟-全球最大的红客组织
    int i;B9n中国红客联盟-全球最大的红客组织
    long result = 0;B9n中国红客联盟-全球最大的红客组织
    for(i = 1; i <= 100; i++)B9n中国红客联盟-全球最大的红客组织
    {B9n中国红客联盟-全球最大的红客组织
        result += 1;B9n中国红客联盟-全球最大的红客组织
    }B9n中国红客联盟-全球最大的红客组织
    printf("result[1-100] = %d n ",result);B9n中国红客联盟-全球最大的红客组织
    printf("result[1-250] = %d n ",func(250));B9n中国红客联盟-全球最大的红客组织
}B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>我们先进行编译B9n中国红客联盟-全球最大的红客组织
[root@localhost opencTM]# vi test.cB9n中国红客联盟-全球最大的红客组织
[root@localhost opencTM]# gcc -Werror -g test.c -o testB9n中国红客联盟-全球最大的红客组织
[root@localhost opencTM]#B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>然后我们进行调试一下B9n中国红客联盟-全球最大的红客组织
[root@localhost opencTM]# gdbB9n中国红客联盟-全球最大的红客组织
GNU gdb Everest Linux (6.4-2)B9n中国红客联盟-全球最大的红客组织
Copyright 2005 Free Software Foundation, Inc.B9n中国红客联盟-全球最大的红客组织
GDB is free software, covered by the GNU General Public License, and you areB9n中国红客联盟-全球最大的红客组织
welcome to change it and/or distribute copies of it under certain conditions.B9n中国红客联盟-全球最大的红客组织
Type "show copying" to see the conditions.B9n中国红客联盟-全球最大的红客组织
There is absolutely no warranty for GDB.  Type "show warranty" for details.B9n中国红客联盟-全球最大的红客组织
This GDB was configured as "i686-pc-linux-gnu".B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>载入文件testB9n中国红客联盟-全球最大的红客组织
(gdb) file testB9n中国红客联盟-全球最大的红客组织
Reading symbols from /root/My Documents/opencTM/test...done.B9n中国红客联盟-全球最大的红客组织
Using host libthread_db library "/lib/libthread_db.so.1".B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>列出部分代码B9n中国红客联盟-全球最大的红客组织
(gdb) listB9n中国红客联盟-全球最大的红客组织
5               int sum = 0,i;B9n中国红客联盟-全球最大的红客组织
6               for(i = 0; i < n; i++)B9n中国红客联盟-全球最大的红客组织
7               {B9n中国红客联盟-全球最大的红客组织
8               sum += i;B9n中国红客联盟-全球最大的红客组织
9               }B9n中国红客联盟-全球最大的红客组织
10              return sum;B9n中国红客联盟-全球最大的红客组织
11      }B9n中国红客联盟-全球最大的红客组织
12B9n中国红客联盟-全球最大的红客组织
13      main()B9n中国红客联盟-全球最大的红客组织
14      {B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>直接按回车继续上一个命令B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
15              int i;B9n中国红客联盟-全球最大的红客组织
16              long result = 0;B9n中国红客联盟-全球最大的红客组织
17              for(i = 1; i <= 100; i++)B9n中国红客联盟-全球最大的红客组织
18              {B9n中国红客联盟-全球最大的红客组织
19                      result += 1;B9n中国红客联盟-全球最大的红客组织
20              }B9n中国红客联盟-全球最大的红客组织
21              printf("result[1-100] = %d n ",result);B9n中国红客联盟-全球最大的红客组织
22              printf("result[1-250] = %d n ",func(250));B9n中国红客联盟-全球最大的红客组织
23      }B9n中国红客联盟-全球最大的红客组织
24B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>设置断点,分别在主函数和func入口处。B9n中国红客联盟-全球最大的红客组织
(gdb) break mainB9n中国红客联盟-全球最大的红客组织
Breakpoint 1 at 0x80483a1: file test.c, line 14.B9n中国红客联盟-全球最大的红客组织
(gdb) break funcB9n中国红客联盟-全球最大的红客组织
Breakpoint 2 at 0x804837a: file test.c, line 5.B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>查看断点信息B9n中国红客联盟-全球最大的红客组织
(gdb) info breakB9n中国红客联盟-全球最大的红客组织
Num Type           Disp Enb Address    WhatB9n中国红客联盟-全球最大的红客组织
1   breakpoint     keep y   0x080483a1 in main at test.c:14B9n中国红客联盟-全球最大的红客组织
2   breakpoint     keep y   0x0804837a in func at test.c:5B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>运行程序B9n中国红客联盟-全球最大的红客组织
(gdb) runB9n中国红客联盟-全球最大的红客组织
Starting program: /root/My Documents/opencTM/testB9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
Breakpoint 1, main () at test.c:14B9n中国红客联盟-全球最大的红客组织
14      {B9n中国红客联盟-全球最大的红客组织
(gdb) B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>由于我不想从断点main处运行,想从func函数开始运行我们来个跳转B9n中国红客联盟-全球最大的红客组织
(gdb) jump funcB9n中国红客联盟-全球最大的红客组织
Line 5 is not in `main'.  Jump anyway? (y or n) yB9n中国红客联盟-全球最大的红客组织
Continuing at 0x804837a.B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
Breakpoint 2, func (n=134513569) at test.c:5B9n中国红客联盟-全球最大的红客组织
5               int sum = 0,i;B9n中国红客联盟-全球最大的红客组织
(gdb) B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>发现一个错误,可能这里没有基础的人看不明白,此处n=134513569根本不是我们想要的值,这是怎么回事,等等再告诉大家这个jump跳转在跳转的同时可能会出现非比寻常的错误,此处就是一个在n还没有发生累加同时系统随机给n赋值产生错误,我们回过头来再调试!B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
(gdb) clearB9n中国红客联盟-全球最大的红客组织
Deleted breakpoint 2B9n中国红客联盟-全球最大的红客组织
(gdb) break funcB9n中国红客联盟-全球最大的红客组织
Breakpoint 3 at 0x804837a: file test.c, line 5.B9n中国红客联盟-全球最大的红客组织
(gdb) runB9n中国红客联盟-全球最大的红客组织
Starting program: /root/My Documents/opencTM/testB9n中国红客联盟-全球最大的红客组织
result[1-100] = 100B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
Breakpoint 1, func (n=250) at test.c:5B9n中国红客联盟-全球最大的红客组织
5               int sum = 0,i;B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>这回对了,n=250。。。我们开始没条语句进行调试。。。别忘了,直接按回车进行上一次命令重复!B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
(gdb) nextB9n中国红客联盟-全球最大的红客组织
6               for(i = 0; i < n; i++)B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
8               sum += i;B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
6               for(i = 0; i < n; i++)

gdb)B9n中国红客联盟-全球最大的红客组织
8               sum += i;B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
6               for(i = 0; i < n; i++)B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
8               sum += i;B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
6               for(i = 0; i < n; i++)B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
8               sum += i;B9n中国红客联盟-全球最大的红客组织
(gdb) cB9n中国红客联盟-全球最大的红客组织
Continuing.B9n中国红客联盟-全球最大的红客组织
result[1-250] = 31125        //此处注释一下,应该有点问题。已经退出了!我要检查一下。。。B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
Program exited with code 030.B9n中国红客联盟-全球最大的红客组织
(gdb) B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>忘了告诉大家,本来想后来再说的,刚刚误输入现在只能先说了,所有命令在GDB中都可以缩写,GDB会帮助补全,比如run我们也可输入“r”,所以刚才输入的“c”就是continue。。。然后我们继续。。。B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
(gdb) p iB9n中国红客联盟-全球最大的红客组织
$1 = 3B9n中国红客联盟-全球最大的红客组织
(gdb) B9n中国红客联盟-全球最大的红客组织
>晕!又输错了,"p"的意思就是print,打印i现在值。B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>next后面可以是一个表达式。。。B9n中国红客联盟-全球最大的红客组织
(gdb) n sum += iB9n中国红客联盟-全球最大的红客组织
8               sum += i;B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>查看堆栈B9n中国红客联盟-全球最大的红客组织
(gdb) btB9n中国红客联盟-全球最大的红客组织
#0  func (n=250) at test.c:8B9n中国红客联盟-全球最大的红客组织
#1  0x080483ef in main () at test.c:22B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>退出函数B9n中国红客联盟-全球最大的红客组织
(gdb) finishB9n中国红客联盟-全球最大的红客组织
Run till exit from #0  func (n=250) at test.c:8B9n中国红客联盟-全球最大的红客组织
0x080483ef in main () at test.c:22B9n中国红客联盟-全球最大的红客组织
22              printf("result[1-250] = %d n ",func(250));B9n中国红客联盟-全球最大的红客组织
Value returned is $2 = 31128B9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>继续运行 B9n中国红客联盟-全球最大的红客组织
(gdb) cB9n中国红客联盟-全球最大的红客组织
Continuing.B9n中国红客联盟-全球最大的红客组织
result[1-250] = 31128B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
Program exited with code 030.B9n中国红客联盟-全球最大的红客组织
>已经退出了.B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>退出B9n中国红客联盟-全球最大的红客组织
(gdb) qB9n中国红客联盟-全球最大的红客组织
[root@localhost opencTM]#B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
>可能对于不了解GBD的人来说很茫然,所以我系统的再介绍一下,可能会有遗漏与不足的地方希望谅解。。。B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
    GBD有很多命令,比如:B9n中国红客联盟-全球最大的红客组织
file----装入想要调试的可执行文件!B9n中国红客联盟-全球最大的红客组织
kill----终止正在调试的程序!B9n中国红客联盟-全球最大的红客组织
list----列出产生文件源代码的一部分!B9n中国红客联盟-全球最大的红客组织
next----执行一行源代码,但是不进入函数的内部!B9n中国红客联盟-全球最大的红客组织
step----执行代码并且进入函数内部!B9n中国红客联盟-全球最大的红客组织
run----执行正在被调试的程序!B9n中国红客联盟-全球最大的红客组织
quit---终止并退出调试!B9n中国红客联盟-全球最大的红客组织
watch----监视一个值,无论什么时候改变始终监视!B9n中国红客联盟-全球最大的红客组织
break----在代码里设置断点!B9n中国红客联盟-全球最大的红客组织
make----不必退出!B9n中国红客联盟-全球最大的红客组织
shell----不必离开!B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
1:先说一下启动gdb,启动gdb一般在后面输入你要启动的文件名字就可以,比如刚才我们同样可以输入gdb test,也可以再输入GDB回车后用file命令载入要调试的文件比如:file test。B9n中国红客联盟-全球最大的红客组织
我们还可以再你的program后面加一个core,而core是程序非法执行core dump后产生的文件。B9n中国红客联盟-全球最大的红客组织
还可以再你的program后面加上一个PID,比如你的程序是一个服务程序,那么这个服务程序的进程ID,gbd会自动连上并调试,这个program应该在PATH环境变量中搜索得到!在调试的时候,我们可以先ps查看正在运行程序的PID,然后用attach挂载上,当程序调试完后,我们可以用detach取消挂载的进程。B9n中国红客联盟-全球最大的红客组织
我们还可以加一些选项,比如:B9n中国红客联盟-全球最大的红客组织
-se file //从指定文件中读取符号表B9n中国红客联盟-全球最大的红客组织
-c file  //调试core dump的core文件。B9n中国红客联盟-全球最大的红客组织
-d directory //加入一些搜索路径。B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
2:我们可以帮助,只需输入和help就可以比如:B9n中国红客联盟-全球最大的红客组织
help class:查看种类中的命令B9n中国红客联盟-全球最大的红客组织
help breakpoint:查看断点B9n中国红客联盟-全球最大的红客组织
help command:查看命令等等。我们也可自动补上我们忘记的命令写法,与shell方法相同,就是输入头字母然后连按两下[tab]就可以自动补上,比如:B9n中国红客联盟-全球最大的红客组织
(gdb) bB9n中国红客联盟-全球最大的红客组织
backtrace  break      btB9n中国红客联盟-全球最大的红客组织
(gdb) bB9n中国红客联盟-全球最大的红客组织
如上,输入b,然后连按两下[tab]就会自动补上命令的查看。我们也可用缩写,比如quit可以直接写成q:B9n中国红客联盟-全球最大的红客组织
(gdb) qB9n中国红客联盟-全球最大的红客组织
[root@localhost opencTM]#B9n中国红客联盟-全球最大的红客组织
这样我们就退出了,与quit命令相同!B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
3:我们在gdb中可以用shell命令,方法很简单,直接输入shell command就可以了。比如:B9n中国红客联盟-全球最大的红客组织
(gdb) shell pwdB9n中国红客联盟-全球最大的红客组织
/rootB9n中国红客联盟-全球最大的红客组织
(gdb)B9n中国红客联盟-全球最大的红客组织
这样我们在gdb中就可以调用shell命令了。我们也可用make来修改程序,这个与shell make基本相同。B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
4:运行程序run,在运行程序之前,我们可以设置很多程序参数,比如set args 可以指定运行的参数,比如输入set args 10 20 30 40 50 。我们当然可以查看参数,输入show args。B9n中国红客联盟-全球最大的红客组织
其次我们可以设置运行环境,用path,查看运行环境show path,(由于现在没有网络,有些东西介绍起来很不方便,而且网上这些命令详细用法很多,有兴趣可以自己好好研究一下,我只能做个简单介绍!)。B9n中国红客联盟-全球最大的红客组织
还可以设置环境变量:set environments,比如set env user=openctm。同时可以查看:show env [环境变量名]。

顺便加上一个程序输入与输出可以使用重定向“>”比如:run > outfile。还有tty输入输出的终端设备等等。。。B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
    由于时间问题,我们只能说到这里,gdb很强大,比如还有:break设置断点,设置watch观察点,设置catch捕获点,clear维护停止点,查看栈信息bt,搜索源代码search查看改变数据print(不止能打印,还可以改变!)及跳转指令jump,信号量singal,强制返回return强制调用call,及程序调试的方式直接运行,单步调试等等也不是一下两下能说完的,而且调试还需要大家对调试相当有经验,而且每一个命令都有很多扩展用法,有兴趣可以baidu查看。。。B9n中国红客联盟-全球最大的红客组织
B9n中国红客联盟-全球最大的红客组织
    本来要说一下makefile的用法,现在打了这么多就再跟一篇说一下makefile的用法吧。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值