我们在利用gdb调试时通常需要符号表才可以方便地打断点、查看详细变量、位置信息。为了获取对应的可执行文件/动态库的符号表,我们在编译时必须加上-g参数生成对应的符号信息。

通常,我们有两种方式获取对应的符号。下面以实例进行说明。

main.c文件:

     1  #include <stdio.h>2  #include <stdlib.h>3  #include <unistd.h>45  #include "SendMessage.h"67  void CreateMem(void)8  {9          int *piData = NULL;1011          piData = malloc(9 * sizeof(int));1213          printf("CreateMme piData:%p\n", piData);1415          piData[9] = 0x10;1617          return;18  }1920  int main(void)21  {22          CreateMem();2324          StartSendMessage();2526          while (1)27          {28                  sleep(50);29          }3031          return 0;32  }

main.c调用了SendMessage.c文件,如下:

     1  #include <stdio.h>2  #include <stdlib.h>34  void StartSendMessage(void)5  {6          int a = 1;7          int b = 3;89          printf("Start send message---%d.\n", a + b);1011          return;12  }

一、分离独立符号表方法

1. 首先将SendMessage.c编译成带符号信息的动态库libSendMessage.so

gcc -o libSendMessage.so -fPIC -shared -g SendMessage.c

2. 利用objcopy命令从带符号信息的动态库libSendMessage.so中分理出单独的符号表libSendMessage.so.debug

objcopy --only-keep-debug libSendMessage.so libSendMessage.so.debug

在当前进程执行目录下创建.debug文件夹。将符号表libSendMessage.so.debug挪到.debug文件夹下。

注意,符号表可以放在三个路径下,(假设当前进程执行路径为/home/TestDemon)

  • /home/TestDemon,即进程的执行路径
  • /home/TestDemon/.debug/,即进程执行路径下的.debug文件夹
  • /usr/lib/debug/home/TestDemon,即通用查找符号表路径/usr/loacal/debug下的和进程执行路径的同名路径下。

gdb也是按照上面顺序依次查找符号表文件,因此我们可以把我们的符号表libSendMessage.so.debug文件放在其中任何一个。

另外在gdb调试过程中我们可以直接通过设置debug-file-directory变量值来设置符号表查找路径。命令如下;(假设我们把符号表放在了/home/TestDemon/symbol路径下)

set debug-file-directory /home/TestDemon/symbol

3. 利用strip命令剔除libSendMessage.so的符号信息生成不带符号的动态库libSendMessage_strip.so

strip libSendMessage.so -o libSendMessage_strip.so

4. 建立调试信息符号表和不带符号信息动态库之间的链接

objcopy --add-gnu-debuglink=./.debug/libSendMessage.so.debug libSendMessage_strip.so

5. 查看是否链接成功

objdump -s -j .gnu_debuglink libSendMessage_strip.so

6. 利用不带符号信息的动态库生成最终的可执行文件

gcc -o test main.c -L ./ -lSendMessage_strip -Wl,-rpath=./

7. 启动gdb进行调试

显示栈回溯、单步调试、展示函数、显示局部变量值等均正常。

从上可知,符号表可正常读取。

二、未strip动态库符号表

我们也可以直接利用没有strip的动态库当做符号表使用。

1. 编译SendMessage.c生成带符号的动态库libSendMessage.so。

2. 利用strip剥离libSendMessage.so生成不带符号的动态库libSendMessage_strip.so。

3. 编译main.c生成最终的可执行程序test

gcc -o test main.c -L ./ -lSendMessage_strip -Wl,-rpath=/home/TestDemon/

注意:为了后面方便构建符号表路径,-rpath尽量使用绝对路径。

4. 利用ldd查看test依赖的动态库及对应的路径

 从上面可知,test依赖的动态库libSendMessage_strip.so链接的路径为/home/TestDemon/下,因此我们下一步构造符号表时libSendMessage.so务必保存在对应的home/TestDemon路径下。

5. 利用未strip的动态库构造符号表

为了创建一致的路径,在当前路径下递归创建目录home/TestDemon。将未strip的动态库libSendMessage.so拷贝到home/TestDemon下,并改名为libSendMessage_strip.so。

 6. 启动gdb调试

利用set solib-absolute-prefix设置系统的根目录,这样后面其他绝对路径下的动态库符号文件的查找即基于该目录查找。

 可以正常显示栈回溯、单独调试、展示局部变量值等。

从上面可知,上述符号表可正常使用。

