postgreSQL客户端(libpq)中的分段错误

时间:2012-04-27 23:57:13

标签: c debugging postgresql segmentation-fault libpq

我正在使用libpq开发一个postgreSQL客户端应用程序。 gcc编译它没有错误。但是,当我运行程序时,此功能:

void print_column(PGconn *connection) {

    PGresult *id_list;
    int row;

    // process_query() calls PQexec(), checks for errors, then returns the result
    id_list = process_query(connection, "SELECT id FROM customers WHERE state='CA'");

    for(row = 0; row < PQntuples(id_list); row++) {
        printf("%s\n", PQgetvalue(id_list, row, 0));

        // to pause the loop on each rep for debugging
        getchar();
    }
}

产生错误:

row number 1701734765 is out of range 0..8
Segmentation fault

奇怪的是for循环执行前五次重复没有问题。然后它导致第六个分段错误。

我没有发布整个节目,因为它是1000多行。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:3)

这不会导致分段错误,但您发布的代码中存在错误。

printf("%i\n", PQgetvalue(id_list, row, 0));

PQgetvalue函数返回char *,但您将其打印为int。 GCC和Clang都有警告会抱怨类型不匹配,我建议-Wall -Wextra或至少-Wall。您可以使用-Wformat打开 格式不匹配警告。 (此错误几乎肯定不会导致分段错误,但会导致输出错误。)

但是PQgetvalue不应该导致细分错误(你没有调用PQclear,对吧?)。程序中的其他位置可能存在损坏内存的错误。您可以使用Valgrind等工具来尝试检测此类错误。 1000行不是很长,以至于这样的问题难以处理,你也可以用#ifdef 0 ... #endif注释掉各个部分,直到错误停止,如果你绝望了。