达梦数据库 Core 文件分析入门:从 GDB 堆栈到 dmrdc SQL 提取
Core 文件可以理解为进程异常退出时保存下来的“现场”。日志记录故障前发生了什么Core 保存故障发生时线程停在哪里GDB 用来查看调用栈dmrdc则可以尝试从达梦 Core 中提取活动 SQL。本文所有达梦实验都只适用于测试环境。kill -11 dmserver_pid会中断数据库服务不要在生产库随意执行。一、先确认 Core 能不能生成Core 能否生成主要看三个条件当前用户是否允许生成 Core、Core 文件写到哪里、目标目录是否有权限和空间。ulimit-ccat/proc/sys/kernel/core_pattern本次环境中ulimit -c为unlimitedCore 文件路径规则为/dmbak/dmcore/core-%e-%t-%p-%u.core其中%e是进程名%t是时间戳%p是 PID%u是用户 UID。因此后面生成的 Core 不会在当前目录而是在/dmbak/dmcore下。二、实验一空指针触发 SIGSEGV先用一个普通 C 程序制造空指针异常#includestdio.hvoidlevel3(void){int*pointerNULL;*pointer100;}voidlevel2(void){level3();}voidlevel1(void){level2();}intmain(void){printf(program will crash\n);level1();return0;}编译时加上-g这样 GDB 才能显示函数名和源码行号gcc-g-O0null_test.c-onull_test ./null_test程序输出program will crash后出现“段错误核心已转储”说明程序访问非法内存并生成了 Core。根据core_pattern实际文件为/dmbak/dmcore/core-null_test-1784399982-20585-1001.core用 GDB 打开时要传入程序文件和 Core 文件的绝对路径gdb ./null_test /dmbak/dmcore/core-null_test-1784399982-20585-1001.coreGDB 里最关键的是这几行Program terminated with signal SIGSEGV, Segmentation fault. #0 0x000000000040114a in level3 () at null_test.c:6 6 *pointer 100;SIGSEGV表示非法内存访问null_test.c:6直接定位到*pointer 100;。继续执行bt可以看到完整调用链#0 level3 () at null_test.c:6 #1 level2 () at null_test.c:11 #2 level1 () at null_test.c:16 #3 main () at null_test.c:22调用栈从下往上读就是main - level1 - level2 - level3从上往下看则能看到程序最终在哪里崩溃。三、实验二abort 触发 SIGABRT第二个实验观察另一种退出方式程序自己主动中止。#includestdlib.hvoidstop_program(void){abort();}intmain(void){stop_program();return0;}编译运行后用对应 Core 打开gcc-g-O0abort_test.c-oabort_test ./abort_test gdb ./abort_test /dmbak/dmcore/core-abort_test-1784402270-21600-1001.core这次 GDB 显示的是Program terminated with signal SIGABRT, Aborted. #0 raise () from /usr/lib64/libc.so.6 #1 abort () from /usr/lib64/libc.so.6 #2 stop_program () at abort_test.c:5 #3 main () at abort_test.c:10SIGABRT和SIGSEGV不同。前者通常表示程序主动中止后者更多是非法内存访问。这里调用链是main - stop_program - abort - raise说明abort()内部通过raise()触发了SIGABRT。这个实验对分析数据库 Core 很有帮助如果堆栈中看到abort、raise或类似halt的函数不应简单理解成“这里崩了”而要回到数据库日志里找主动中止前的错误原因。halt可以理解为程序认为继续运行不安全时主动停下来。四、实验三手动触发 dmserver Core前两个实验解决的是“怎么看信号和调用栈”。接下来回到达梦数据库本身目标是练习一条完整链路构造活动 SQL - kill dmserver 生成 Core - GDB 导出全线程堆栈 - dmrdc 提取 SQL - 用 LWP 线程号关联 SQL 和堆栈这里的重点不是证明某条 SQL 会导致达梦崩溃。Core 的直接原因是人为执行kill -11SQL 只是为了让 Core 现场里有可观察的活动会话。1. 构造锁等待现场单纯执行大 SQL 不一定够慢。本次环境里千万级插入几十毫秒就结束了所以改用锁等待来稳定保留活动 SQL。会话 A 持有行锁不提交DROPTABLEIFEXISTST_CORE_LOCK;CREATETABLET_CORE_LOCK(IDINTPRIMARYKEY,C1INT);INSERTINTOT_CORE_LOCKVALUES(1,100);COMMIT;UPDATET_CORE_LOCKSETC1C1WHEREID1;会话 B 执行同一行的更新UPDATET_CORE_LOCKSETC1C11WHEREID1;会话 B 会一直等待会话 A 释放锁。此时另开终端查询dmserverps-ef|grepdmserver|grep-vgrep本次查到的进程号是22976dmdba 22976 1 0 04:04 ? 00:00:04 /dmdbms/bin/dmserver path/dmdata/DAMENG/dm.ini -noconsole2. 生成 dmserver Core确认是测试环境后执行kill-1122976ll /dmbak/dmcore/目录中生成了新的服务端 Corecore-dmserver-1784405790-22976-1001.core3. 用 GDB 导出线程堆栈gdb /dmdbms/bin/dmserver /dmbak/dmcore/core-dmserver-1784405790-22976-1001.core进入 GDB 后导出线程set pagination off set logging file /dmbak/dmcore/core_22976_stack.txt set logging on info threads thread apply all bt set logging off quit图中能看到大量 LWP 线程。很多线程停在pthread_cond_wait、pthread_cond_timedwait这在数据库服务端里很常见通常表示线程正在等待任务或事件。本次更值得关注的是后面和 SQL 对应的线程。堆栈文件中可以看到Thread 106 (LWP 23555): #0 pthread_cond_timedwait () #1 os_event2_wait_timeout_low () #2 trx4_waiting_timeout () #3 trx4_waiting_interval () #4 trx4_waiting () #5 nupd2_exec_clu_update_check_rec_visible () #9 nupd2_exec_update () #17 uthr_db_main_for_sess ()trx4_waiting表示事务等待nupd2_exec_update表示正在执行更新。这和我们构造的锁等待现场对应上了。4. 用 dmrdc 提取 SQLcd/dmdbms/bin ./dmrdcsfile/dmbak/dmcore/core-dmserver-1784405790-22976-1001.coreAnalysing: 当前偏移/文件总大小是扫描进度不是报错。未指定dfile时dmrdc在同目录生成了默认输出文件cat/dmbak/dmcore/core-dmserver-1784405790-22976-1001_tmp.core输出中有两条 SQL!#%*^$[23555]:UPDATE T_CORE_LOCK SET C1 C1 1 WHERE ID 1; !#%*^$[23384]:UPDATE T_CORE_LOCK SET C1 C1 WHERE ID 1;方括号里的数字就是线程号。23555对应会话 B 中被锁阻塞的更新23384对应会话 A 中持锁未提交的更新。再回到 GDB 堆栈里找LWP 23555就能把“SQL 文本”和“线程状态”关联起来。这一步是整个实验最有价值的地方dmrdc告诉我们现场有哪些 SQLGDB 告诉我们这些线程当时停在哪里。两者结合才能把 Core 从一堆地址和线程变成能理解的故障现场。五、排查时重点收集什么真实遇到达梦实例异常退出时建议至少保留这些材料Core 文件和对应版本的dmserver数据库版本、补丁号、安装目录dmserver运行日志、dmsql日志操作系统日志例如/var/log/messages、dmesgGDB 导出的全线程堆栈dmrdc输出文件故障时间、故障前业务操作、是否能复现。Core 分析不能只看一个点。SIGSEGV、SIGABRT、线程堆栈、SQL 文本都只是线索最终还要和日志、业务时间线、复现结果一起判断。几个材料和工具的定位可以这样区分材料或工具主要回答的问题注意点数据库日志故障前发生了什么先按故障时间过滤再看错误号、线程号和业务操作Core 文件进程异常时停在哪里需要和崩溃时同版本的dmserver一起分析GDB每个线程的调用栈是什么重点导出bt、info threads、thread apply all btdmrdcCore 中能否提取到活动 SQLSQL 是现场线索不等于最终根因六、总结通过这三个实验可以形成一个比较清晰的认识Core 保存的是进程异常时的现场GDB 负责把现场里的线程和调用栈展示出来dmrdc可以从达梦 Core 中提取活动 SQLSQL 出现在 Core 里只说明它和现场有关不等于它就是根因人为kill -11生成的 Core适合学习分析流程不适合直接推导数据库缺陷。数据库日志告诉我们故障前发生了什么Core 告诉我们故障时停在哪里。把日志、GDB 堆栈和dmrdc输出放在一起看才是达梦 Core 分析比较稳妥的方式。

