暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

postgresql之命令pg_config源代码研究

SmallDB 2025-03-12
48

 

pg_config脚本输出
postgres@BJ-015908:~$ usr/local/pgsqldebug/bin/pg_config
BINDIR = usr/local/pgsqldebug/bin
DOCDIR = /usr/local/pgsqldebug/share/doc
HTMLDIR = /usr/local/pgsqldebug/share/doc
INCLUDEDIR = /usr/local/pgsqldebug/include
PKGINCLUDEDIR = /usr/local/pgsqldebug/include
INCLUDEDIR-SERVER = /usr/local/pgsqldebug/include/server
LIBDIR = /usr/local/pgsqldebug/lib
PKGLIBDIR = /usr/local/pgsqldebug/lib
LOCALEDIR = /usr/local/pgsqldebug/share/locale
MANDIR = /usr/local/pgsqldebug/share/man
SHAREDIR = /usr/local/pgsqldebug/share
SYSCONFDIR = /usr/local/pgsqldebug/etc
PGXS = /usr/local/pgsqldebug/lib/pgxs/src/makefiles/pgxs.mk
CONFIGURE =  '--enable-depend' '--enable-cassert' '--enable-debug' '--prefix=/usr/local/pgsqldebug'
CC = gcc
CPPFLAGS = -D_GNU_SOURCE
CFLAGS = -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -O2
CFLAGS_SL = -fPIC
LDFLAGS = -Wl,--as-needed -Wl,-rpath,'/usr/local/pgsqldebug/lib',--enable-new-dtags
LDFLAGS_EX =
LDFLAGS_SL =
LIBS = -lpgcommon -lpgport -lz -lreadline -lm
VERSION = PostgreSQL 14.7
postgres@BJ-015908:~$

核心代码样例

核心代码,返回一个结构体

typedef struct ConfigData
{
    char       *name;
    char       *setting;
} ConfigData;

extern ConfigData *get_configdata(const char *my_exec_path,
                                  size_t *configdata_len);

#endif                            /* COMMON_CONFIG_INFO_H */

核心就这点,特别简单完事


    configdata = get_configdata(my_exec_path, &configdata_len);
    /* no arguments -> print everything */
    if (argc < 2)
    {
        for (i = 0; i < configdata_len; i++)
            printf("%s = %s\n", configdata[i].name, configdata[i].setting);
        exit(0);
    }

调试信息截图


调试信息
(gdb) c
The program is not being run.
(gdb) list
127     }
128
129     int
130     main(int argc, char **argv)
131     {
132             ConfigData *configdata;
133             size_t          configdata_len;
134             char            my_exec_path[MAXPGPATH];
135             int                     i;
136             int                     j;
(gdb) b 132
Breakpoint 1 at 0x5555555565f8: file pg_config.c, line 132.
(gdb) n
The program is not being run.
(gdb) run
Starting program: /usr/local/pgsqldebug/bin/pg_config
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main (argc=1, argv=0x7fffffffe528) at pg_config.c:138
138             set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_config"));
(gdb) n
140             progname = get_progname(argv[0]);
(gdb) n
143             for (i = 1; i < argc; i++)
(gdb) n
152             if (find_my_exec(argv[0], my_exec_path) < 0)
(gdb) n
158             configdata = get_configdata(my_exec_path, &configdata_len);
(gdb) n
162                     for (i = 0; i < configdata_len; i++)
(gdb) n
163                             printf("%s = %s\n", configdata[i].name, configdata[i].setting);
(gdb) print i
$1 = 0
(gdb) info args
argc = <optimized out>
argv = 0x7fffffffe528
(gdb) print argv
$2 = (char **) 0x7fffffffe528
(gdb) print *argv
$3 = 0x7fffffffe76b "/usr/local/pgsqldebug/bin/pg_config"
(gdb) print argc
$4 = <optimized out>
(gdb) n
BINDIR = /usr/local/pgsqldebug/bin
162                     for (i = 0; i < configdata_len; i++)
(gdb) n
163                             printf("%s = %s\n", configdata[i].name, configdata[i].setting);
(gdb) print configdata[i].name
$5 = 0x5555555643b0 "DOCDIR"
(gdb) print configdata[i].setting
$6 = 0x5555555643d0 "/usr/local/pgsqldebug/share/doc"
(gdb) n
DOCDIR = /usr/local/pgsqldebug/share/doc
162                     for (i = 0; i < configdata_len; i++)
(gdb) print configdata[i].name
$7 = 0x555555564400 "HTMLDIR"
(gdb) print configdata[i].setting
$8 = 0x555555564420 "/usr/local/pgsqldebug/share/doc"
(gdb)

 


文章转载自SmallDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论