Linux gdb如何在動態庫函式裡面設定斷點

2021-08-21 17:14:42 字數 1430 閱讀 5102

一、材料準備:

1、標頭檔案:function.h

2、.c檔案: function.c  main.c

function.h: 乙個簡單的標頭檔案,宣告了函式func_a(),func_b()

#ifndef function_h

#define function_h

#include void func_a();

void func_b();

#endif

function.c: func_a(), func_b()的實現

#include "function.h"

void func_a()

void func_b()

main.c: 主函式呼叫func_a(), func_b()

#include "function.h"

int main(int argc, char *argv)

二、將function.c編譯成乙個動態鏈結庫

此時當前目錄下面會生成libfunc.so檔案

三、編譯main.c檔案

敲命令:gcc -o main main.c -g -lfunc -l ./  // 這裡新增引數 -g

e.g 這裡小小的說明一下,程式編譯預設動態庫搜尋路徑是/lib、/usr/lib,這裡如果不用 -l引數(搜尋非標準的庫和標頭檔案的路徑)是無法編譯成功的

四、gdb除錯

敲命令: gdb main

按照我的習慣,在gdb裡面設定斷點,我喜歡用 b filename:line 的形式(如 b main.c:5),但此時只能顯示非動態庫裡面的函式檔案,動態庫里只顯示函式原型,試了一下用 函式原型:行號的方式設定斷點,不好用。

正確的解決方法:

在編譯動態鏈結庫的時候新增 -g引數

gcc -c function.c -fpic -g --share -o libfunc.so

gcc -o main main.c -g -lfunc -l ./

此時用gdb斷點就可以顯示動態庫裡面的檔案了,在這裡是function.c,就可以用 filename:line 的方式設定斷點

最後在囉嗦一句,如果想檢查動態庫編譯的時候有沒有打上-g 引數有乙個好辦法:

敲命令:gdb libname.so 指對應庫的名字

如果提示資訊顯示 reading symbols from libname.so ... done,表示編譯的時候有帶-g引數,反之則沒有

linuxGDB下動態鏈結庫的除錯

gdb file 你的exe gdb load 你的so 這條應該是可選的 gdb dir gdb sharedlibrary 你的so gdb breakpoint 你的so中somewhere gdb run load 是將動態庫加載入記憶體。sharedlibrary是將動態庫的符號讀入gdb...

如何在資料庫動態建表

動態建表首先需要了解statement類 statement 物件用 connection 的方法createstatement 建立,例如 建立連線物件 connection connection dbutil.getconnection 建立statement物件 statement state...

如何在存在動態版本的庫時使用靜態版本的庫

當系統存在動態版本的庫時,如何直接鏈結靜態版本的庫 通常,聯結器會遍歷目錄去尋找動態版本的庫如果沒找到,在每乙個目錄下查詢靜態版本的相同的庫。顯示的判斷使用哪乙個版本的庫時通過設定查詢路徑。在命令列中使用 l連線選項,隨後時查詢的目錄路徑。在xcode中的設定是使用library search pa...