環境:
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
六、使用符號文件進行調試:
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