OpenHarmony子系统开发 - DFX(八)
OpenHarmony子系统开发 - DFX(八)
八、Faultlogger开发指导
概述
功能简介
Faultlogger是OpenHarmony为开发者提供的一个维测日志框架,能够为应用、元能力、系统服务进程崩溃故障提供统一检测、日志采集、日志存储、日志上报功能,为应用崩溃故障提供详细的维测日志用以辅助故障定位。本章节内容适用于标准系统以及Linux内核的小型系统。
FaultLogger承载OpenHarmony系统上的故障记录功能,按照服务对象不同分别运行在两个部件中:
-
Hiview部件中的服务:服务于应用层和native层的功能模块,功能是分类管理系统中发生的各类故障信息,并为模块提供查询故障的API。
-
Faultloggerd部件中的服务:服务于崩溃进程,功能是收集C/C++运行时异常的守护进程和获取进程调用栈。
基于Faultlogger服务,进程崩溃的处理流程如下图所示:
图1 进程崩溃处理流程图
-
进程运行时崩溃,内核抛出崩溃信号,用户态SignalHandler响应(进程启动时硬编码注册);
-
SignalHandler收集好崩溃现场信息(context、fatal message等),设置当前进程ptracer和dumpable状态后,fork出ProcessDump进程进行remote抓栈;
-
ProcessDump获取到signalhandler通过pipe传输过来的进程crash现场相关信息后,向Faultloggerd申请crash文件句柄;
-
基于libunwinder自研回栈能力进行回栈,崩溃日志写入到
/data/log/faultlog/temp
目录下的原始crash故障文件; -
ProcessDump完成crash文件内容写入后,将精简的crash故障信息打包上报到hiview;
-
hiview faultlogger插件接收到添加的crash信息后,额外获取hilog信息,在
/data/log/faultlog/faultlogger
目录下生成面向开发者开发的日志。同时上报到hisysevent和hiappevent;
使用场景
Faultloggerd意在为开发者在开发测试过程中遇到的崩溃或卡死问题提供一种简单轻量的定位手段。
主要包含以下应用场景:
表1 Faultloggerd模块应用场景
场景描述 | 使用工具 | 使用方式 |
---|---|---|
了解函数的调用顺序 | DumpCatcher API | 参见:使用DumpCatcher接口获取调用栈 |
应用卡死/CPU占用高 | DumpCatcher Command Tool | 参见:使用DumpCatcher命令获取调用栈 |
崩溃问题定位 | 崩溃日志和llvm-addr2line工具 | 参见:基于崩溃日志定位问题 |
使用DumpCatcher接口获取调用栈
接口说明
DumpCatcher可以抓取OpenHarmony指定进程(线程)的调用栈。
表2 DumpCatcher接口说明
类 | 方法 | 描述 |
---|---|---|
DfxDumpCatcher | bool DumpCatch(const int pid, const int tid, std::string& msg, size_t maxFrameNums, bool isJson) | 接口返回值: - true:回栈成功,回栈信息存储在msg字符串对象中; - false:回栈失败。 输入参数: - pid:目标进程号; - tid:目标线程号,如果需要回栈进程中的所有线程,则tid设定为0; - maxFrameNums:回栈最大帧数,如果pid不等于调用方pid,则忽略这个参数,该参数默认值为256; - isJson:堆栈消息是否为JSON格式化,该参数默认值为false; 输出参数: - msg:如果回栈成功,则通过msg返回调用栈信息。 |
DfxDumpCatcher | bool DumpCatchMix(const int pid, const int tid, std::string& msg) | 接口返回值: - true:回栈成功,回栈信息存储在msg字符串对象中; - false:回栈失败。 输入参数: - pid:目标进程号; - tid:目标线程号,如果需要回栈进程中的所有线程,则tid设定为0; 输出参数: - msg:如果回栈成功,则通过msg返回混合栈信息。 |
DfxDumpCatcher | bool DumpCatchFd(const int pid, const int tid, std::string& msg, int fd, size_t maxFrameNums) | 接口返回值: - true:回栈成功,回栈信息存储在msg字符串对象中; - false:回栈失败。 输入参数: - pid:目标进程号; - tid:目标线程号,如果需要回栈进程中的所有线程,则tid设定为0; - fd:指定写入的文件句柄号; - maxFrameNums:回栈最大帧数,如果pid不等于调用方pid,则忽略这个参数,该参数默认值为256; 输出参数: - msg:如果回栈成功,则通过msg返回调用栈信息。 |
DfxDumpCatcher | bool DumpCatchMultiPid(const std::vector<int> pidV, std::string& msg) | 接口返回值: - true:回栈成功,回栈信息存储在msg字符串对象中; - false:回栈失败。 输入参数: - pidV:目标进程号列表; 输出参数: - msg:如果回栈成功,则通过msg返回调用栈信息。 |
说明: 当调用此接口的进程id与目标pid不一致时需要调用者是管理员(system,root)用户。
开发实例
系统应用开发者可以用DumpCatcher在自己的应用中获取指定进程(线程)的调用栈。下文以dumpcatcherdemo模块使用DumpCatcher基础接口获取调用栈作为实例进行讲解。
-
编译构建文件添加dumpcatcher依赖:以
/base/hiviewdfx/faultloggerd/example/BUILD.gn
为例,在include_dirs中添加DfxDumpCatcher头文件路径,并在deps中添加//base/hiviewdfx/faultloggerd/interfaces/innerkits/dump_catcher:lib_dfx_dump_catcher
模块依赖。import("//base/hiviewdfx/faultloggerd/faultloggerd.gni")config("dumpcatcherdemo_config") {visibility = [ ":*" ]include_dirs = [".","$faultloggerd_common_path/dfxutil","$faultloggerd_interfaces_path/common", # 添加dumpcatcher头文件路径] }ohos_executable("dumpcatcherdemo") {sources = [ "dump_catcher_demo.cpp" ]configs = [ ":dumpcatcherdemo_config" ]deps = ["$faultloggerd_common_path/dfxlog:dfx_hilog","$faultloggerd_interfaces_path/innerkits/dump_catcher:libdfx_dumpcatcher", # 添加dumpcathcer模块依赖"$faultloggerd_interfaces_path/innerkits/formatter:libjson_stack_formatter",]external_deps = ["c_utils:utils","hilog:libhilog","jsoncpp:jsoncpp",]install_enable = truepart_name = "faultloggerd"subsystem_name = "hiviewdfx" }
备注(如果其他仓想要依赖该模块,要通过faultloggerd部件进行依赖)
external_deps += ["faultloggerd:libdfx_dumpcatcher","faultloggerd:libjson_stack_formatter", ]
-
头文件定义用到的函数:以
/base/hiviewdfx/faultloggerd/example/dump_catcher_demo.h
为例,本样例代码中,通过调用栈深度测试的测试函数来构造一个指定深度的调用栈。#ifndef DUMP_CATCHER_DEMO_H #define DUMP_CATCHER_DEMO_H#define NOINLINE __attribute__((noinline))// 定义该宏函数用于自动生成函数调用链 #define GEN_TEST_FUNCTION(FuncNumA, FuncNumB) \__attribute__((noinline)) int TestFunc##FuncNumA() \{ \return TestFunc##FuncNumB(); \}// 调用栈深度测试的测试函数 int TestFunc0(void); int TestFunc1(void); int TestFunc2(void); int TestFunc3(void); int TestFunc4(void); int TestFunc5(void); int TestFunc6(void); int TestFunc7(void); int TestFunc8(void); int TestFunc9(void);#endif // DUMP_CATCHER_DEMO_H
-
在源文件中调用DumpCatch接口:以
/base/hiviewdfx/faultloggerd/example/dump_catcher_demo.cpp
为例,引用dfx_dump_catcher.h头文件,声明DfxDumpCatcher对象,通过宏函数构造函数调用链,并最后调用DumpCatch接口方法,传入需要抓取调用栈的进程号、线程号。#include "dump_catcher_demo.h"#include <cstdint>#include <cstdlib>#include <cstring>#include <iostream>#include <string>#include <unistd.h>#include "dfx_define.h"#include "dfx_dump_catcher.h"#include "dfx_json_formatter.h"#include "elapsed_time.h"static NOINLINE int TestFuncDump(int32_t pid, int32_t tid, bool isJson){OHOS::HiviewDFX::DfxDumpCatcher dumplog;std::string msg = "";OHOS::HiviewDFX::ElapsedTime counter;bool ret = dumplog.DumpCatch(pid, tid, msg, OHOS::HiviewDFX::DEFAULT_MAX_FRAME_NUM, isJson); // 调用DumpCatch接口获取调用栈time_t elapsed1 = counter.Elapsed();if (ret) {std::cout << msg << std::endl;if (isJson) {std::string outStr = "";OHOS::HiviewDFX::DfxJsonFormatter::FormatJsonStack(msg, outStr);std::cout << outStr << std::endl;}}time_t elapsed2 = counter.Elapsed();std::cout << "elapsed1: " << elapsed1 << " ,elapsed2: " << elapsed2 << std::endl;return ret;}static NOINLINE int TestFunc10(void){return TestFuncDump(getpid(), gettid(), false);}// 通过宏函数自动生成函数调用链GEN_TEST_FUNCTION(0, 1)GEN_TEST_FUNCTION(1, 2)GEN_TEST_FUNCTION(2, 3)GEN_TEST_FUNCTION(3, 4)GEN_TEST_FUNCTION(4, 5)GEN_TEST_FUNCTION(5, 6)GEN_TEST_FUNCTION(6, 7)GEN_TEST_FUNCTION(7, 8)GEN_TEST_FUNCTION(8, 9)GEN_TEST_FUNCTION(9, 10)static bool ParseParameters(int argc, char *argv[], int32_t &pid, int32_t &tid){switch (argc) {case 3:if (!strcmp("-p", argv[1])) {pid = atoi(argv[2]);return true;}if (!strcmp("-t", argv[1])) {pid = getpid();tid = atoi(argv[2]);return true;}break;case 5:if (!strcmp("-p", argv[1])) {pid = atoi(argv[2]);if (!strcmp("-t", argv[3])) {tid = atoi(argv[4]);return true;}} else if (!strcmp("-t", argv[1])) {tid = atoi(argv[2]);if (!strcmp("-p", argv[3])) {pid = atoi(argv[4]);return true;}}break;default:break;}return false;}int main(int argc, char *argv[]){int32_t pid = 0;int32_t tid = 0;if (ParseParameters(argc, argv, pid, tid)) {TestFuncDump(pid, tid, true);} else {TestFunc0();}return 0;}
使用DumpCatcher命令获取调用栈
工具说明
DumpCatcher Command Tool是一个抓取调用栈的命令行工具,在OpenHarmony系统中可直接使用,该工具通过-p、-t参数指定进程和线程,命令执行后在命令行窗口打印指定进程的线程栈信息。还可通过添加-m参数来抓取应用进程的JS Native混合栈。
表3 DumpCatcher Command Tool使用说明
工具名称 | 命令行工具路径 | 执行命令 | 描述 |
---|---|---|---|
dumpcatcher | /system/bin | - dumpcatcher -p [pid] - dumpcatcher -p [pid] -t [tid] - dumpcatcher -m -p [pid] - dumpcatcher -m -p [pid] -t [tid] | 参数说明: - -p [pid]:打印指定进程下面的所有线程栈信息。 - -p [pid] -t [tid]:打印指定进程下面的指定线程信息。 - -m -p [pid]:打印指定进程下面的所有线程混合栈信息。 - -m -p [pid] -t [tid]:打印指定进程下面的指定线程混合栈信息。 返回值说明: 如果栈信息解析成功,则将信息显示到标准输出;失败则打印错误信息。 |
使用实例
通过dumpcatcher命令打印hiview进程的调用栈。
# ps -ef |grep hiview
hiview 2035 1 4 14:15:51 ? 00:08:24 hiview
root 6428 6425 12 17:31:51 pts/1 00:00:00 grep hiview
# dumpcatcher -p 2035 -t 2035
Result: 0 ( no error )
Timestamp:2024-05-06 17:32:05.000
Pid:2035
Uid:1201
Process name:/system/bin/hiview
Tid:2035, Name:hiview
#00 pc 000c3cac /system/lib/ld-musl-arm.so.1(ioctl+72)(d820b1827e57855d4f9ed03ba5dfea83)
#01 pc 0000efdf /system/lib/chipset-pub-sdk/libipc_common.z.so(OHOS::BinderConnector::WriteBinder(unsigned long, void*)+14)(cd26d6fe1883c088fa265a1eb112cd38)
#02 pc 000129b1 /system/lib/chipset-pub-sdk/libipc_single.z.so(OHOS::IPC_SINGLE::BinderInvoker::TransactWithDriver(bool)+216)(0d33aaefbd1542c521978a6b2a5e3591)
#03 pc 00012aab /system/lib/chipset-pub-sdk/libipc_single.z.so(OHOS::IPC_SINGLE::BinderInvoker::StartWorkLoop()+34)(0d33aaefbd1542c521978a6b2a5e3591)
#04 pc 00013abf /system/lib/chipset-pub-sdk/libipc_single.z.so(OHOS::IPC_SINGLE::BinderInvoker::JoinThread(bool)+34)(0d33aaefbd1542c521978a6b2a5e3591)
#05 pc 00028df7 /system/bin/hiview(OHOS::HiviewDFX::HiviewService::StartService()+14)(9db8e6c0a2e9e1f6f489bd2b0ddb432c)
#06 pc 00012d8d /system/bin/hiview(main+140)(9db8e6c0a2e9e1f6f489bd2b0ddb432c)
#07 pc 00072b98 /system/lib/ld-musl-arm.so.1(libc_start_main_stage2+56)(d820b1827e57855d4f9ed03ba5dfea83)
#08 pc 00012ce8 /system/bin/hiview(_start_c+84)(9db8e6c0a2e9e1f6f489bd2b0ddb432c)
#09 pc 00012c8c /system/bin/hiview(9db8e6c0a2e9e1f6f489bd2b0ddb432c)
基于崩溃日志定位问题
开发者可以通过faultloggerd生成的崩溃堆栈日志进行问题定位。本章节将主要介绍如何利用llvm-addr2line工具进行崩溃问题定位。
-
程序自崩溃或构造崩溃。 例如将如下代码植入自己的代码中,调用触发一个无效内存访问故障(SIGSEGV)。
NOINLINE int TriggerSegmentFaultException() {printf("test TriggerSegmentFaultException \n");// 为构造崩溃,强制进行类型转换int *a = (int *)(&RaiseAbort);*a = SIGSEGV;return 0; }
-
获取崩溃函数调用栈日志。 因为存在未处理的异常,进程会在
/data/log/faultlog/temp
路径下生成临时的日志文件,其命名规则为:cppcrash-pid-time
获取其生成的调用栈如下:
Timestamp:2017-08-05 17:35:03.000 Pid:816 Uid:0 Process name:./crasher_c Process life time:1s Reason:Signal:SIGSEGV(SEGV_ACCERR)@0x0042d33d Fault thread Info: Tid:816, Name:crasher #00 pc 0000332c /data/crasher(TriggerSegmentFaultException+15)(8bc37ceb8d6169e919d178fdc7f5449e) #01 pc 000035c7 /data/crasher(ParseAndDoCrash+277)(8bc37ceb8d6169e919d178fdc7f5449e) #02 pc 00003689 /data/crasher(main+39)(8bc37ceb8d6169e919d178fdc7f5449e) #03 pc 000c3b08 /system/lib/ld-musl-arm.so.1(__libc_start_main+116) #04 pc 000032f8 /data/crasher(_start_c+112)(8bc37ceb8d6169e919d178fdc7f5449e) #05 pc 00003284 /data/crasher(_start+32)(8bc37ceb8d6169e919d178fdc7f5449e) Registers: r0:0042d33d r1:0000000b r2:1725d4c4 r3:b6f9fa84 r4:bec97e69 r5:b6fc0268 r6:0042d661 r7:bec97d60 r8:00000000 r9:00000000 r10:00000000 fp:bec97d20 ip:00000020 sp:bec97cd0 lr:b6f9fae4 pc:0042d32c
-
利用llvm-addr2line工具进行调用栈分析。 使用llvm-addr2line工具根据偏移地址解析行号:
root:~/OpenHarmony/out/hi3516dv300/exe.unstripped/hiviewdfx/faultloggerd$ llvm-addr2line -e crasher 0000332c base/hiviewdfx/faultloggerd/tools/crasher/dfx_crasher.c:57
这个崩溃是由赋值给一块不可写的区域导致的,代码行为dfx_crasher.c文件的57行,修改后可以避免发生此崩溃。
相关文章:
OpenHarmony子系统开发 - DFX(八)
OpenHarmony子系统开发 - DFX(八) 八、Faultlogger开发指导 概述 功能简介 Faultlogger是OpenHarmony为开发者提供的一个维测日志框架,能够为应用、元能力、系统服务进程崩溃故障提供统一检测、日志采集、日志存储、日志上报功能…...
C# virtual 和 abstract 详解
简介 在 C# 中,virtual 和 abstract 关键字都用于面向对象编程中的继承和多态,它们主要用于方法、属性和事件的定义,但在用法上存在一些重要的区别。 virtual 关键字 virtual 表示可重写的方法,但可以提供默认实现,…...
红宝书第三十二讲:零基础学会模块打包器:Webpack、Parcel、Rollup
红宝书第三十二讲:零基础学会模块打包器:Webpack、Parcel、Rollup 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、模块打包器是什么? 把分散的HTML/CSS/JS文件 组合成浏览…...
DeepSeek 在金融领域的应用解决方案
DeepSeek 在金融领域的应用解决方案 一、背景 随着人工智能技术的快速发展,DeepSeek 作为一款国产大模型,凭借其强大的语义理解、逻辑推理和多模态处理能力,在金融行业迅速崭露头角。金融行业作为经济的核心,面临着激烈的市场竞…...
linux 处理2个文件的差集
命令 grep -Fvxf 文件1 文件2 -F 将模式视为固定字符串,而非正则表达式。 -v 反向匹配,输出不匹配的行。 -x 精确匹配整行,避免部分匹配。 -f 文件1 从文件1中读取模式。 示例 执行命令 grep -Fvxf a1.txt a2.txt...
vue3中pinia基本使用
一、安装以及引入 安装:npm install piniamain.js文件: import { createApp } from "vue"; import { createPinia } from "pinia"; import App from "./App.vue";const pinia createPinia() const app createApp(App)…...
“乐企“平台如何重构业财税票全流程生态?
2025年,国家税务总局持续推进的"便民办税春风行动"再次推进数字化服务升级,其中"乐企"平台作为税务信息化的重要载体,持续优化数电票服务能力,为企业提供更高效、更规范的税务管理支持。在这一背景下…...
JVM内存模型
JVM内存模型 JVM(Java Virtual Machine)内存模型是 Java 程序在运行时,JVM 为其分配的内存结构,它定义了 Java 程序如何在内存中存储数据和如何进行线程之间的通信。JVM 内存模型是为了支持高效的多线程执行和垃圾回收机制。 一…...
LeetCode热题100记录-【二分查找】
二分查找 35.搜索插入位置 思考:二分查找先判定边界条件 记录:不需要二刷 class Solution {public int searchInsert(int[] nums, int target) {int left 0,right nums.length-1;if(nums[right] < target){return right1;}if(nums[left] > tar…...
科普:原始数据是特征向量么?
一、输入向量 x \mathbf{x} x是特征向量 机器学习算法公式中的输入向量 x \mathbf{x} x通常要求是特征向量。原因如下: 从算法原理角度:机器学习算法旨在通过对输入数据的学习来建立模型,以实现对未知数据的预测或分类等任务。特征向量是对…...
echarts地图添加涟漪波纹点位
1.完整代码 chartsOption: {tooltip: {trigger: "item",formatter: this.initTooltip,triggerOn: "mousemove",borderColor: "#fff",backgroundColor: "rgba(216, 227, 244, 1)",extraCssText: "border-radius: 14px;", //…...
Linux(十三)fork + exec进程创建
一、进程创建 在了解进程创建的步骤前,让我们先通过实例观察一下。大家可以跟小编一起,在终端中执行3次ps -f命令,观察一下。 通过上图,我们可以发现,3次ps -f的父进程(PPID)都是一样的…...
集合计算高级函数
说明 过滤 遍历一个集合并从中获取满足指定条件的元素组成一个新的集合转化/映射(map)将集合中的每一个元素映射到某一个函数扁平化 扁平化映射 注:flatMap 相当于先进行 map 操作,在进行 flatten 操作集合中的每个元素的子元素映…...
鼎讯信通 便携式雷达信号干扰模拟器:打造实战化电磁环境的新利器
在现代战争中,电磁环境的复杂性直接影响着雷达装备的性能和作战效果。面对敌方日益精进的电子战手段,如何提升雷达设备的抗干扰能力,确保其在实战环境中的稳定性和可靠性,已成为各国军队和科研机构的重要课题。 为此,…...
避开养生误区,拥抱健康生活
在追求健康的道路上,我们常常会陷入一些养生误区,不仅无法达到预期效果,还可能损害身体健康。只有拨云见日,认清这些误区,采取正确的养生方式,才能真正拥抱健康生活。 很多人认为,保健品吃得…...
解码ChatBI技术形态:独立对话框、插件式与IM集成模式的技术优劣
ChatBI的形态之争 随着大语言模型(LLM)技术的成熟,**对话式商业智能(ChatBI)**正成为企业数据分析的新范式。然而,不同的技术形态直接影响ChatBI的落地效果——独立对话框、插件式助手、IM集成机器人&…...
rockylinux 8 9 升级到指定版本
rockylinux 8 update 指定版本 rockylinux 历史版 所有版本rockylinux 最新版 所有版本vault历史版 pub最新版(https://dl.rockylinux.org)地址后面增加不同名称 echo "delete repos" rm -rf /etc/yum.repos.d/*echo "new rockylinux repo" cat <<EO…...
一文详解OpenCV环境搭建:Ubuntu20.4使用CLion配置OpenCV开发环境
在计算机视觉和图像处理领域,OpenCV 是一个不可或缺的工具。其为开发者提供了一系列广泛的算法和实用工具,支持多种编程语言,并且可以在多个平台上运行。对于希望在其项目中集成先进视觉功能的开发者来说,掌握如何配置和使用OpenC…...
Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(四)
Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(四) 对 Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(三)-CSDN博客 进行完善,注意完善 …...
01-JVM 内存模型与 GC 原理
JVM 内存模型与 GC 原理解析 本文将从 JVM 内存模型入手,深入剖析各个区域的作用、GC 的运行机制与常见算法,并结合源码与面试思维,带你掌握 JVM 的底层世界。 一、JVM 内存模型(Java Memory Model) JVM 将内存划分为…...
Docker--Docker镜像制作的注意事项
Docker 镜像制作 dockerfiles的指令讲解 链接 CMD和ENTRYPOINT CMD 和 ENTRYPOINT 是 Dockerfile 中用于指定容器启动时运行命令的两个指令。它们在功能上有一些相似之处,但也存在重要区别。 在编辑Dockerfile时,ENTRYPOINT或者CMD命令会自动覆盖之前…...
AI:支持向量机(SVM)
支持向量机(SVM)理论基础详解:从零开始的完全指南 一、SVM的核心思想:直观理解 1.1 什么是分类问题? 想象你在玩一个游戏:桌上有红色和蓝色的球,你需要画一条线把它们分开。这条线就是分类边界。SVM的目标是找到一条最优分界线,使得这条线到最近的红色球和蓝色球的距…...
Vue.js 中 v-if 的使用及其原理
在 Vue.js 的开发过程中,条件渲染是一项极为常见的需求。v-if指令作为 Vue.js 实现条件渲染的关键手段,能够根据表达式的真假来决定是否渲染某一块 DOM 元素。它在优化页面展示逻辑、提升用户体验等方面发挥着重要作用。接下来,我们就深入探讨…...
Vue.js 中 v-show 的使用及其原理
在 Vue.js 的开发过程中,我们常常需要根据不同的条件来控制页面元素的显示与隐藏。v-show指令作为 Vue.js 提供的重要工具之一,为我们实现这一功能提供了便捷的途径。它与v-if指令有些相似,但在使用方法和原理上存在着明显的区别。接下来&…...
docker安装redisSearch
1.背景 Redis Search 是 Redis 官方提供的全文搜索引擎,它为Redis 提供全文搜索、索引和复杂查询功能。它基于内存存储,结合了 Redis 的高性能和倒排索引技术,支持实时搜索、聚合分析、模糊匹配等场景。RedisSearch 适用于需要快速检索结构化或非结构化…...
ADI的BF561双核DSP怎么做开发,我来说一说(六)IDE硬盘设计
作者的话 ADI的双核DSP,最早的一颗是Blackfin系列的BF561,这颗DSP我用了很久,比较熟悉,且写过一些给新手的教程。 是的你没有看错,就是IDE,那个最老的硬盘,我们当年做过此类设计。 硬件准备 …...
5.数据结构-图
5.数据结构-图 5.1 图的定义和基本术语5.1.1 图的定义5.1.2 图的基本术语 5.2图的存储结构5.2.1邻接矩阵采用邻接矩阵表示法创建无向网邻接表 5.1 图的定义和基本术语 5.1.1 图的定义 图 G由两个集合V和E组成,记为 G ( V , E ) G(V,E) G(V,E),其中V是…...
uni-app使用web-view传参的坑
问题描述 uni-app开发的一个页面,需要点击时跳转到PC端后台的一个详情页,所以需要传参如下: ticketIdticketCodetoken(用于自动登录,校验身份的) 但是吧,如果你明文传token,容易导…...
Android studio打包uniapp插件
一.参考资料与环境准备 原生工程配置需要使用到Android studio和HbuilderX 当前测试的as版本-20240301,下载地址:HbuilderX版本:4.36 二.插件创建流程 1.导入下载的UniPlugin-Hello-AS工程(下载地址见参考资料) 2.生成jks证书…...
SVT-AV1学习-函数selfguided_restoration_fast_internal
一 selfguided_restoration_fast_internal 函数作用 selfguided_restoration_fast_internal是SVT-AV1 编码器中用于自引导恢复Guided Resration SGR 的一个内部函数,通过自引导滤波技术对输入的去燥他图像数据进行处理,生成一个去燥版本的图像࿰…...
双引擎驱动:解密音视频体验的QoS技术底座与QoE感官革命
QoS 定义:QoS(Quality of Service,服务质量)衡量音视频传输技术层面的性能表现,聚焦网络传输和系统处理能力,通过客观指标量化服务质量。核心指标 码率/带宽:数据传输速率上限,直接…...
element-plus选择菜单栏不变色
代码: <template> ... <el-menu-item index"/task/execute"><el-icon><IconMenu /></el-icon><span>验收任务</span> </el-menu-item> <el-menu-item index"/task/change"><el-icon…...
uniapp加载json动画
一、添加canvas画布 <canvas id"lottie_demo" type"2d" style"display: inline-block;width: 148rpx; height: 148rpx;" /> 二、引入依赖和JSON文件 安装依赖 npm install lottie-miniprogram --save import lottie from lottie-mini…...
快递物流展同期举办2025中国智慧物流核心零部件创新论坛
2025中国智慧物流核心零部件创新论坛 会议主题:“AI ”重构智慧物流核心技术生态 会议介绍 随着人工智能、物联网、5G等技术的快速发展,智慧物流已成为全球物流行业转型升级的核心方向。在AI技术的驱动下,物流行业正从传统的“人、车、货”…...
ASP.NET图书馆借阅系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 近些年来,随着科技的飞速发展,互联网的普及逐渐延伸到各行各业中,给人们生活带来了十分的便利,图书馆借阅系统利用计算机网络实现信息化管理,使图书信息、图书借阅、归还的管理发展和服务水平有显著提升。 本文拟…...
在 Linux 终端中轻松设置 Chromium 的 User-Agent:模拟手机模式与自定义浏览体验
在 Linux 系统中,通过终端灵活控制 Chromium 的行为可以大幅提升工作效率。本文将详细介绍如何通过命令行参数和环境变量自定义 Chromium 的 User-Agent,并结合手机模式模拟,实现更灵活的浏览体验。 为什么需要自定义 User-Agent?…...
实验一 单管共射极放大电路
这篇文章是即兴写的,也不知道对不对,只有代码哦~~(文章结尾有彩蛋哦~~~) 表1-1实验数据MATLAB代码: clear all; clc % 参数设置 VCC 12; % 电源电压 (V) RB1 45e3; % 偏置电阻 RB1 (Ohms) RB2 15e3; % 偏置电阻 RB2 (Ohms) R…...
10-python面向对象(上)
10-python面向对象【上】 1.面向对象简介2. 类(class)3. 类的定义4. 参数self4.1 属性和方法4.2 self 1.面向对象简介 Python是一门面向对象的编程语言 所谓面向对象的语言,简单理解就是语言中的所有操作都是通过对象来进行的 面向过程: 面向过程指将我们…...
Java 大视界 -- 基于 Java 的大数据分布式缓存技术在电商高并发场景下的性能优化(181)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
Apache Airflow开源程序是一个以编程方式编写、计划和监控工作流程的平台
一、软件介绍 文末提供程序和源码下载 Apache Airflow开源程序是一个以编程方式编写、计划和监控工作流程的平台,当工作流被定义为代码时,它们将变得更加可维护、可版本化、可测试和协作性。使用 Airflow 将工作流创作为任务的有向无环图 (D…...
大数据学习(101)-spark的高可用模式
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
数字内容体验驱动用户参与增效
数字体验驱动参与增长 在数字化竞争日益激烈的市场环境中,数字内容体验已成为撬动用户深度参与的核心杠杆。通过个性化推荐算法与跨渠道分发策略的协同作用,企业能够精准匹配用户兴趣点,将碎片化信息转化为连贯的价值链条。数据显示…...
一文详解OpenGL环境搭建:Ubuntu20.4使用CLion配置OpenGL开发环境
在计算机图形学的广阔领域中,OpenGL作为行业标准的图形库,为开发者提供了强大的工具集来创建从简单的2D图形到复杂的3D世界。然而,对于初学者而言,配置一个合适的开发环境是迈向成功的第一步。本文将详细介绍如何在Ubuntu 20.04.3 LTS操作系统上搭建基于CLion的OpenGL开发环…...
欧拉函数模板
1.欧拉函数模板 - 蓝桥云课 问题描述 这是一道模板题。 首先给出欧拉函数的定义:即 Φ(n) 表示的是小于等于 n 的数中和 n 互质的数的个数。 比如说 Φ(6)2,当 n 是质数的时候,显然有 Φ(n)n−1。 题目大意: 给定 n 个正整数…...
用PointNet++训练自己的数据集(语义分割模型semseg)
(1)训练部件分割(partseg)模型和检测自己点云并将结果保存txt,请看博主上两篇文章 (2)本文背景是将pipe点云上的缺陷和本体检测出来,即1种语义场景(pipe)&…...
Java反射机制深度解析:方法、实战与底层机制
大家好,我是钢板兽! 反射作为Java的特性,它不仅是Spring三大特性Ioc、DI、AOP的基础,而且MyBatis、Jackson序列化、rpc远程调用接口都用到了反射机制。 本文将带你系统性地掌握 Java 反射的使用,通过 JSON 反序列化的…...
查看wifi密码
netsh wlan show profile nameCMCC-Rkt_Wi-Fi5 keyclear CMCC-Rkt_Wi-Fi5是无线网名称...
RPC 发展史
RPC 发展史 RPC(Remote Procedure Call)即远程过程调用,随着微服务的兴起,每个服务都拥有自己的数据库,负责各自的模块,例如 keystone(认证服务)负责用户信息、权限认证的内容&…...
蓝桥杯基础算法-递归
代码简洁,但涉及到的运算,会随着递归层数的增加成指数级增长 路分析:第20行20列位于45度这条线上 这条线上的数字是1 5 13 25 41...两数之差:4 8 12 16 --->每一个都是在前面的基础上4,可以用递归或者循环 public class dem…...
山东大学离散数学第七章习题解析
参考教材:离散数学教程,徐秋亮 / 栾俊峰 / 卢雷 / 王慧 / 赵合计 编著,山东大学计算机科学与技术学院 注:该解析为个人所写,涵盖了 2022-2023-2 学期赵合计老师所布置的所有课本习题;由于学识、认识及经验…...