相关新闻

Windows安装错误2502/2503终极修复指南:AtlasOS权限修复方案

Windows安装错误2502/2503终极修复指南:AtlasOS权限修复方案

Windows安装错误2502/2503终极修复指南:AtlasOS权限修复方案 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and usability. 项目地址: https://gitcode.com/GitHub_Trendin…

2026/10/11 16:14:59 阅读更多 →
AI Agent(AI智能体)的核心基础知识

AI Agent(AI智能体)的核心基础知识

引言:什么是AI Agent? 在人工智能(AI)浪潮席卷全球的今天,AI Agent(AI智能体) 正从一个技术概念迅速演变为驱动下一代应用的核心引擎。它不仅是ChatGPT等对话模型的延伸,更是一种能够…

2026/10/10 18:09:21 阅读更多 →
搭建智能体(Agent)必须掌握的十大核心框架

搭建智能体(Agent)必须掌握的十大核心框架

引言:为什么需要 Agent 框架? 在人工智能领域,智能体(Agent)已成为连接大语言模型(LLM)与现实世界复杂任务的关键桥梁。一个优秀的 Agent 能够理解目标、规划步骤、调用工具并持续学习。然而&am…

2026/10/8 3:31:50 阅读更多 →

最新新闻

8G显存本地部署MiniMax H3:视频生成与ComfyUI接入全攻略

