使用GDB调试将符号表与程序分离后的可执行文件
环境:
Centos7.3、GCC4.8.5
适用场景:
由于调试信息比较大,通常将程序分离为可执行程序和符号信息文件,只对外发布可执行程序,需要调试时再将符号信息文件附加。
一、创建可执行程序:
use_library.cpp
#include <iostream>
#include "use_library.h" int main()
{
int res = my_library(, );
std::cout << "my_library:" << res << std::endl;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.8) project(use_libray) include_directories(/root/my_library)
link_directories(/root/my_library/cmake) aux_source_directory(. DIR_SRCS) add_executable(use_library ${DIR_SRCS})
target_link_libraries(use_library my_library)
二、创建动态库:
my_library.h
int my_library(int a, int b);
my_library.cpp
#include <stdlib.h>
#include "my_library.h" int my_library(int a, int b)
{ int *p = NULL;
*p = ;
return *p;
}
这里我们故意制造一个异常让进程崩溃,生成core文件。
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(my_library)
include_directories(/root/use_library/)
aux_source_directory(. DIR_SRCS)
add_library(my_library SHARED ${DIR_SRCS})
三、生成动态库:
#生成动态库
mkdir /home/share/my_library/cmake
cd /home/share/my_library/cmake
cmake -D CMAKE_BUILD_TYPE=Debug ..
make #生成符号文件
objcopy --only-keep-debug libmy_library.so libmy_library.so.debug #生成发布文件
strip libmy_library.so -o libmy_library.so.release
objcopy --add-gnu-debuglink=libmy_library.so.debug libmy_library.so.release
cp libmy_library.so.release libmy_library.so
四、生成可执行程序:
#生成执行程序
mkdir /home/share/use_library/cmake
cd /home/share/use_library/cmake
cmake -D CMAKE_BUILD_TYPE=Debug .. #生成符号文件
objcopy --only-keep-debug use_library use_library.debug #生成发布文件
strip use_library -o use_library.release
objcopy --add-gnu-debuglink=use_library.debug use_library.release
cp use_library.release use_library
可以通过"objdump -s -j .gnu_debuglink xxx"命令查看关联信息。
五、生成core文件:
./use_library
六、使用符号文件进行调试:
6.1)调试core文件
gdb -c core.xxx
注意不能使用gdb -c core.xxx ./use_library,由于core文件生成时使用的依赖库目录与调试目录可能不一致,如果直接加载可执行文件,会根据core文件生成时可执行文件依赖的路径,加载动态库和符号文件 。
6.2)我们可以设置依赖库,首先查看依赖库

将libmy_library.so和libmy_library.so.debug放在当前目录下(./home/share/my_library/cmake),并设置set solib-search-path路径
注意动态库的路径前缀一定要一致,示例中的绝对路径为:/home/share/use_library/cmake/home/share/my_library/cmake

关于GDB调试时,依赖库搜索路径规则为:
1)使用solib-absolute-prefix进行搜索
2)使用solib-search-path进行搜索
3)使用$PATH进行搜索
4)使用$LD_LIBRARY_PATH进行搜索
按上面说的规则举例说明:
1)(solib-absolute-prefix)/home/share/my_library/cmake/libmy_library.so
2)(solib-search-path)/libmy_library.so
3)($PATH)/(solib-absolute-prefix)/home/share/my_library/cmake/libmy_library.so
4)($LD_LIBRARY_PATH)/(solib-absolute-prefix)/home/share/my_library/cmake/libmy_library.so
6.3)加载可执行文件

6.4)显示调用堆栈

