gdb & 链接 & 库文件

1.gdb

     可执行文件分两种: 1.默认的为 release版本,也可以叫发行版本,用户使用

                                    2.debug版本,也叫开发版本,开发者使用

    1.编译过程中手动加入debug信息,生成对应 .o文件 例如:

            gcc  -c  main.c  -g

    2.链接不会加入链接文件,对上述的 .o文件进行链接,例如:

           gcc  -o   run  main.o

    3.可由 .c文件 直接生成debug版本的可执行文件,例如:

          gcc   -o  run  main.c  -g

 

   下面开始说说进入gdb调试内的一些操作:

         l                   //默认显示main函数所在文件的源代码

         list  filename:num       //显示指定文件的指定行附近的代码

         

         b      num        //在指定行下断点

         b      funcname        //给指定函数下断点

         b      filename:linenum   //给指定文件的指定行下断点

         b      num   if  i==5   //在指定行下条件断点,当 i==5时断点生效,主要是后面的 if 加断点的方式以上几种都可以

         info  b     //显示断点信息

         d     bpnum     //删除断点,根据断点号bpnum删除,断点号可由 显示断点信息 后得到

         disable   bpnum    //将断点设为无效断点

         enable   bpnum    //将断点设为有效断点

 

   gdb执行过程中的控制:

         r     //启动调试

         n    //执行下一步

         s    //进入函数中执行,相当于vs中的 逐语句执行

         finish      //退出函数继续执行

         c         //继续执行,直到运行到下一个断点处

         q        //退出调试

  gdb调试过程中如何查看运行的值,类似于vs中的监控功能(结合c语言的知识来看):

         p   valname       //看变量值

         p   &valname    //看变量地址

         p    *ptr               //ptr为一个指针,看指针所指地址存储的值(指针解引用)

         p   arr       //显示数组的所有元素

         p   ptrarr     //ptrarr指向数组arr,显示数组的首地址

         p   ptrarr@num     //通过指向数组的指针显示数组所有元素?(请自行验证,可能描述有误)

         p    struct_val     //显示结构体内的所有成员值

         p    ptr_struct->a      //显示结构体中 a成员的值

         p   funcname(a, b)      //显示函数的返回值,由于函数执行完才会有返回值,所以也可以用来做函数的测试运行

         bt   //显示函数的调用过程

2.链接

        链接分为 软链接和硬链接(Linux中看链接文件和源文件是否是同一个inode结点来判断,看inode的命令为:   ls   -i   )

               软链接(可以理解为快捷方式,并不是真的文件所在):   

                        生成软链接命令:           ln  -s   源文件  链接文件

                        源文件和链接文件是不同的 inode结点

               硬链接(可以理解为起别名):

                         生成硬链接命令:           ln   源文件  链接文件

                        源文件和链接文件是同一个 inode结点

 

      在这里可以了解一下  { Linux ,Windows, U盘 }   三者分别使用何种文件管理系统,了解这个是比较重要的

      操作系统中    进程管理/内存管理/文件管理      是三块大的部分!

 

3.库文件

     库文件分为 静态库 是和 动态库(共享库):

            静态库(Linux上为 .a     Window上为 .lib  )

                 1.是中间文件的集合,在链接阶段直接将库中的内容合并到最终的可执行文件中,就是说,链接完成后,生成的可执行文                           件的执行不再依赖静态库

                  2.静态库生成的命令:           gcc   -c   *.c  (先将.c文件生成对应的.o文件)

                                                              ar  crv  libxxxx.a   *.o          (其中xxxx是生成的库名,前面的 lib和后面的 .a必须有 ) 

                  3.静态库的使用:

                                     第一种:          gcc  -o  run   main.c   -L(库路径)  -l(库名)

                                              例如:     gcc   -o  run  main.c   -L/home/stu/lib   -lList

                                     第二种:          gcc  -o  run   main.c   路径/libxxxx.a

                                               例如:    gcc  -o  run   main.c   /home/stu/lib/libList.a

 

            动态库(Linux上为 .so     Window上为 .dll  )

                   1.动态库是 不可单独执行的可执行文件,链接阶段只在可执行文件中设置使用的的库,运行时由操作系统加载到内存上                       执行,因此生成的可执行文件在执行时要依赖动态库的存在

                   2.动态库生成的命令:

                                    gcc  -shared  -fPIC  -o  libxxxx.so    *.c

                   3.动态库的使用: 同静态库一样

                   4.当链接完成后执行时会有问题,问题出现的原因是: 动态库需要由操作系统加载到内存上,但我们自己写的库操作系统                       找不到,因此依赖动态库而的程序不能直接运行,会出错!  解决这个问题有以下两种方案:

                            <1>将动态库拷贝到 /lib 或 /usr/lib 目录下,但是这个操作需要 root 权限,不建议这么做

                            <2>设置环境变量        export   LD_LIBRARY_PATH=动态库所在的绝对路径

                                  但是这么做只在本bash内有效,为了一劳永逸,做以下这个操作:

                                             vi   /home/.bashrc        //进入到.bashrc这个配置文件中

                                             然后在文件的最后加上一句    export   LD_LIBRARY_PATH=动态库所在的绝对路径

                   5.       lddd     run    //查看可执行文件run中所加载的动态库

 

 

 

 

           

                                   

             

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值