使用GDB調試將符號表與程序分離後的可執行文件

環境:

  Centos7.三、GCC4.8.5html

適用場景:

  因爲調試信息比較大,一般將程序分離爲可執行程序和符號信息文件,只對外發布可執行程序,須要調試時再將符號信息文件附加。ios

1、建立可執行程序:

  use_library.cppui

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

int main()
{
    int res = my_library(1, 2);
    std::cout << "my_library:" << res << std::endl;
}

  CMakeLists.txtspa

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)

2、建立動態庫:

  my_library.h.net

int my_library(int a, int b);

  my_library.cppdebug

#include <stdlib.h>
#include "my_library.h"

int my_library(int a, int b)
{

    int *p = NULL;
    *p = 100;
    return *p;
}

  這裏咱們故意製造一個異常讓進程崩潰,生成core文件。unix

  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})

3、生成動態庫:

#生成動態庫
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

4、生成可執行程序:

#生成執行程序
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"命令查看關聯信息。code

5、生成core文件:

./use_library

6、使用符號文件進行調試:

  6.1)調試core文件htm

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"命令查看關聯信息。

參考資料:

  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

相關文章
相關標籤/搜索