linux获取符号表调试相关推荐

  1. Linux内核符号表

    一,什么是符号(Symbols)?     什么是Symbol?  其实就是kernel中的变量(Variable Name)或函数名称(Function Name),     这样可以方便程序员在写 ...

  2. GCC 生成的符号表调试信息剖析

    GCC把C语言源文件('.c')编译成汇编语言文件('.s'),汇编器把汇编语言文件翻译成目标文件('.o'),最后由链接器链接所有的目标文件和有关的库生成可执行文件('a.out'). 如打开'-g ...

  3. linux c 符号表,C中的符号表

    我目前正在开发一种执行模式匹配的静态分析工具.我正在使用Flex生成词法分析器,我编写了代码来管理符号表.我对C不太熟悉,所以我决定将符号表实现为线性链表. #include #include #in ...

  4. 深度linux 内核符号表,linux 内核符号表

    linux: 偏旁符号 偏旁部首名称表 偏旁部首怎么打,缺失:linux内核表3345/9 偏旁部首大全 部首笔画数 1 划: 亅 乛 一 乙 乚 丶 部首笔画数 2 划: 二 十 八 讠 刂 力 儿 ...

  5. linux signal 符号表6,gdb调试信息__000_linux-gnu_00000000_002_rw-p__169IT.COM

    很少使用gdb调试,现在用了,又不知道是什么意思,求大侠指教 *** glibc detected *** /home/hhbgk/url/url: free(): invalid next size ...

  6. linux signal 符号表,铁路信号图形符号

    铁路信号图形符号: 一些图形形状符号前缀~~(>_<)~~~~.feel ㄨ.XXX,缺失:铁路信号图形符号13398/9 以下是的一些我们精选的一些图形形状符号前缀~~(>_< ...

  7. 逆向 - 恢复符号表

    获取符号表偏移前的地址 当App准备上线打生产环境的包时,编译器去掉符号表信息:所以在iOS逆向调试的时候,lldb调试中查看代码的函数调用栈时符号偏移前的地址 = 符号偏移后的地址(lldb断点地址 ...

  8. 数据结构链表之符号表,Python3实现——8

    数据结构链表之符号表 符号表的介绍 之前章节介绍的顺序表和链表都是一个节点储存一个元素的表,但在日常生活中我们还有很多一次需要储存成对或多个值的情况,例如: 符号表最主要的目的将一对元素,用一个键和一 ...

  9. Linux环境Release版本的符号表剥离及调试方法

    Linux环境Release版本符号表剥离及调试方法 目录 Linux环境Release版本符号表剥离及调试方法 前言 1 Release版本剥离符号表 1.1 编译时,进行so库调试信息的剥离 1. ...

最新文章

  1. 2021年9月最新的保姆级计算机视觉学习路线
  2. 如何在网站上同步查看BCH数据
  3. 滑动返回类库SwipeBackLayout的使用问题,解决返回黑屏,和看到桌面
  4. (回文串)Manacher算法
  5. 程序员如何跟领导提离职_如何优雅地跟老板提加薪?按照这3个步骤来,也不是什么难事...
  6. Vue2的核心原理剖析
  7. 实现一个基于 IConfiguration 的低配版 FeatureFlag
  8. [Silverlight]奇技银巧系列-2
  9. 毕业设计-人脸表情识别系统、人工智能
  10. css3过渡缓慢排过去,css3过渡
  11. 【FFMPEG系列】之工具调试:gprof性能分析
  12. oracle中master实例,oracle数据库加密--wallet 实例
  13. 软件测试视频教程下载:APP测试类型和方法
  14. iec611313标准下载_IEC 60249-1-1982(R1993)
  15. 无缝拼接屏是怎样实现的?有什么特点!
  16. Unity3d之贴图融合
  17. windows server 2003 IE升级方法
  18. wordpress插件_WordPress插件可成功进行内容营销
  19. 22.实战:Kaggle房价预测
  20. 图解 SQL 基础知识

热门文章

  1. java中调用js_java编程中实现调用js方法分析
  2. 删除顽固的dll文件的方法之一
  3. 南京大学计算机科学与技术系公开课,讲座 南京大学计算机科学与技术系.ppt
  4. python数据可视化pandas_python 抓取数据,pandas进行数据分析并可视化展示
  5. GitHub云扫描器
  6. 围观量化工具26日的盈利情况,赚钱就要顺势而为
  7. Consul的介绍和基本使用
  8. RecastDetour中A*算法的应用
  9. 虚拟现实与增强现实融合创新的未来之路
  10. LiveNVR视频流媒体平台支持接收rtsp推流并转换成GB28181输出级联到第三方国标平台服务