使用objcopy和gdb迁移符号文件
摘要
我们日常工作中往往会遇到使用商业软件过程中出现一些异常crash掉或core dump之类的问题,此时可能需要在客户方调试问题,但往往客户方使用的release版本没有相关的debug信息,这时可能需要开发方提供对应版本的符号文件以便进行调试,下面介绍如何将对应版本的符号文件导出给客户方,以及客户方如何导入符号文件进行调试(前提是开发方需要确认代码安全级别,客户方需要具备一定的技术能力)。
step 1 确认版本
是双方沟通版本的过程,如果程序友好的话,获取版本信息时处理拿到基本的版本信息外,还可以给出具体提交的版本号(如,git,svn等的提交信息)。
step 2 导出符号文件
开发方根据详细版本号提供对应的符号文件,如果已保留对应版本的.symbol文件可直接提供,否则需要重新编译debug版本并导出符号文件(releese版本也可以进行符号文件分离)。
这里已openGauss的debug版为例,进行符号文件导出。
[root@host-10-208-4-190 gausskernel]# objcopy --only-keep-debug gaussdb gaussdb.symbol
[root@host-10-208-4-190 gausskernel]# ll -rt
total 856M
-rwxr-xr-x 1 root root 26K May 18 20:05 Makefile_for_llt
-rwxr-xr-x 1 root root 41K May 18 20:05 Makefile
-rwxr-xr-x 1 root root 18K May 18 20:05 CMakeLists.txt
-rw-r--r-- 1 root root 1.5K May 18 20:05 common.mk
-rw-r--r-- 1 root root 715 May 18 20:05 nls.mk
drwxr-xr-x 2 root root 4.0K May 18 23:17 bootstrap
drwxr-xr-x 6 root root 4.0K May 18 23:18 security
drwxr-xr-x 7 root root 4.0K May 18 23:19 dbmind
drwxr-xr-x 10 root root 4.0K May 18 23:19 process
drwxr-xr-x 9 root root 4.0K May 18 23:19 cbb
drwxr-xr-x 10 root root 4.0K May 18 23:20 optimizer
drwxr-xr-x 6 root root 4.0K May 18 23:21 runtime
drwxr-xr-x 24 root root 4.0K May 18 23:21 storage
-rw-r--r-- 1 root root 60K May 18 23:22 objfiles.txt
-rwxr-xr-x 1 root root 497M May 18 23:22 gaussdb
-rwxr-xr-x 1 root root 360M May 18 23:29 gaussdb.symbol
可以开到,debug编译后gaussdb文件大小为497M,导出符号文件大小为360M。
Step 3 导入符号文件
客户方使用gdb方式导入符号文件,即通过gdb -s
在调试时导入符号文件。
为例验证可以先去掉gaussdb中的符号信息,使用strip
命令。
[root@host-10-208-4-190 gausskernel]# strip gaussdb
[root@host-10-208-4-190 gausskernel]# ll -rt
total 497M
-rwxr-xr-x 1 root root 26K May 18 20:05 Makefile_for_llt
-rwxr-xr-x 1 root root 41K May 18 20:05 Makefile
-rwxr-xr-x 1 root root 18K May 18 20:05 CMakeLists.txt
-rw-r--r-- 1 root root 1.5K May 18 20:05 common.mk
-rw-r--r-- 1 root root 715 May 18 20:05 nls.mk
drwxr-xr-x 2 root root 4.0K May 18 23:17 bootstrap
drwxr-xr-x 6 root root 4.0K May 18 23:18 security
drwxr-xr-x 7 root root 4.0K May 18 23:19 dbmind
drwxr-xr-x 10 root root 4.0K May 18 23:19 process
drwxr-xr-x 9 root root 4.0K May 18 23:19 cbb
drwxr-xr-x 10 root root 4.0K May 18 23:20 optimizer
drwxr-xr-x 6 root root 4.0K May 18 23:21 runtime
drwxr-xr-x 24 root root 4.0K May 18 23:21 storage
-rw-r--r-- 1 root root 60K May 18 23:22 objfiles.txt
-rwxr-xr-x 1 root root 360M May 18 23:29 gaussdb.symbol
-rwxr-xr-x 1 root root 138M May 18 23:30 gaussdb
使用strip命令后gaussdb的大小变为138M,导出前是497M约等于(没有符号信息的bin文件大小+符号文件大小)即:138+360=498M
导入方式
# 调试进程
$ gdb ./gaussdb -s gaussdb.symbol
# 调试core文件
$ gdb ./gaussdb core.xxxxx -s gaussdb.symbol