mysql支援通過動態庫檔案擴充套件資料庫的功能,開發範例可參考官網上的介紹: ,除錯的時候一開始考慮在c的主函式中對函式進行呼叫,生成可執行檔案,執行檔案檢視結果;但在除錯通過後並部署到mysql的server上的時候,卻出現了很多的段錯誤,因為實際執行環境不一樣了,折騰了好久,在此總結一下除錯此類udf的一種方法
開發工具:visual studio code (c語言)
編譯工具:gcc
編譯環境:red hat enterprise linux server release 6.4 64位
資料庫:mysql 5.6.42 linux
除錯工具:gdb
udf開發可參考:
官方指引:
開發完**後,將*****.c及其引用到的檔案拷貝到伺服器上,執行類似以下命令
gcc -g ***.c -i 鏈結庫/頭檔案目錄 -fpic -shared -o ***.so
隨後將so檔案(windows平台是dll檔案)拷貝到伺服器上mysql安裝目錄的plugin中,登入mysql執行
create function *** returns string soname 『***.so』;即可建立函式
建立函式之後可直接select ***(『引數』);的方式進行測試,但如果**有問題,此時資料庫可能會直接掛掉並斷開連線,檢視err日誌檔案只能看到一些位址的資訊,並顯示指標錯誤之類的資訊,但無法準確定位到出問題的**,此時可利用gdb進行除錯;
mysql的說明文件上有對於系統crash的debug指引:具體步驟:
關閉正在執行的mysql
在gdb中啟動mysql,輸入gdb --args /usr/sbin/mysqld (mysqld的路徑可以通過which mysqld查詢)
輸入 r --user=root讓mysql執行起來
另外開啟乙個視窗,登入到mysql,建立函式並呼叫函式,此時在之前gdb的視窗就能實時列印出執行的資訊,如果發生了報錯也會將詳細資訊列印,並可用backtrace向前追溯,這樣就能定位具體出錯的**了
另外,在**裡面的printf語句此時也能輸出到視窗中,可以檢視變數的值。gdb除錯方法指引:
工具的熟悉太重要,不會使用工具只會將時間浪費在沒有效率的嘗試上面。mysql udf功能雖然強大,但使用起來必須謹慎,如果出現指標的錯誤,容易導致資料庫的crash,具體經驗:
linux下 udf提權 mysql udf提權
前言 udf user defined function 即 使用者自定義函式 檔案字尾為 dll 常用c語言編寫。通過在udf檔案中定義新函式,對mysql的功能進行擴充,可以執行系統任意命令。將mysql賬號root轉化為系統system許可權。思路 1.將udf檔案上傳到指定位置 sqlmap...
Linux多執行緒 pthread exit函式
執行緒的終止可以呼叫pthread exit函式來結束。也就是說,乙個執行緒可以隱式的退出,也可以顯式的呼叫pthread exit函式來退出。pthread exit函式唯一的引數value ptr是函式的返回 include void pthread exit void retval threa...
Linux系統wait 和waitpid 函式
include include pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序,wait就會收集這個子程序的資訊,並把它徹底銷毀後返回 如果沒有找到這樣乙個子程序,wa...