postgres数据库内核开发--gdb调试问题

背景

postgres数据库安装在这就不多讲了,下面我们讲讲在实际开发过程中,要使编译的数据库可以进行正常调试,不至于遇到下面问题:
Single stepping until exit from function exec_simple_query,
which has no line number information。

过程

下载postgres后进入编译目录时,按照要求,需要建立一个build目录。cd build,进入目录后,执行命令:…/configure --prefix=$HOME/pgdb --enable-debug;环境配置完成之后,执行:make && make install。
按照正常逻辑来说,初始化实例之后,可以使用./psql命令进入客户端执行sql命令,然后利用ps -ef | grep postgres,查找与postgres相关进程,此时我们会发现一下表示的pid:
postgres 130692 130438 0 22:40 ? 00:00:00 postgres: postgres postgres [local] idle
然后我们使用gdb -p 130692 ,附加到该进程进行调试:

在这里插入图片描述
此时可以看到上面有很多(No debugging symbols found in …)表示,别离它,在调试的过程中它不影响。
我们使用一个常用的断点:b exec_simple_query;再使用c,等待客户端发送sql指令。
在这里插入图片描述
在psql进程中,输入sql语句,可以看到gdb中,已经进入到断点处进行执行
在这里插入图片描述

问题

如果你有遇到问题:
Single stepping until exit from function exec_simple_query,
which has no line number information。
需要怎么解决啦!

解决

网上查询等到结果有两个:
(1)在编译时未添加-g参数;
(2)gcc编译版本与gdb版本不匹配。
我感觉第二种一般很难遇见,我们这着重讲解在试图调试postgres遇到这个问题应该怎么办。
我们知道在执行./configure --enable-debug,在bulid目录下会cp一些编译所需的目录。在编译postgres时,经常会有一个问题困扰,编译所需参数到底放在哪的,一般我们去查找一般都是在Makefile文件中,而在postgres编译时src目录下Makefile文件中并没有我们所需的编译参数描述。但是我们从一点可以看出,它到底隐藏在那个文件中的
在这里插入图片描述
可以看到上面图片中提到的Makefile.global文件,它是在执行configure文件时,利用Makefile.global.in文件生成的。(如果我们需要修改postgres的编译参数,再修改之后,就不再执行configure文件,不然修改会被覆盖)
我们进入Makefile.global文件中,如下图所示,
在这里插入图片描述
-g参数已经被加入了。那么为什么会造成这个问题哪?我也很纳闷,到处搜,最后还是绝望了。
只能做试验了。造成这个现象的原因无非就是环境问题(千万别怀疑是因为-g参数没有生效,因为在执行make命令时,我们可以从回显的信息中,很明确的知道,它是加了-g参数进行编译的)。我删除了实例,在build目录下执行make uninstall && make clean && make && make install。重复上面的过程,发现问题解决了。

总结

遇到问题不要慌,先记录一下,发个C站。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值