DEBUG跟踪PG进程的两种形式

背景

近日有小伙伴遇到了一个生产问题,pg_rewind命令会偶发的出现这个错误消息

... // rewind 过程信息

The program "initdb" was found by "xxx/bin/pg_rewind"
but was not the same version as pg_rewind.
Check your installation.
Failure,exiting

各种环境检查、验证搞了一通之后没什么头绪,找我帮忙,我看了看代码,感觉是个bug,那就只能debug试试了。

网上逛了一圈发现,大部分教人跟踪PG源码的帖子,都是gdb attach进程的方式,并不适合这个场景,pg_rewind是个命令,一气呵成,中途不会有机会让你停下来去attach一把的。

研究了下gdb的help信息,发现--args选项可行。
问题调查完,确实是个bug,但并不是社区版PG的bug,是我们定制版PG的bug。原因不重要,但这个调查方法我觉得可以总结一下。

跟踪PG进程的两条路

场景一、跟踪SQL进程

SQL的执行是在建立连接之后,因此,可以在建立连接之后,执行SQL之前,通过gdb的方式attach进程,附加断点,然后debug跟踪,举个栗子,开2个窗口,一边执行SQL,一边debug

  • 窗口一:建连接,取pid
[guqi@localhost ~]$ psql -p 51005
psql (xxxx based on PG 11.6)
Type "help" for help.

postgres=# select pg_backend_pid();
 pg_backend_pid
----------------
          52069
(1 row)
  • 窗口二:gdb attch pid
-- 格式:gdb postgres命令的路径 pid
[root@localhost ~]# gdb /data/postgres/app/bin/postgres 52069
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
... 
0x00007fe6060bef23 in __epoll_wait_nocancel () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.17-317.el7.x86_64
(gdb)

场景二、跟踪PG命令

PG安装路径的bin目录内有很多封装好的二进制命令,这些不像SQL需要单独建连接执行,因此跟踪这些命令的执行,也不能像场景一那样可以事先打好断点。

strace跟踪

strace可以跟踪命令执行过程中的系统调用,并且-tt选项可以打印调用的时间点,举个栗子:

[guqi@localhost ~]$ strace -tt createdb -h 127.1 -p 51005
14:59:41.171926 execve("/data/guqi/postgres/app/bin/createdb", ["createdb", "-h", "127.1", "-p", "51005"], 0x7ffc4ad5d878 /* 31 vars */) = 0
14:59:41.172721 brk(NULL)               = 0xa55000
14:59:41.172861 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc1f4f1f000
14:59:41.172982 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
14:59:41.173238 open("/data/guqi/postgres/app/lib/tls/x86_64/libpq.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
...
14:59:41.207330 sendto(3, "X\0\0\0\4", 5, MSG_NOSIGNAL, NULL, 0) = 5
14:59:41.207446 close(3)                = 0
14:59:41.207641 exit_group(1)           = ?
14:59:41.208050 +++ exited with 1 +++
[guqi@localhost ~]$

gdb跟踪

gdb可以直接执行一个二进制命令

gdb [options] [executable-file [core-file or process-id]]

但是默认情况下,这个executable-file不能带参数,否则会报错。gdb提供了一个--args选项,可以传递参数。进入gdb交互之后,start开始运行命令,gdb会在主函数的入口处自动打个断点(挺人性的),之后就和场景一一样了。

[guqi@localhost ~]$ gdb --args /data/guqi/postgres/bin/pg_rewind -D /data/guqi/data/master --source-server="host=127.0.0.1 port=51101 user=guqi"
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
...
Reading symbols from /data/guqi/postgres/app/bin/pg_rewind...done.
(gdb) b 433
Breakpoint 1 at 0x40294e: file /data/guqi/src/build_alone/../xxx/src/bin/pg_rewind/pg_rewind.c, line 433.
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040294e in main
                                                   at /data/guqi/src/build_alone/../xxx/src/bin/pg_rewind/pg_rewind.c:433
(gdb)start
Temporary breakpoint 2 at 0x4021a3: file /data/guqi/src/build_alone/../xxx/src/bin/pg_rewind/pg_rewind.c, line 125.
Starting program: /data/guqi/postgres/app/bin/pg_rewind -D /data/guqi/data/master --source-server=host=127.0.0.1\ port=51101\ user=guqi
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib64/libthread_db.so.1".

Temporary breakpoint 2, main (argc=4, argv=0x7fffffffe388)
    at /data/guqi/src/build_alone/../xxx/src/bin/pg_rewind/pg_rewind.c:125
125             set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_rewind"));
(gdb) c
Continuing.

场景二的两个方式,可以结合使用。

GDB常用的调试命令

  1. 在指定的文件,指定行,打断点
b postgres.c:line_num
  1. 查看/删除断点
info b
delete 1-5(断点序号)
  1. 执行
c:执行程序,直到断点或者结束为止
n:单步执行
s:单步执行,遇到函数调用,会进入函数内部
  1. 打印程序内的变量
-- 这个比较多变
-- 变量的形式支持类型强转,指针引用,内存地址等等,很强大
p var
  1. 主动调用函数
call func_name(pam_1,pam_2)
  1. 跳越到程序指定行去执行,类似goto语法
-- 跳跃过去之后,程序会直接开始执行,相当于从第xx行开始敲了个continue命令
jump line_num
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容