私はV1呼び出し規約を使用して、PGのC拡張ライブラリを作成しました。集計関数を呼び出すと、postgresサーバープロセスがクラッシュします。私はgdbを使ってサーバプロセスをデバッグし、Seg-Vがどこにあるのかを調べました。PostgreSQL集約関数が外部のCライブラリ(クラッシュサーバ)に実装されています
無効なアドレスにアクセスしようとしたために発生します。私が理解していないことは、メモリが以前に正常に割り当てられたことです。しかし、コードのコメントから判断すると、メモリはまだ使用中に収穫/解放されていると思われます。私はポストグルの内部について十分に分かっていませんが、これは問題の原因と思われます。
クラッシュを引き起こし、Seg-Vの原因となる行を強調表示する関数のコードを含めました。私は正しいパラメータでMemoryContextAllocを呼び出していますか?
static PGARRAY *GetPGArray(int4 state, int fAdd);
static PGARRAY *ShrinkPGArray(PGARRAY * p);
Datum float8_agg_state(PG_FUNCTION_ARGS);
Datum float8_agg_final_count(PG_FUNCTION_ARGS);
Datum float8_agg_final_array(PG_FUNCTION_ARGS);
Datum float8_enum(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(float8_agg_state);
PG_FUNCTION_INFO_V1(float8_agg_final_count);
PG_FUNCTION_INFO_V1(float8_agg_final_array);
PG_FUNCTION_INFO_V1(float8_enum);
/*
* Manage the aggregation state of the array
*
* Need to specify a suitably long-lived memory context, or it will vanish!
* PortalContext isn't really right, but it's close enough (famous last words ...).
*/
static PGARRAY *
GetPGArray(int4 state, int fAdd)
{
PGARRAY *p = (PGARRAY *) state;
if (!state)
{
/* New array */
int cb = PGARRAY_SIZE(START_NUM);
p = (PGARRAY *) MemoryContextAlloc(PortalContext, cb);
p->a.vl_len_ = cb;
p->a.ndim = 0;
p->a.dataoffset = 0;
#ifndef PG_7_2
p->a.elemtype = FLOAT8OID;
#endif
p->items = 0;
p->lower = START_NUM;
}
else if (fAdd)
{
/* Ensure array has space */
/* SEG-V fault on the line below */
if (p->items >= p->lower)
{
PGARRAY *pn;
int n = p->lower + p->lower;
int cbNew = PGARRAY_SIZE(n);
pn = (PGARRAY *) repalloc(p, cbNew);
pn->a.vl_len_ = cbNew;
pn->lower = n;
return pn;
}
}
return p;
}
誰でもSG-Vのコードを見つけることができますか?間違って登録、返されるデータの間違ったフォーマット、返されるデータの間違ったメモリコンテキスト - - 良い
[[編集]]
マイバックエンドPGサーバーは、より問題があるはずv8.4.9
backend dbが8.4であることを忘れていました。しかし以前のバージョンのPGでも動作していました。 8.4の関連文書のリンクを投稿できますか?あなたがリンクを提供した文書は、9.1への参照をしません - それは8.4のコードのために使用できますか? –
http://archives.postgresql.org/pgsql-committers/2008-11/msg00159.php http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/utils/adt/array_userfuncs.c? r1 = 1.23&r2 = 1.24これは8.4パッチです –