gdb调试没有符号表被读取_使用GDB调试将符号表与程序分离后的可执行文件

本文介绍了如何在Centos7.3环境下,通过GCC4.8.5构建可执行程序和分离的符号信息文件。当程序产生core文件后,详细讲解了如何配置GDB进行调试,包括设置依赖库搜索路径、加载可执行文件和显示调用堆栈,确保调试过程中正确关联到符号表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:

Centos7.3、GCC4.8.5

适用场景:

由于调试信息比较大,通常将程序分离为可执行程序和符号信息文件,只对外发布可执行程序,需要调试时再将符号信息文件附加。

一、创建可执行程序:

use_library.cpp

#include #include"use_library.h"

intmain()

{int res = my_library(1, 2);

std::cout<< "my_library:" << res <<: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 #include"my_library.h"

int my_library(int a, intb)

{int *p =NULL;*p = 100;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"命令查看关联信息。

显示动态库符号加载信息infosharedlibrary

设置动态库加载路径

set solib-search-path

参考资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值