首页
开源
资讯
活动
开源许可证
软件工程云服务
软件代码质量检测云服务
持续集成与部署云服务
社区个性化内容推荐服务
贡献审阅人推荐服务
群体化学习服务
重睛鸟代码扫描工具
登录
注册
代码拉取完成,页面将自动刷新
Watch
1
Star
6
Fork
9
胡正超
/
devkit
Fork 仓库
加载中
取消
确认
代码
Issues
23
Pull Requests
0
Wiki
3
统计
更新失败,请稍后重试!
Issues
/
详情
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
pg_attribute
待办的
#IA9F1A
胡正超
拥有者
创建于
2024-07-01 09:34
问题现象: 客户现场跑业务出现持续coredump。coredump损坏。通过查看寄存器与反汇编得到疑似堆栈 【】 定位过程: 客户启动业务。gdb住数据库,再疑似堆栈heap_fill_tuple上打断点,但调用太多了,想通过其他堆栈预先过滤,也不好用,最终失败。 客户排查业务,逐一进行尝试,找到失败SQL,是个普通的二表join。 【SQL】 启动数据库,执行SQL,发现确实失败。 预先打断点到heap_fill_tuple,停在memcpy_s之前。查看入参。 dest没有问题,刚申请的;src是一个varlena,解析出来长度,发现不对劲,打印src内存如下: 【图】 询问此条SQL以及相关的表、索引最近是否有过变动:表再周四添加了几列,SQL再周五添加了四列的查询,之后就开始core了。 化简SQL,单独查询周五添加的几列,发现会core。定位到其中一列。这一列不查就没事,查就不行。 查询pg_attribute,发现这一列的attinitdefault列值有问题,过长,且与之前gdb打印出来的内容一致。 梳理这列相关的信息: 1、alter table 添加列,并带有默认值'' (客户提供的ddl中是默认值) 2、SQL直接查询就会失败 本地使用B插件进行SQL编写复现: create table a(a int); alter table a add column b char(4) default ''; select * from a; 复现失败。 通过函数pg_get_tabledef()发现这一列表的默认值为‘120’,与客户提供的不符合。怀疑客户还做过修改默认值的操作。本地尝试,复现。 create table a(a int); alter table a add column b char(4) default ''; alter table a modify column b default '120'; select * from a; 但是化简后的SQL有完整的堆栈。堆栈并未损坏。 使用不化简的SQL,二表join,堆栈也会损坏。 在最新master代码仓不复现。对比代码,找到修复用例。 为什么二表join时堆栈损坏的原因最终也没有找到。怀疑与memcpy写的太长,从堆区写超到了栈区有关系。但多次复现,查看堆栈帧的地址,也不是。 方法整理: 寄存器与反汇编: 寄存器sp内存储的是最近的函数指令,查看得到地址,之后使用disassemble命令,可以在代码区找到函数名。
问题现象: 客户现场跑业务出现持续coredump。coredump损坏。通过查看寄存器与反汇编得到疑似堆栈 【】 定位过程: 客户启动业务。gdb住数据库,再疑似堆栈heap_fill_tuple上打断点,但调用太多了,想通过其他堆栈预先过滤,也不好用,最终失败。 客户排查业务,逐一进行尝试,找到失败SQL,是个普通的二表join。 【SQL】 启动数据库,执行SQL,发现确实失败。 预先打断点到heap_fill_tuple,停在memcpy_s之前。查看入参。 dest没有问题,刚申请的;src是一个varlena,解析出来长度,发现不对劲,打印src内存如下: 【图】 询问此条SQL以及相关的表、索引最近是否有过变动:表再周四添加了几列,SQL再周五添加了四列的查询,之后就开始core了。 化简SQL,单独查询周五添加的几列,发现会core。定位到其中一列。这一列不查就没事,查就不行。 查询pg_attribute,发现这一列的attinitdefault列值有问题,过长,且与之前gdb打印出来的内容一致。 梳理这列相关的信息: 1、alter table 添加列,并带有默认值'' (客户提供的ddl中是默认值) 2、SQL直接查询就会失败 本地使用B插件进行SQL编写复现: create table a(a int); alter table a add column b char(4) default ''; select * from a; 复现失败。 通过函数pg_get_tabledef()发现这一列表的默认值为‘120’,与客户提供的不符合。怀疑客户还做过修改默认值的操作。本地尝试,复现。 create table a(a int); alter table a add column b char(4) default ''; alter table a modify column b default '120'; select * from a; 但是化简后的SQL有完整的堆栈。堆栈并未损坏。 使用不化简的SQL,二表join,堆栈也会损坏。 在最新master代码仓不复现。对比代码,找到修复用例。 为什么二表join时堆栈损坏的原因最终也没有找到。怀疑与memcpy写的太长,从堆区写超到了栈区有关系。但多次复现,查看堆栈帧的地址,也不是。 方法整理: 寄存器与反汇编: 寄存器sp内存储的是最近的函数指令,查看得到地址,之后使用disassemble命令,可以在代码区找到函数名。
评论 (
0
)
胡正超
创建了
任务
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)