日期:2013-09-09  浏览次数:20564 次


MySQL UDF的调试方式

MySQL的UDF实质就是一个不需求设置入口点的动态连接库(*Nix称之为共享库)。对于DLL的调试可谓团体有个法。如今我引见一下一个非常简单的易用的调试方法。这一方法直接利用Windows API,言语无关、开发工具无关、项目类型无关,典型的三无调试方法。并且,我们从这里讨论的调试方法支持近程调试,对于一时无法掌握开发工具本来调试器而又急于寻觅程序错误的朋友此方法非常实用!

首先我们需求下载接收端,当然有心人也可以本人写一个。在 http://www.sysinternals.com/ntw2k/freeware/debugview.shtml 。透过debugview手册我们可以知道这个工具支持win9x/nt系列,并且支持内核调试!由于其调用的API均只能接收一个char * 类型参数,所以有些时候我们需求利用其他的函数无机组合产生人性可读提示。

为了减少复杂程度简单的以来自 http://delphi.ktop.com.tw/topic.asp?TOPIC_ID=35166 讨论为例,讲解我是如何利用这里工具进行调试的。

1 简单输出一行信息,在调试开始时输出一条简单的信息便于我们了解debug到什么地方了。
在程序代码中依据需求加入下边一行
OutputDebugStringA("--UDF:my_name()被调用");
这样一来我就知道我定义的my_name被客户用到了,接着我要关怀前往值如何。

2 输出前往值
输出前往值方法很多,可以自在组合。自在组合的最终目的是将一个无效的 char * 类型参数传递给WiNDOWS API。这里简单的以C言语字符控制函数为例。

例子:

#include <stdio.h>  /* 函数- sprintf */
#include <windows.h> /* 挂接windows api */
/* ...........省略   */
char* __stdcall my_name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
{
OutputDebugStringA("--UDF:my_name()被调用"); /* 调用了?*/
char *me = "my name";

/*---- debuger start----*/
        char debugermsg[256]={0};
        sprintf(debugermsg, "%s", me);
        OutputDebugStringA(debugermsg);
        /*---- debuger end----*/

 return me;
}

当在程序中加入了类似代码那么调试就可以开始了,利用这种方式即便不使用"debuger"方式编译仍然可以得到所需的调试信息。

接收调试信息

接收调试信息只需打开debugview程序即可,程序主窗口可以实时前往所需求的调试信息。

其它平台请自行查阅手册获得对应的api,利用这种方式调试方法适当并不会形成任何困扰。