最新消息: 新版网站上线了!!!

Linux centos 安装gdb调试工具

1、centos 安装gdb调试工具


rpm -qa | grep gdb

gdbm-1.8.0-26.2.1



2、使用gdb提示:-bash: gdb: command not found


3、centos 软件服务器http://mirror.centos.org/centos/6/os/i386/Packages/


4、gdb官网提供地址:http://ftp.gnu.org/gnu/gdb/


我的centos  5.4版本太低,centos 软件服务器提供的gdb 7.2无法安装,去gdb官网下载旧版的gdb

wget   http://ftp.gnu.org/gnu/gdb/gdb-7.0.1a.tar.bz2


5、查找:文件包

find / -name gdb-7.0.1a.tar.bz2      --->  /root/gdb-7.0.1a.tar.bz2


6、删除文件:

rm gdb-7.0.1a.tar.bz2 


7、解压:.tar.ba2文件

tar jxvf 文件名.tar.bz2


如果不需要移动就直接进入目录然后

configure

make

make install


然后gdb -v测试一下

1.jpg

8、linux如何删除网页例如index.html?id=178&kw=X2&s=sn&h=59&x=zx0114so&v=&seq=&t=web

2.png

删除步骤:


开始我是直接rm index.html?id=178&kw=X2&s=sn&h=59&x=zx0114so&v=&seq=&t=web这样删除的可是没有成功

但是后来,用如下方法成功删除了

rm空格,输入文件名前几个字母,按tab补全

发现文件名中多了"\"如下

rm index.html\?id\=178\&kw\=X2\&s\=sn\&h\=59\&x\=zx0114so\&v\=\&seq\=\&t\=web

3.png

九、Linux中gdb调试c语言程序步骤

1、p.c文件代码
#include <stdio.h>
int main()
{
        int a=3;
        int b=4;
        int array[2];
        array[0]=1;
        array[1]=10;
        int *c = &b;
}

2、编译p.c生成p.out 注意一定要有-g不然gdb无法调试
gcc -g p.c -o p.out

4.png

3、使用gdb p.out打开调试的代码
    [root@localhost pointer]# gdb p.out

    warning: Can not parse XML syscalls information; XML support was disabled at compile time.
GNU gdb (GDB) 7.0.1

Copyright (C) 2009 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 "i686-pc-linux-gnu".

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>...

Reading symbols from /home/ctest/pointer/p.out...done.

(gdb)

5.png

这里只是使用的几个简单的命令start,n,p,q还有list命令是列出所有代码自己可以试一试,总之这是一个比vc等要强大很多的命令调试工具

十、c语言指针
#include <stdio.h>
int main()
{
    int a=3;
    int b=4;
    int *p=&b;
    return 0;
}

使用gdb进行调试

6.png

7.png

十一、计算机内存如何工作

8bit表示8个二进制位 (8个由0和1组合的数)
1个字节等于8bit      1Byte=8bit

计算机为什么用二进制来表示数据?我们现在使用的是电子计算机,而电子计算机是有逻辑电路原件组成,计算存储数据是需要电的,而电流有2中状态,一种是高电位由1表示,另一种是低电位由0表示。所以计算机cpu处理的数据不论是图片,音乐,视频等等,在计算机里面都是1和0的个种排列组合


32bit(位)的操作系统最大只能使用4G的内存为什么?
因为cpu地址总线是32位,而操作系统寻址空间是32位

32位指的是:给内存编号只能编到32个二进制位

十二、内存

内存是由操作系统统一管理的

8.png

一个总线有0和1两中状态,那么32个总线就有2的32次方个状态

9.jpg

一个编号代表1个字节(bit),32个总线可以存储2的32次方个字节

10.jpg

11.jpg

1、我们一般写的C语言源代码(函数等)编译后的二进制数据加载到内存的代码段
2、我们声明的常量和全局变量,静态变量,在内存的数据段

代码段在低地址段
通过gdb调试会发现,其实C语言的每一条代码,都是一个计算机指令,这些指令都被加载到内存的代码段,既然被加载到了内存中,说明每个指令都有对应的存储地址,但是C语言不允许我们直接操作内存的代码段

代码编译执行不但被保存在代码段,而且在栈内存保存我们函数当前运行状态,比如当前调用哪个函数?当前调用的函数运行到了多少行?并且这个函数中有那些变量,这些变量的值是什么?这些状态信息都被保存在栈内存

gcc编译器的优化功能
为了能让cpu效率更高,编译之后的数据,是会把同一类型的变量声明放在一起,如int类型的变量地址都是相连的,不会理睬你在代码中定义变量的顺序,这样能让程序执行更快,

32bit操作系统一个指针占4个字节
64bit操作系统一个指针占8个字节

十三、vim剪切

ndd  剪切光标所在处及以下的n行
        例如:剪切光标所在行,以及其下面的4行 使用命令    4dd

yy、Y     :复制当前光标所在处的行
nyy、nY:复制当前光标所在处及以下的n行

dd     :剪切当前光标所在处的行
ndd   :剪切当前光标所在处及以下的n行

p:在当前光标处下面粘贴内容。
P:在当前光标处上面粘贴内容




十四、gdb中如何显示C语言中一个结构体中成员的偏移?

注意下面结构体中的[0],[8],[16],[20],[24].....[44]这些是我后期自己加的,方便后期演示,结构体声明可不能这样,这是不符合语法的


struct task_struct {
     [0] volatile long int state;
     [8] void *stack;
    [16] atomic_t usage;
    [20] unsigned int flags;
    [24] unsigned int ptrace;
    [28] int lock_depth;
    [32] int prio;
    [36] int static_prio;
    [40] int normal_prio;
    [44] unsigned int rt_priority;
};

(gdb) p &((struct task_struct *)0)->prio
$1 = (int *) 0x30
(gdb) p &((struct task_struct *)0)->state
$2 = (volatile long int *) 0x0
(gdb)


十五、Linux编译c程序提示错误:在C99模式之外使用‘for’循环初始化声明

代码:文件名struct.c
#include <stdio.h>
int main()
{
    int a[4]={1,2,3,4};
    int * p[4];
    for(int i=0;i<4;i++){
        p[i]=&a[i];
    }
    return 0;
}

编译此代码:gcc struct.c
提示错误:在C99模式之外使用‘for’循环初始化声明

错误原因:C99 允许在for语句的 “表达式1 ”中定义并初始变量, gcc4 编译c语言的默认标准是C89, 编译C99程序需加参数 “–-std=c99”

c语言有很多标准
以前的标准不允许for(int i=0;;)这中格式
而c99的模式允许了
你的c编译器不是c99标准
for(int i=0;;)
所有你应该这样改
int i;
for(i=0;;);

所以解决办法:
1、如果提示这样的错误吧你的for循环修改为类似这样的格式
        int i;
        for(i=0;;);

2、如果for循环格式继续为for(int i=0;;) 这么在编译指令末尾增加–-std=c99
    把指令gcc struct.c修改为gcc struct.c --std=c99


十六、指针数组

指针类型的数组,是一种数组,此类数组中存储的元素为指针类型(实质各个元素的值为内存中的存储地址)
格式:类似 int * p[4]
一般通过for循环为各个元素赋值
代码:文件名struct.c
#include <stdio.h>
int main()
{
    int a[4]={1,2,3,4};
    int * p[4];
    for(int i=0;i<4;i++){
        p[i]=&a[i];
    }
    return 0;
}

下面通过gdb调试查看

11.png

转载请注明:谷谷点程序 » Linux centos 安装gdb调试工具