MySQL 使用者定義函數(UDF)本質是無需指定進入點的動態連結庫(Windows 為 DLL,Linux 為 .so)。傳統除錯需依賴 IDE 斷點,配置繁瑣且難以應對遠端生產環境。本文介紹一種 「三無除錯法」:語言無關、工具無關、專案類型無關,且支援遠程除錯,極適合無法使用原生除錯器的緊急排錯場景。
char* 參數,需自行組合可讀訊息#include <stdio.h> /* sprintf */
#include <windows.h> /* OutputDebugStringA */
char* __stdcall my_name(UDF_INIT *initid, UDF_ARGS *args,
char *is_null, char *error) {
/* 1. 標記函數被呼叫 */
OutputDebugStringA("--UDF:my_name() 被呼叫");
char *me = "my name";
/* 2. 輸出回傳值內容 */
char debugermsg[256] = {0};
sprintf(debugermsg, "Return: %s", me);
OutputDebugStringA(debugermsg);
return me;
}
關鍵點:即使以 Release 模式編譯,只要載入 DebugView 即可即時捕獲輸出,無需重新編譯除錯版本。
OutputDebugStringA 送出的字串。Linux/Unix 環境可查閱 syslog、strace 或自行實作共享記憶體/管道機制,原理相通:將除錯訊息導向可被外部工具讀取的通道。