在拉网线时,postgres嵌入式sql libecpg.dll中的访问冲突

时间:2016-09-06 09:32:10

标签: c postgresql access-violation embedded-sql

我有一个从postgres客户端(Windows 7)到远程Postgres服务器(Ubuntu)的连接 - Postgres版本9.5。

postgres客户端是一个使用嵌入式sql(libecpg.dll)的c程序。

建立连接后拉网线时,我得到:

  

0x1000bca0中的未处理异常... exe:0xC0000005:访问冲突读取位置0x00000000

在调试器调用堆栈中,最后4个条目用于

libecpg.dll:   libecpg.dll!100047f7(), 
libecpg.dll!100041fd(), 
libecpg.dll!10008bc8(), 
libecpg.dll!10008431(),  ....

进一步研究:

访问冲突发生在函数fmtstr()中,因为参数值为NULL

static void
fmtstr(char *value, int leftjust, int minlen, int maxwidth, int pointflag, PrintfTarget *target)
{
int         padlen,
            vallen;         /* amount to pad */
/*
 * If a maxwidth (precision) is specified, we must not fetch more bytes
 * than that.
 */
if (pointflag)
    vallen = pg_strnlen(value, maxwidth);
else
    vallen = strlen(value); // value == NULL
...

参数 是通过函数dopr()中的va_arg()调用填充的:

static void dopr(PrintfTarget *target, const char *format, va_list args)
    ...
    case 's':
        if (!have_star)
        {
            if (pointflag)
                precision = accum;
            else
                fieldwidth = accum;
        }
        if (have_dollar)
            strvalue = argvalues[fmtpos].cptr;
        else
            strvalue = va_arg(args, char *);
        fmtstr(strvalue, leftjust, fieldwidth, precision, pointflag,
                   target);
        break;
        ...

只有在我拔网线时才会发生访问冲突,但如果我停用网络则不会。

在函数ecpg_execute()中:

if (stmt->statement_type == ECPGst_execute) {
    ...
}
else
{
    if (stmt->nparams == 0)
    {
        **stmt->results** = PQexec(stmt->connection->connection, stmt->command);
        ecpg_log("ecpg_execute on line %d: using PQexec\n", stmt->lineno);
    }
    else
    {
        stmt->results = PQexecParams(stmt->connection->connection, stmt->command, stmt->nparams, NULL, (const char *const *) stmt->paramvalues, NULL, NULL, 0);

    ...
    }

拉网线时 stmt->结果不是NULL

停用网络时 stmt->结果为空

0 个答案:

没有答案