Error[8]: Undefined offset: 8, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述我正在尝试在 Linux中为firebird创建一些简单的UDF(在使用GCC编译的C中). 问题是,当我将“返回机制”设置为“通过引用”时,当我调用该函数时,服务器崩溃. 当它是“按价值”时,没有问题. 以下是我尝试用C编写的函数: 这个工作: double round(double *); double round(val)double *val;{ *val = *val * 我正在尝试在 Linux中为firebird创建一些简单的UDF(在使用GCC编译的C中).
问题是,当我将“返回机制”设置为“通过引用”时,当我调用该函数时,服务器崩溃.
当它是“按价值”时,没有问题.

以下是我尝试用C编写的函数:

这个工作:

double round(double *); double round(val)double *val;{    *val = *val * 100;    *val = (*val>= 0) ? (long)(*val + 0.5) : (long)(*val - 0.5);    *val = *val / 100;    return *val;}

但是这个在调用时会崩溃服务器:

char * proper_case(str)char * str;{    return str;}

这是DDL:

DECLARE EXTERNAL FUNCTION "ROUND"    DOUBLE PRECISIONRETURNS DOUBLE PRECISION BY VALUEENTRY_POINT 'round' MODulE_name 'my_udfs.so';DECLARE EXTERNAL FUNCTION PROPCASE    CSTRING(10000)RETURNS CSTRING(10000) FREE_ITENTRY_POINT 'proper_case' MODulE_name 'my_udfs.so';

我用第二个函数调用:

select propcase('abrakadabra') from rdb$database;

firebird服务器崩溃,我得到的唯一错误信息是:

Statement Failed,sqlSTATE = -902Error reading data from the connection.

有人可以建议吗?任何帮助将不胜感激!

我忘记提供的唯一信息是我正在编译.so文件的方式(可能是关键在这里):

gcc -c -O -fpic my_udf.cld -G my_udf.o -lm -lc -o my_udf.socp my_udf.so /usr/lib/firebird/2.1/UDF/my_udfs.so
@H_404_52@解决方法 AFAIK,Firebird会在调用后尝试释放参数和返回值(因为它不知道你在函数内部做了什么,并且你已经将返回值声明为FREE_IT),所以你需要为返回值分配空间在回来之前.你必须用ib_util_malloc()调用来分配内存,所以它看起来像(甚至没有尝试编译它,但它应该给你一般的想法):

char * proper_case(str)char * str;{    char* ret = (char*)ib_util_malloc(strlen(str) + 1);    strcpy(ret,str); // or run the actual logic here    return ret;}

编辑:我在UDF lib中构建的Firebird中找到了一个示例:

pChar EXPORT IB_UDF_lower(const char *s){if (!s) return 0;char* buf = (char *) ib_util_malloc(strlen(s) + 1);char* p = buf;while (*s) {    if (*s >= 'A' && *s <= 'Z') {        *p++ = *s++ - 'A' + 'a';    }    else        *p++ = *s++;}*p = '[+++]';return buf;}
总结

以上是内存溢出为你收集整理的Linux中的Firebird UDF在设置为按引用返回时会崩溃服务器全部内容,希望文章能够帮你解决Linux中的Firebird UDF在设置为按引用返回时会崩溃服务器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Linux中的Firebird UDF在设置为按引用返回时会崩溃服务器_系统运维_内存溢出

Linux中的Firebird UDF在设置为按引用返回时会崩溃服务器

Linux中的Firebird UDF在设置为按引用返回时会崩溃服务器,第1张

概述我正在尝试在 Linux中为firebird创建一些简单的UDF(在使用GCC编译的C中). 问题是,当我将“返回机制”设置为“通过引用”时,当我调用该函数时,服务器崩溃. 当它是“按价值”时,没有问题. 以下是我尝试用C编写的函数: 这个工作: double round(double *); double round(val)double *val;{ *val = *val * 我正在尝试在 Linux中为firebird创建一些简单的UDF(在使用GCC编译的C中).
问题是,当我将“返回机制”设置为“通过引用”时,当我调用该函数时,服务器崩溃.
当它是“按价值”时,没有问题.

以下是我尝试用C编写的函数:

这个工作:

double round(double *); double round(val)double *val;{    *val = *val * 100;    *val = (*val>= 0) ? (long)(*val + 0.5) : (long)(*val - 0.5);    *val = *val / 100;    return *val;}

但是这个在调用时会崩溃服务器:

char * proper_case(str)char * str;{    return str;}

这是DDL:

DECLARE EXTERNAL FUNCTION "ROUND"    DOUBLE PRECISIONRETURNS DOUBLE PRECISION BY VALUEENTRY_POINT 'round' MODulE_name 'my_udfs.so';DECLARE EXTERNAL FUNCTION PROPCASE    CSTRING(10000)RETURNS CSTRING(10000) FREE_ITENTRY_POINT 'proper_case' MODulE_name 'my_udfs.so';

我用第二个函数调用:

select propcase('abrakadabra') from rdb$database;

firebird服务器崩溃,我得到的唯一错误信息是:

Statement Failed,sqlSTATE = -902Error reading data from the connection.

有人可以建议吗?任何帮助将不胜感激!

我忘记提供的唯一信息是我正在编译.so文件的方式(可能是关键在这里):

gcc -c -O -fpic my_udf.cld -G my_udf.o -lm -lc -o my_udf.socp my_udf.so /usr/lib/firebird/2.1/UDF/my_udfs.so
@H_404_52@解决方法 AFAIK,Firebird会在调用后尝试释放参数和返回值(因为它不知道你在函数内部做了什么,并且你已经将返回值声明为FREE_IT),所以你需要为返回值分配空间在回来之前.你必须用ib_util_malloc()调用来分配内存,所以它看起来像(甚至没有尝试编译它,但它应该给你一般的想法):

char * proper_case(str)char * str;{    char* ret = (char*)ib_util_malloc(strlen(str) + 1);    strcpy(ret,str); // or run the actual logic here    return ret;}

编辑:我在UDF lib中构建的Firebird中找到了一个示例:

pChar EXPORT IB_UDF_lower(const char *s){if (!s) return 0;char* buf = (char *) ib_util_malloc(strlen(s) + 1);char* p = buf;while (*s) {    if (*s >= 'A' && *s <= 'Z') {        *p++ = *s++ - 'A' + 'a';    }    else        *p++ = *s++;}*p = '';return buf;}
总结

以上是内存溢出为你收集整理的Linux中的Firebird UDF在设置为按引用返回时会崩溃服务器全部内容,希望文章能够帮你解决Linux中的Firebird UDF在设置为按引用返回时会崩溃服务器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1032439.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存