结尾:
需要注意的是.debug文件需要与可执行文件或动态库在相同目录下,若还是不能调试,可能是没有关联调试文件,可以通过"objdump -s -j .gnu_debuglink xxx"命令查看关联信息。
显示动态库符号加载信息
info sharedlibrary
设置动态库加载路径
set solib-search-path
参考资料:
1)http://blog.chinaunix.net/uid-13746440-id-5578584.html
2)https://www.jb51.net/article/136097.htm
3)https://blog.csdn.net/_xiao/article/details/23289971
4)https://blog.csdn.net/bingqingsuimeng/article/details/50522242
5)https://blog.csdn.net/someonea/article/details/3202409
6)https://blog.csdn.net/dong_007_007/article/details/49247725
7)https://blog.csdn.net/huohongpeng/article/details/54575675
8)https://blog.csdn.net/u012719556/article/details/45315089
使用GDB调试将符号表与程序分离后的可执行文件的更多相关文章
- GDB如何调试没有符号表(未加-g选项的编译)的程序
/********************************************************************* * Author : Samson * Date ...
- 用GDB 调试Java程序
陈皓 http://blog.csdn.net/haoel 背景 想要使用GDB调试程序,就需要用GNU的编译器编译程序.如:用GCC编译的C/C++的程序,才能用GDB调试.对于Java程序也是 ...
- 比较全面的gdb调试命令 (转载)
转自http://blog.csdn.net/dadalan/article/details/3758025 用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形 ...
- GDB 调试解析
GDB(GNU Debugger)是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序 列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优 ...
- Linux基础(03)gdb调试
1. 安装GDB增强工具 (gef) * GDB的版本大于7.7 * wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.s ...
- GDB调试命令手册
使用GDB 启动 $ gdb program # program是你的可执行文件,一般在当前目录 $ gdb program core # gdb同时调试运行程序和cor ...
- c++的符号表的肤浅认识
符号表是编译期产生的一个hash列表,随着可执行文件在一起 示例程序 int a = 10; int b; void foo(){ static int c=100; } int main(){ in ...
- VxWorks 符号表
符号表初始化 符号表用于建立符号名称.类型和值之间的关系.其中,名称为null结尾的任意字符串:类型为标识各种符号的整数:值为一个字符指针.符号表主要用来作为目标模块加载的基础,但 ...
- 经典的GDB调试命令
在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据.print命令的格式是: printprint /是表达式,是你所调试的程 ...
随机推荐
- dsp 28335 ConfigCpuTimer()详细介绍
我自己的理解:写的不一定对,还请多指教: 从网上看到的好多都是复制粘贴的一个版本,感觉不太对 图上的是系统时钟(SYSCLKOUT)=75MHz; ConfigCpuTimer(&CpuTim ...
- putty导出、导入数据库
e.g 从223服务器导数据库的t_marine_area到227服务器 用putty连接223服务器 导出数据库命令:pg_dump -h localhost -U postgres -d mari ...
- 机器学习环境搭建-Pycharm
刚刚开始学习机器学习,遇到了很多的问题,尤其是搭建环境让我觉得脑袋特别疼.我用的是win8 64位操作系统,硬盘小的可怜.开始我也跟着下载了anaconda,后来发现anaconda一点儿不像说的那么 ...
- 对yolo与fasterrcnn anchors的理解
yolo: 通过聚类产生5个不同比例的anchors.最后一个特征层的输出(x,y,w,h)与这些不同比列的相乘,将网络层的输出转化为bbox(小尺寸),再通过(H,W)还原成原图大小.一共有5个bb ...
- 关于MySQL5.7开启bin-log主从复制
主从复制:一般用于实时备份.也可配合mycat,实现读写分离. 传统的基于 ROW的主从复制 简单说下步骤: master主库配置同步,slave从库配置同步,master锁表/备份,slave恢复数 ...
- Delphi编程之爬取贴吧帖子图片
大家如果经常在逛贴吧的时候,会看到很多帖子里有很多好看的图片,都想下载下来留存的话,常规的方法只能一张一张点击右键,然后图片另存为,这样的方法对于图片少的来说没什么,要是图片超过100张,200张,那 ...
- python小白的自述
python语言作为目前受用面比较广泛的一种语言,具有简单易学,功能强大的特点.初次接触python完全是由于好奇心,正是因为python的出现,才让我觉得编程不是那么的神秘了.不过作为一个编程小白来 ...
- 2018-软工机试-C-和你在一起
C. 和你在一起 单点时限: 1.0 sec 内存限制: 256 MB 我想和你在一起 直到我不爱你 宝贝 人和人 一场游戏 我愿意为你死去 如果我还爱你 宝贝 反正活着 也没意义 宝贝 我也只能 这 ...
- DAY1_PYTHON基础作业
''' print("1.使用while循环输入 1 2 3 4 5 6 8 9 10") count = 1 while count < 11: print(count) ...
- 06_mysql先分页查询再排序
数据库字段: SELECT * FROM (SELECT * FROM tb_item LIMIT 3,3) temp_table ORDER BY id DESC; 查询结果: