使用GDB调试将符号表与程序分离后的可执行文件

环境:

  Centos7.3、GCC4.8.5

适用场景:

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

一、创建可执行程序:

  use_library.cpp

#include <iostream>
#include "use_library.h"

int main()
{
    int res = my_library(1, 2);
    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 = 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

六、使用符号文件进行调试:

gdb -c core.xxx ./use_library

  由于core文件生成时使用的依赖库目录与调试目录可能不一致,我们可以设置依赖库

  首先查看依赖库

   将libmy_library.so和libmy_library.so.debug放在当前目录下(/home/share/use_library/cmake),并设置set solib-search-path路径

  关于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

  需要注意的是.debug文件需要与可执行文件或动态库在相同目录下,若还是不能调试,可能是没有关联调试文件,可以通过"objdump -s -j .gnu_debuglink xxx"命令查看关联信息。

猜你喜欢

转载自www.cnblogs.com/dongc/p/9690754.html