gdb调试常用指令及案例讲解
一、常用指令
运行
-g:使用该参数编译可以执行文件,得到调试表。
编译
# 运行
gdb ./a.out# 设置参数
set args -s ./data/uvd.tcl
控制参数
断点
list/l :list 1 列出源码。根据源码指定 行号设置断点。
b :b 20 在 20 行位置设置断点。
b 文件名:行数
b 10 if i = 6 :条件断点(当 i = 6 时打在第10行),再执行 run
info b : 查看断点信息表
delete 1 : 删除断点1
delete : 删除所有断点
enable 1 : 使能断点1
disable 1 :禁用断点1
save breakpoints 文件名.txt :保存断点
source 文件名.txt : 还原断点信息
退出
ctrl+c:退出输入
c : 继续执行
重新启动或运行程序
默认情况下,run 指令会一直执行程序,直到执行结束。如果程序中手动设置有断点,则 run 指令会执行程序至第一个断点处;
run/r: 运行程序/重新运行
查看调用栈
bt: 查看调用栈
单步调试或退出
n/next : 下一条指令(会越过函数)
s/step : 下一条指令(会进入函数)
p/print :p i 查看变量的值。
c/continue :继续执行断点后续指令。
finish :结束当前函数调用。
q/quit :退出 gdb 当前调试。
跳转执行
在gdb调试中,可以回溯到之前代码,或者跳过前面的代码直接执行后面代码
1.通过找到line的地址,设置寄存器
2.在line设置断点,然后 jump 行数
3.通过标签,然后jump 标签
调试跳过指定函数
1.进入函数执行finish或者return,可以结束这个函数
2. 跳过一个文件执行: skip file 文件
3.跳过一个目录下所有文件 skip -gfi 文件夹/*.*
通过 display 设置跟踪变量
和 print 命令一样,display 命令也用于调试阶段查看某个变量或表达式的值,它们的区别是,使用 display 命令查看变量或表达式的值,每当程序暂停执行(例如单步执行)时,GDB 调试器都会自动帮我们打印出来,而 print 命令则不会。
也就是说,使用 1 次 print 命令只能查看 1 次某个变量或表达式的值,而同样使用 1 次 display 命令,每次程序暂停执行时都会自动打印出目标变量或表达式的值。因此,当我们想频繁查看某个变量或表达式的值从而观察它的变化情况时,使用 display 命令可以一劳永逸。
undisplay:取消设置跟踪变量。 使用跟踪变量的编号
观察点
watch 写观察点: 当观察点背写入时产生中断
rwatch:读观察点: 当观察点的值背读取时产生中断
awatch:读写观察点: 读写观察点
二、死锁或dump
方法1: attach
最近遇到一个程序卡死的问题,借助 gdb 轻松定位,供大家参考。
遇到程序卡死不退处,可能不知道卡死在什么地方,如果程序非常简单,也许 printf 大法就可以很快定位。但是对于大型程序,尤其是一些框架程序,printf 大法可能就力不从心了。
实际的程序很复杂,这里给出一个极简版,一个多线程程序:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>void* pthread_run1()
{printf("=== thread 1\n");while(1){sleep(1);}return NULL;
}void* pthread_run2()
{printf("=== thread 2\n");while(1){sleep(1);return NULL;}return NULL;
}int main()
{pthread_t tid1;pthread_t tid2;pthread_create(&tid1, NULL, pthread_run1, NULL);pthread_create(&tid2, NULL, pthread_run2, NULL);pthread_join(tid1, NULL);pthread_join(tid2, NULL);return 0;
}
编译(gcc hello.c -g -pthread
)后运行:
xxx:~/code/multithread$ ./a.out
=== thread 1
=== thread 2
程序卡住不退处,当然我这里的例子使用 ctrl-c 信号可以让程序退出,而我实际的程序是这里会卡死。不过这不是重点,重点是怎么知道程序卡死(或卡住)在哪里呢?当然这个简单的例子,你直接 review 代码就能看出,或者简单加几个 printf 就能定位出卡死的位置。上面也说过这个是极简版,review 和 printf 很难发现问题。这个时候我们就可以借助 gdb 了。
首先,查看当前程序的进程号(pid),使用 ps 命令:ps aux | grep a.out
,得到 pid 为 1801781。
xxx 1801781 0.0 0.0 84576 476 pts/1 Sl+ 21:24 0:00 ./a.out
然后,启动 gdb,接着 attach 该 pid:
GNU gdb (Ubuntu 9.1-0ubuntu1) 9.1
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:<http://www.gnu.org/software/gdb/documentation/>.For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) attach 1801781
Attaching to process 1801781
[New LWP 1801782]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
__pthread_clockjoin_ex (threadid=140508208416512, thread_return=0x0, clockid=<optimized out>, abstime=<optimized out>, block=<optimized out>) at pthread_join_common.c:145
145 pthread_join_common.c: No such file or directory.
(gdb) up
#1 0x0000564d11e93274 in main () at hello.c:38
38 pthread_join(tid1, NULL);
(gdb)
可以看到程序卡在源码的 38 行。 卡住的原因是线程 join 的时候等不到线程函数返回。
注意事项:
- 如果启动 gdb 后 attach pid 没有权限,比如信息如下,则可以使用 sudo gdb。
- 如果你的程序不是 -g 编译的,只会看到最底层代码位置,这个时候因为没有调试信息,使用
up
命令也无法显示源码。建议编译 debug 版本来定位,可以获取丰富的信息。
方法2:重复查看调用栈,确定在哪里死锁了
Ctrl+C
bt
Ctrl+C
bt
三、多线程
查看线程信息
info thread:查看所有线程信息
thread num :切换线程
线程查找,线程断点
thread find:查找线程(只能查找地址,id,名字。后面的函数不能)thread name:设置线程名字(先切换到像改名字的线程,然后执行)b breakpoint thread id:为线程设置断点(只有设置的线程会在中断处停止,其他线程不会)
为线程执行命令
thread apply 2 3 i args 显示线程2,线程3的参数thread apply 2-6 i args 显示线程2-6的参数thread apply all i args显示所有线程的参数thread apply 2 -s i args对线程2执行 i args命令,如果命令错误就没有提示thread apply 2 3 -q i args会把线程2,线程3的信息连在一起显示
线程的日志信息控制
线程创建和结束时会在终端打印很多输出,为了不影响观看,于是可以控制
show print thread-events:查看当前线程显示状态
set print thread-events off:关闭当前线程显示状态
四、内存泄漏检测
通过gdb来查看某些函数是否有内存泄漏问题。比较函数进出的内存占用情况来判断
注意事项:在内存中,除了malloc分配地址,本身也还有链表来存储空间也需要内存
call malloc_stats()查看当前的内存分布
call malloc_info(0,stdout)把内存分布情况按照xml格式输出
加入 -fsanitize=address选项,在发生内存泄漏,堆栈溢出,野指针,全局内存会直接定位到具体代码
五、外部命令和保存文件
在gdb中可以使用shell命令,也可以使用 ! 代替shell
设置保存debug文件:set logging file 名字.txt
保存文件:set logging on
查看文件:!cat 文件.txt 或者 shell cat 文件.txt
六、多进程
调试子进程
默认是父进程调试。如果要设置子进程需要进行设置
set follow-fork-mode child
父进程和子进程一起调试
先设置到子进程,然后
set detach-on-fork off:关闭父进程的detach
i inferiors查看当前进程及其子进程信息
inferior 号码:切换进程号码
多进程调试
inferior就是一个调试对象,就是一个调试进程
首先在新建一个gdb,此时i inferior是空的,执行需要调试的进程,首先add-inferior,然后利用attach 进程号进行添加,然后再重复这个过程
在调试过程中,可以只执行一个进程,或者两个都执行。
show schedule-multiple:显示是否所有进程都执行
set schedule-multiple on:开启所有进程一起执行
detach inferiors 号码:关闭号码调试的进程
remove-inferior:删除一个add之后的inferior(不能删除当前的,只能删除之前的)
七、核心存储core-dump
为活着的进程生成core-dump文件
1.利用gdb attach 进程号添加进程
2.利用gcore test.core生成文件
当程序发送段错误时生成core-dump文件
ulimit -c 查看是否允许保留core文件。0为不保存
ulimit -c unlimited 允许生成core文件
修改生成dump文件的名字:sudo echo -e "%e-%p-%t" > /proc/sys/kernel/core_pattern
利用dump文件进行调试
参考:
GDB调试大全-CSDN博客
相关文章:
gdb调试常用指令及案例讲解
一、常用指令 运行 -g:使用该参数编译可以执行文件,得到调试表。 编译 # 运行 gdb ./a.out# 设置参数 set args -s ./data/uvd.tcl 控制参数 断点 list/l :list 1 列出源码。根据源码指定 行号设置断点。 b …...
LeetCode 刷题笔记
LeetCode 刷题笔记 1. 20241218 (1)2447 std::gcd是C17引入的一个函数,用于计算两个整数的最大公因数。位于<numeric>头文件中。 #include <iostream> #include <numeric> // std::gcdint main() {int a 36;int b 60…...
重新定义页签!Choerodon UI Tabs让管理更高效
01 引言 Tabs 组件通过提供平级区域,将大块内容进行有效的收纳和展现,从而保持界面整洁。但在企业应用的快速发展中,这样传统的页签组件已无法满足我们对界面布局和个性化展示的追求。Choerodon UI Tabs 组件通过支持多级分组、个性化配置、…...
OnlyOffice出现JWT问题和文档下载失败问题解决
一、文档安全令牌未正确形成: 解决方案:禁用jwt,并且重启服务 文件位置:C:\Program Files\ONLYOFFICE\DocumentServer\config\local.json "token": {"enable": {"request": {"inbox":fa…...
Python面试常见问题及答案3
一、基础语法相关 问题:Python中如何实现多态? 答案:在Python中,多态是一种动态类型机制的体现。比如,通过定义一个具有相同方法名的类,不同的类可以根据自身的定义实现这个方法的不同行为。例如ÿ…...
【Java学习笔记】多线程基础
并行:同一时刻,多任务同时进行 多任务分别进行 一、线程相关概念 1.程序 是为完成特定任务、用某种语言编写的一组指令的集合。 简单的说:就是我们写的代码 2.进程 (1)进程指的就是运行中的程序,比如我们使用QQ,就…...
使用stm32的ADC和NTC热敏电阻R值是10k,B值是3950的测温程序
首先要明确NTC热敏电阻的阻值是随温度升高,电阻降低的一个特性,加上拉电阻10K,不过一下子没有找到10K的上拉电阻,就用了一个8.2K的上拉电阻到3.3V,测温电阻一端接地,中间接stm32的PA1使用ADC测电压来计算温…...
详细解读BSCI验厂
BSCI验厂是指BSCI(Business Social Compliance Initiative)倡议商界遵守社会责任组织对BSCI组织成员的全球供应商进行的社会责任审核。以下是对BSCI验厂的详细解读: 一、BSCI验厂的定义与背景 定义:BSCI验厂是企业社会责任验厂的…...
Visual Studio 2022 QT5.14.2 新建项目无法打开QT的ui文件,出现闪退情况
新建 Qt Widgets Application项目,如下图: 点击下一步: 项目创建成功如下: 提示异常如下图: ***.ui 无法打开文件。 提供三种解决办法,本文使用第二种方式解决,选择适合您的解决方法&#x…...
Unity3D制作MMORPG所需知识点详解
前言 在制作一款大型多人在线角色扮演游戏(MMORPG)时,Unity3D引擎提供了丰富的功能和工具,但开发者需要掌握一系列关键技术和知识点。本文将详细介绍使用Unity3D制作MMORPG所需的关键知识点和技术细节。 对惹,这里有…...
Coding Caprice - monotonic stack2
42. 接雨水 class Solution { public:int trap(vector<int>& height) {stack<int> sh;int out 0;for(int i0; i<height.size(); i){while(!sh.empty() && height[sh.top()]<height[i]){int bo height[sh.top()];sh.pop();if(sh.empty()){brea…...
Android Stduio 2024版本设置前进和后退按钮显示在主界面
Android Studio 2024(Ladybug)安装后发现前进和后退按钮不显示在主界面的工具栏,且以前在View中设置的办法无效: Android Studio 2024(Ladybug)的设置方式: File->Settings->Appearance&…...
NFT与NFT数据的区别
NFT与NFT数据的区别 NFT与NFT数据的区别 NFT(非同质化代币) NFT是一种基于区块链技术的数字资产。它具有独一无二的特性,就像现实生活中的艺术品原作,每一个NFT都有其独特的标识,无法被其他资产替代。例如,一幅数字画作以NFT的形式存在,它的所有权信息、创作背景、作者签…...
Docker介绍、安装、namespace、cgroup、镜像-Dya 01
0. 容器简介 从生活上来说,容器是一种工具,可以装东西的工具,如衣柜、背包、行李箱等等。 从IT技术方面来说,容器是一种全新的虚拟化技术,它提高了硬件资源利用率,结合k8s还可以让企业业务快速横向扩容、业…...
SQL 查询方式比较:子查询与自连接
在 SQL 中,子查询和自连接是两种常见的查询方式,它们的功能虽然可以相同,但实现的方式不同。本文通过具体示例,深入探讨这两种查询方式,并配合数据展示,帮助大家理解它们的使用场景和差异。 数据示例 假设…...
day15 python(3)——python基础(完结!!)
【没有所谓的运气🍬,只有绝对的努力✊】 目录 1、函数 1.1 函数传参中的拆包 1.2 匿名函数的定义 1.3 匿名函数练习 1.4 匿名函数应用——列表中的字典排序 2、面向对象 OOP 2.1 面向对象介绍 2.2 类和对象 2.3 类的构成和设计 2.4 面向对象代码…...
电机频繁烧毁的原因分析
电机作为一种关键的工业设备,广泛应用于各类机械和设备中。然而,电机频繁烧毁的问题却时常困扰着许多企业,导致生产效率降低,维修成本上升,甚至可能引发安全隐患。 一、电机烧毁的基本原理 电机的烧毁通常是指电机内…...
概率论得学习和整理30: 用EXCEL 描述泊松分布 poisson distribution
目录 1 泊松分布的基本内容 1.1 泊松分布的关键点 1.1.1 属于离散分布 1.1.2 泊松分布的特点:每个子区间内概率相等 , λ就是平均概率 1.2 核心参数 1.3 pmf公式 1.4 期望和方差 2 例1:用EXCEL计算泊松分布的概率 3 比较λ不同值时…...
计算机网络技术基础:3.计算机网络的拓扑结构
网络拓扑结构是指用传输媒体互连各种设备的物理布局,即用什么方式把网络中的计算机等设备连接起来。将工作站、服务站等网络设备抽象为点,称为“节点”;将通信线路抽象为线,称为“链路”。由节点和链路构成的抽象结构就是网络拓扑…...
docker login 出错 Error response from daemon
在自己的Linux服务器尝试登陆docker出错 输入完用户密码之后错误如下: 解决方案 1.打开daemo文件: vim/etc/docker/daemon.json 2.常用的国内Docker 镜像源地址 网易云 Docker 镜像:http://hub-mirror.c.163.com 百度云 Docker 镜像&#x…...
【测试】Pytest
建议关注、收藏! 目录 功能pytest 自动化测试工具。 功能 单元测试:用于验证代码的最小功能单元(如函数、方法)的正确性。 简单的语法:不需要继承特定类或使用复杂的结构。断言语句简化。 自动发现测试:P…...
前端拖拽API你会用了么
大家好,今天跟大家分享一个小知识,前端页面的拖拽效果。这个效果可以说还是很常见的,比如说玩一些游戏的时候,将装备直接拖拽到一定区域就会丢掉或者装备上,再比如说一个列表,通过拖拽排序等。那么今天我们…...
NVIDIA推出全新紧凑型超算,加速生成式AI发展,价格大幅下降
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
第100+33步 ChatGPT学习:时间序列EMD-ARIMA-LSTM模型
基于Python 3.9版本演示 一、写在前面 上一节,我们学了经验模态分解(Empirical Mode Decomposition,EMD)。 如同结尾所说,“那么,做这些分解有什么作用呢?有大佬基于这些分解出来的序列分别作…...
Redis到底是单线程还是多线程?
Redis的线程模型是一个复杂的话题,它既包含了单线程的特性也引入了多线程的概念。理解这一点对于正确使用Redis和优化其性能至关重要。 1.单线程模型 在早期版本中,Redis被设计为单线程模型,这意味着所有客户端请求的处理(包括网…...
Qt5与Qt6中的高DPI缩放属性解析
在Qt5中,高DPI缩放默认是禁用的。为了启用它,开发者需要设置Qt::AA_EnableHighDpiScaling应用程序属性。然而,在Qt6中,高DPI缩放默认是启用的,并且不能被禁用。这种变化使得开发者在处理高分辨率屏幕时更加方便&#x…...
[146 LRU缓存](https://leetcode.cn/problems/lru-cache/)
分析 维护一个双向链表保存缓存中的元素。 如果元素超过容量阈值,则删除最久未使用的元素。为了实现这个功能,将get(), put()方法获取的元素添加到链表首部。 为了在O(1)时间复杂度执行get()方法,再新建一个映射表,缓存key与链表…...
顺序表-递增有序表合并
两个递增有序表合并操作 题目: 将两个递增有序的顺序表 A 和 B 合并成一个新的递增有序顺序表 C。 思路: 使用三个索引 i, j, k 分别遍历顺序表 A, B 和合并后的顺序表 C。比较 A 和 B 当前索引指向的元素,将较小的元素放入 C 中…...
从开始实现扩散概率模型 PyTorch 实现
目录 一、说明 二、从头开始实施 三、线性噪声调度器 四、时间嵌入 五、下层DownBlock类块 六、中间midBlock类块 七、UpBlock上层类块 八、UNet 架构 九、训练 十、采样 十一、配置(Default.yaml) 十二、数据集 (MNIST) keyword: Diffusion…...
LabVIEW智能焊接系统
焊接作为制造业中的核心工艺,直接影响到产品的性能与可靠性。传统的焊接过程通常依赖操作工的经验控制参数,导致质量波动较大,效率低下且容易产生人为误差。随着工业自动化和智能制造的不断发展,传统焊接方法的局限性愈加明显。本…...
如何快速排查 Wi-Fi 的 TPUT 问题?
1. 如何排查 Wi-Fi TPUT 问题 掌握每个 Wi-Fi 协议下的 Wi-Fi TPUT 的计算方法 一文让你轻松理解WLAN物理层速率计算方式_wifi速率计算公式-CSDN博客配查 CPU 的资源占用率:interrupt、CPU loading Linux/Android 系统使用 mpstat 工具 具体工具的使用方法ÿ…...
C语言单链表、双链表专题及应用
1.链表的概念及结构 概念:链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表的结构跟火车车厢相似,淡季时车次的车厢会相应减少,旺季时车次的车厢会额外增…...
C++4--类
目录 1.类的引入 2.类的定义 3.类的访问限定符及封装 3.1访问的限定符 3.2封装 4.类的作用域 5.类的实体化 1.类的引入 C语言结构体中只能定义变量,在C中,结构体内不仅可以定义变量,也可以定义函数。比如:之间在数据结构中&…...
紫光展锐5G融云方案,开启云终端新时代
近年来,云终端凭借便捷、高效、高性价比的优势正逐步在各行各业渗透。研究机构IDC的数据显示,2024上半年,中国云终端市场总体出货量达到166.3万台,同比增长22.4%,销售额29亿元人民币,同比增长24.9%…...
雪泥鸿爪和屈指可数
paw这个单词,表示“爪或手”,是一个和hoof相对的单词: hoof n.(马等动物的)蹄paw n.爪子;(动物的)爪;(人的)手 v.挠,抓;动手动脚 所以,当你理解了 paw 和 hoof 是相对的概念时&…...
C++并发与多线程(高级函数async)
async 在 C 中,async 关键字用于实现异步编程,它允许你定义异步操作,这些操作可以在后台执行,而不会阻塞当前线程。这是 C11 引入的特性,与 std::async 函数和 std::future 类一起使用。与thread函数模板的区别在于as…...
LeetCode 力扣 热题 100道(二十)三数之和(C++)
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 如下代码…...
类和对象(4)
大家好,今天来给大家介绍一下this引用,在学习类和对象的时候大家一定有一点疑惑吧,类为什么能知道我们传入的是哪个对象,又是怎么实例化我们的成员的,那么我们便来了解一下。 四.this引用 4.1为什么要有this引用 在…...
php基础:正则表达式
1.正则表达式 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。到目前为止,我们前面所用过的精确(文本)匹配也是一种正则表达式。 在PHP中,正则表达式一般是由正规字…...
Vue3动态表单实现
实现方法:通过<component />标签动实现动态表单渲染 component标签: 在vue中 component 标签用于动态组件标签的渲染。它允许在同一个挂载点上条件渲染不同的组件,通过is属性可以渲染指定的属性 在上面的例子中,通过调用…...
【网络取证篇】取证实战之PHP服务器镜像网站重构及绕密分析
【网络取证篇】取证实战之PHP服务器镜像网站重构及绕密分析 在裸聊敲诈、虚假理财诈骗案件类型中,犯罪分子为了能实现更低成本、更快部署应用的目的,其服务器架构多为常见的初始化网站架构,也称为站库同体服务器!也就是说网站应用…...
高数 | 用简单的话讲考研数学知识点(第一集:充分和必要)
目录 一、前言 二、充分和必要 三、基础符号 四、符号拓展 五、符号进阶 六、符号进阶拓展 七、本集总结 一、前言 up最近想去上学,就想考个研究生读一读,那就要复习高数,光复习挺没意思的,所以就想着边复习边写文章吧&…...
前端学习-操作元素内容(二十二)
目录 前言 目标 对象.innerText 属性 对象.innerHTML属性 案例 年会抽奖 需求 方法一 方法二 总结 前言 曾经沧海难为水,除却巫山不是云。 目标 能够修改元素的文本更换内容 DOM对象都是根据标签生成的,所以操作标签,本质上就是操作DOM对象,…...
PostgreSql-学习06-libpq之同步命令处理
目录 一、环境 二、介绍 三、函数 1、PQsetdbLogin (1)作用 (2)声明 (3)参数介绍 (4)检测成功与否 2、PQfinish (1)作用 (2࿰…...
Python `str.strip()` 的高级用法详解
Python str.strip 的高级用法详解 1. str.strip() 的基本用法2. str.strip() 的高级用法2.1 移除指定字符2.2 移除多个指定字符2.3 移除换行符和制表符2.4 结合正则表达式的高级处理 3. lstrip() 和 rstrip() 的用法3.1 lstrip():移除左端字符3.2 rstrip()ÿ…...
Vue 3 中的 `update:modelValue` 事件详解
在 Vue 3 中,update:modelValue 事件通常与 v-model 指令一起使用,以实现自定义组件的双向数据绑定。以下是对该事件的详细分析: 事件定义 首先,我们需要在组件中定义 update:modelValue 事件。可以使用 defineEmits 函…...
AI 助力医学伦理知情同意书的完善:守护受试者权益
在医学研究中,知情同意书是保障受试者权益的核心文件,其质量直接关系到研究的伦理合规性。一份完善的知情同意书应清晰、准确且全面地向受试者传达研究的关键信息,确保他们在充分理解的基础上自愿做出参与决策。然而,在实际撰写过…...
【信息系统项目管理师-论文真题】2017上半年论文详解(包括解题思路和写作要点)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一:论信息系统项目的范围管理解题思路写作要点试题二:论项目采购管理解题思路写作要点试题一:论信息系统项目的范围管理 实施项目范围管理的目的是包括确保项目做且制作所需的全部工作,以顺利完成项目…...
rpc设计的再次思考20251215(以xdb为核心构建游戏框架)
1.服务提供者注册的方式 // 表明这是一个服务提供者,ServerType 和 ServerId从application.properties中读取 // 而且只有当当前服务是Game时,才生效。 或者 条件注解??? RpcProvider(typeServerType.Game) public class GameProvider{MsgReceiver…...
mysql 查看并设置 innodb_flush_log_at_trx_commit 参数
mysql 查看并设置 innodb_flush_log_at_trx_commit 参数 innodb_flush_log_at_trx_commit 是 MySQL 中的一个系统变量,用于控制 InnoDB 存储引擎的日志刷新行为。该变量有三个可选的值: 0:每隔一秒钟,日志缓冲被刷新到日志文件&a…...