8G显存本地部署MiniMax H3:视频生成与ComfyUI接入全攻略

第一次在8G显存的卡上把MiniMax H3本地版跑起来的时候,我自己都有点没缓过劲。最初印象里,视频生成模型想本地部署怎么也得16G显存起步,结果在量化方案的加持下不仅能跑,还能连续产出多条可用的漫剧分镜。这篇就把我从环境搭建、模…

2026/10/12 8:27:02 阅读更多 →
iff链:用链式等价证明破解循环论证的双向陷阱

iff链:用链式等价证明破解循环论证的双向陷阱

我最早对“当且仅当”四个字产生警惕,是在一次代码评审里。当时某个公开算法库的文档宣称“某数据结构能在常数时间内判定可达性当且仅当存在一条长度不超过给定阈值的路径”,实现者也把证明贴成了两段:“⇒”是正向,“⇐”是反向…

2026/10/12 8:27:02 阅读更多 →
Kaggle房价预测高维回归:从特征工程到Stacking融合实战

Kaggle房价预测高维回归:从特征工程到Stacking融合实战

简介:这份PDF资料面向具备一定Python与机器学习基础、希望系统掌握高维数据分类与回归实战的读者,以Kaggle经典房价预测赛题为载体,重点讲解如何用Stacking思维融合多种模型的优势。内容围绕完整流程展开:从pandas读取train与test…

2026/10/12 8:27:02 阅读更多 →
OpenCV傅里叶变换实战:频域滤波从原理到工业缺陷检测

OpenCV傅里叶变换实战:频域滤波从原理到工业缺陷检测

1. 为什么图像处理绕不开傅里叶变换刚接触OpenCV那会儿,我对傅里叶变换的态度就是两个字:跳过。理由也很简单——灰度、二值化、边缘检测、形态学操作,这些看得见摸得着的东西已经够用了,何必去碰那个满是复数、频域、频谱图的数学…

2026/10/12 8:27:02 阅读更多 →
Laravel vs ThinkPHP:架构基因与性能成本的选型权衡

Laravel vs ThinkPHP:架构基因与性能成本的选型权衡

前几天有个朋友问我:公司要起一个新项目,技术选型投票时团队吵翻了,一半人坚持用Laravel,理由是“现代架构、生态好、写起来优雅”,另一半人守着ThinkPHP不放,理由是“启动快、性能好、国内资料多”。我听完…

2026/10/12 8:27:01 阅读更多 →
不会编程,用AI写代码靠谱吗?TaoToken统一Key实测Cline MCP与Windsurf BYOK

不会编程,用AI写代码靠谱吗?TaoToken统一Key实测Cline MCP与Windsurf BYOK

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 8:26:01 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →