程序运行报错分析文档

zry@huawei:~/src/modules/Connect$ ./newbuild/OpConnectAidTool 
\WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.
replace into `process_tracking` (`step_id`,`date`,`status`,`context_data`,`start_time`,`end_time`,`error_log`) values(?,?,?,?,?,?,?) 
Incorrect datetime value: '' for column 'end_time' at row 1
WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.
replace into `process_tracking` (`step_id`,`date`,`status`,`context_data`,`start_time`,`end_time`,`error_log`) values(?,?,?,?,?,?,?) 
=================================================================
==212612==ERROR: AddressSanitizer: stack-use-after-scope on address 0xffffc8f31e50 at pc 0xffff978997b0 bp 0xffffc8f312d0 sp 0xffffc8f31348
READ of size 11 at 0xffffc8f31e50 thread T0#0 0xffff978997ac in __interceptor_strlen ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:354#1 0xffff977bb6c4 in redisFormatSdsCommandArgv /root/temp-z/hiredis-master/hiredis.c:600#2 0xffff977bcce0 in redisAppendCommandArgv /root/temp-z/hiredis-master/hiredis.c:1164#3 0xffff977bcec4 in redisCommandArgv /root/temp-z/hiredis-master/hiredis.c:1216#4 0xaaaaad90210c in zryMyRedisTool::cleanExpiredFields(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) (/home/zry/src/modules/Connect/newbuild/OpConnectAidTool+0x10310c)#5 0xaaaaad8dc744 in CConnectModuleAidTool::SaveProcessTrackingInfo(bool) /home/zry/src/modules/Connect/OpConnectAidTool.cpp:485#6 0xaaaaad8de9d0 in test_SaveProcessTrackingInfo() /home/zry/src/modules/Connect/OpConnectAidTool.cpp:521#7 0xaaaaad8dea0c in main /home/zry/src/modules/Connect/OpConnectAidTool.cpp:535#8 0xffff96c9ae0c in __libc_start_main ../csu/libc-start.c:308#9 0xaaaaad8d02bc  (/home/zry/src/modules/Connect/newbuild/OpConnectAidTool+0xd12bc)Address 0xffffc8f31e50 is located in stack of thread T0 at offset 384 in frame#0 0xaaaaad901bf8 in zryMyRedisTool::cleanExpiredFields(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) (/home/zry/src/modules/Connect/newbuild/OpConnectAidTool+0x102bf8)This frame has 10 object(s):[32, 36) 'cleaned' (line 296)[48, 64) '<unknown>'[80, 96) '<unknown>'[112, 136) '<unknown>'[176, 200) '<unknown>'[240, 264) '<unknown>'[304, 336) 'zsetKey' (line 268)[368, 400) '<unknown>' <== Memory access at offset 384 is inside this variable[432, 464) '<unknown>'[496, 544) 'argv' (line 271)
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork(longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-use-after-scope ../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:354 in __interceptor_strlen
Shadow bytes around the buggy address:0x200ff91e6370: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 000x200ff91e6380: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 000x200ff91e6390: 00 00 00 00 00 00 00 00 00 00 f1 f1 f1 f1 04 f20x200ff91e63a0: 00 00 f2 f2 00 00 f2 f2 00 00 00 f2 f2 f2 f2 f20x200ff91e63b0: 00 00 00 f2 f2 f2 f2 f2 00 00 00 f2 f2 f2 f2 f2
=>0x200ff91e63c0: 00 00 00 00 f2 f2 f2 f2 f8 f8[f8]f8 f2 f2 f2 f20x200ff91e63d0: 00 00 00 00 f2 f2 f2 f2 00 00 00 00 00 00 f3 f30x200ff91e63e0: f3 f3 00 00 00 00 00 00 00 00 00 00 00 00 00 000x200ff91e63f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 000x200ff91e6400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f1 f10x200ff91e6410: f1 f1 f8 f2 f8 f2 f8 f2 01 f2 01 f2 04 f2 04 f2
Shadow byte legend (one shadow byte represents 8 application bytes):Addressable:           00Partially addressable: 01 02 03 04 05 06 07 Heap left redzone:       faFreed heap region:       fdStack left redzone:      f1Stack mid redzone:       f2Stack right redzone:     f3Stack after return:      f5Stack use after scope:   f8Global redzone:          f9Global init order:       f6Poisoned by user:        f7Container overflow:      fcArray cookie:            acIntra object redzone:    bbASan internal:           feLeft alloca redzone:     caRight alloca redzone:    cbShadow gap:              cc
==212612==ABORTING

2.1 报错描述
在运行程序时,AddressSanitizer 报告了stack-use-after-scope错误,具体表现为程序试图访问已经超出作用域的栈内存。这通常是因为某些变量的作用域问题导致的。

2.2 报错现象
运行程序时,AddressSanitizer 报告以下错误:

==212612==ERROR: AddressSanitizer: stack-use-after-scope on address 0xffffc8f31e50 at pc 0xffff978997b0 bp 0xffffc8f312d0 sp 0xffffc8f31348
READ of size 11 at 0xffffc8f31e50 thread T0

调用栈显示错误发生在zryMyRedisTool::cleanExpiredFields函数中,具体是在调用redisCommandArgv时。

2.3 报错原因

• 变量作用域问题:

argvzsetKey的作用域可能在调用redisCommandArgv时已经结束。

std::vector的生命周期问题,导致argv.data()指向的内存无效。

std::vector的生命周期问题:

• 如果argv是一个std::vector,并且在调用redisCommandArgv之前被销毁或重新分配,那么argv.data()指向的内存可能已经无效。

2.4 报错分析

2.4.1 确认变量作用域
检查zryMyRedisTool::cleanExpiredFields函数中所有变量的作用域,确保在调用redisCommandArgv时,所有变量仍然有效。

2.4.2 检查argvzsetKey的生命周期
确保argvzsetKey在调用redisCommandArgv时仍然有效。可以通过以下方式解决:

• 将argvzsetKey的作用域提升到整个函数。

• 确保argvzsetKey在调用redisCommandArgv之前不会被销毁或重新分配。

2.4.3 使用std::vector的正确方式
如果argv是一个std::vector,确保在调用redisCommandArgv时,argv的生命周期仍然有效。可以使用std::vectordata()方法获取指针,但需要确保std::vector不会被重新分配。

2.5 代码示例

2.5.1 错误代码示例
以下是可能导致问题的代码示例:

int zryMyRedisTool::cleanExpiredFields(const std::string &hashKey)
{if (cleanup_sha.empty() && !loadCleanupScript()){return -1; // 脚本加载失败}const std::string zsetKey = hashKey + ":expires";const time_t now = time(nullptr);// argv 的生命周期可能在调用 redisCommandArgv 时已经结束std::vector<const char *> argv = {"EVALSHA",cleanup_sha.c_str(),"2",                        // KEYS 数量zsetKey.c_str(),            // 有序集合键 (KEYS[1])hashKey.c_str(),            // 哈希键 (KEYS[2])std::to_string(now).c_str() // 当前时间戳 (ARGV[1])};redisReply *reply = (redisReply *)redisCommandArgv(context, argv.size(), argv.data(), nullptr);if (!reply){ZRY_LOG_ERROR("cleanExpiredFields failed: no reply");return -1;}// 处理 NOSCRIPT 错误(脚本未加载)if (reply->type == REDIS_REPLY_ERROR &&std::strstr(reply->str, "NOSCRIPT") != nullptr){freeReplyObject(reply);cleanup_sha.clear();                // 重置 SHAreturn cleanExpiredFields(hashKey); // 重试}// 处理正常响应int cleaned = -1;if (reply->type == REDIS_REPLY_INTEGER){cleaned = reply->integer;ZRY_LOG_INFO("Cleaned {} fields from {}", cleaned, hashKey);}else if (reply->type == REDIS_REPLY_ERROR){ZRY_LOG_ERROR("Cleanup error: {}", reply->str);}freeReplyObject(reply);return cleaned;
}

2.5.2 修复代码示例
以下是修复后的代码示例:

int zryMyRedisTool::cleanExpiredFields(const std::string &hashKey)
{if (cleanup_sha.empty() && !loadCleanupScript()){return -1; // 脚本加载失败}std::string zsetKey = hashKey + ":expires"; // 确保 zsetKey 的生命周期const time_t now = time(nullptr);std::vector<const char *> argv = {"EVALSHA",cleanup_sha.c_str(),"2",                        // KEYS 数量zsetKey.c_str(),            // 有序集合键 (KEYS[1])hashKey.c_str(),            // 哈希键 (KEYS[2])std::to_string(now).c_str() // 当前时间戳 (ARGV[1])};redisReply *reply = (redisReply *)redisCommandArgv(context, argv.size(), argv.data(), nullptr);if (!reply){ZRY_LOG_ERROR("cleanExpiredFields failed: no reply");return -1;}// 处理 NOSCRIPT 错误(脚本未加载)if (reply->type == REDIS_REPLY_ERROR &&std::strstr(reply->str, "NOSCRIPT") != nullptr){freeReplyObject(reply);cleanup_sha.clear();                // 重置 SHAreturn cleanExpiredFields(hashKey); // 重试}// 处理正常响应int cleaned = -1;if (reply->type == REDIS_REPLY_INTEGER){cleaned = reply->integer;ZRY_LOG_INFO("Cleaned {} fields from {}", cleaned, hashKey);}else if (reply->type == REDIS_REPLY_ERROR){ZRY_LOG_ERROR("Cleanup error: {}", reply->str);}freeReplyObject(reply);return cleaned;
}

2.6 Mermaid 图表

为空
失败
成功
不为空
失败
成功
NOSCRIPT 错误
无错误
程序启动
运行 cleanExpiredFields 函数
检查 cleanup_sha 是否为空
加载清理脚本
检查加载是否成功
返回 -1
继续执行
构造 zsetKey 和 argv
调用 redisCommandArgv
检查回复是否成功
记录错误并返回 -1
处理 NOSCRIPT 错误
重置 SHA 并重试
处理正常响应
记录清理结果
释放 reply 对象
返回清理结果

2.7 其他注意事项

• MySQL 警告:

   WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version.

这是一个 MySQL 的警告,表明MYSQL_OPT_RECONNECT已经被弃用,建议使用其他方式来处理重连逻辑。

• SQL 错误:

   Incorrect datetime value: '' for column 'end_time' at row 1

这是一个 SQL 错误,表明在插入数据时,end_time列的值为空字符串,而该列可能需要一个有效的日期时间值。需要检查代码中对end_time的赋值逻辑,确保其值有效。

2.8 总结
通过确保argvzsetKey的生命周期,可以解决stack-use-after-scope的问题。同时,需要检查 MySQL 的重连逻辑和 SQL 插入语句的合法性,以避免其他潜在问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/906364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于flask+vue的电影可视化与智能推荐系统

基于flaskvue爬虫的电影数据的智能推荐与可视化系统&#xff0c;能展示电影评分、评论情感分析等直观的数据可视化图表&#xff0c;还能通过协同过滤算法为用户提供个性化电影推荐&#xff0c;帮助用户发现更多感兴趣的电影作品&#xff0c;具体界面如图所示。 本系统主要技术架…

BYUCTF 2025

几周没会的比赛了&#xff0c;都是一题游。这周的BYU还不错&#xff0c;难度适中&#xff0c;只是时间有点短。周末时间不够。 Crypto Many Primes from Crypto.Util.number import bytes_to_long, getPrime import randomflag open("flag.txt").read().encode()…

链表的面试题8之环形链表

许久不见&#xff0c;那么这是最后倒数第三题了&#xff0c;这道题我们来看一下环形链表。 老规矩贴链接&#xff1a;141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 目录 倒数第k个元素 获取中间元素的问题。 双指针 来&#xff0c;大致看一下题目&#xff0c;这…

在 JavaScript 中正确使用 Elasticsearch,第二部分

作者&#xff1a;来自 Elastic Jeffrey Rengifo 回顾生产环境中的最佳实践&#xff0c;并讲解如何在无服务器环境中运行 Elasticsearch Node.js 客户端。 想获得 Elastic 认证&#xff1f;查看下一期 Elasticsearch Engineer 培训的时间&#xff01; Elasticsearch 拥有大量新…

2025年网站安全防御全解析:应对DDoS与CC攻击的智能策略

2025年&#xff0c;随着AI技术与物联网设备的深度融合&#xff0c;DDoS与CC攻击的规模与复杂度持续升级。攻击者不仅利用T级流量洪泛冲击带宽&#xff0c;还通过生成式AI伪造用户行为&#xff0c;绕过传统防御规则。如何在保障业务高可用的同时抵御混合型攻击&#xff1f;本文将…

window 安装 wsl + cuda + Docker

WSL 部分参考这里安装&#xff1a; Windows安装WSL2 Ubuntu环境 - 知乎 如果出现错误&#xff1a; WslRegisterDistribution failed with error: 0x800701bc 需要运行&#xff1a;https://crayon-shin-chan.blog.csdn.net/article/details/122994190 wsl --update wsl --shu…

《MambaLLIE:基于隐式Retinex感知的低光照增强框架与全局-局部状态空间建模》学习笔记

Paper:2405.16105 Github:GitHub - wengjiangwei/MambaLLIE 目录 摘要 一、介绍 二、相关工作 2.1 低光图像增强 2.2 视觉空间状态模型 三、方法 3.1 预备知识 3.2 整体流程 3.3 全局优先-局部次之状态空间块 四、实验 4.1 基准数据集与实施细节 4.2 对比实验 4…

微信小程序:封装request请求、解决请求路径问题

一、创建文件 1、创建请求文件 创建工具类文件request.js,目的是用于发送请求 二、js接口封装 1、写入接口路径 创建一个变量BASE_URL专门存储api请求地址 2、获取全局的token变量 从缓存中取出token的数据 3、执行请求 (1)方法中接收传递的参数 function request(url,…

【单机版OCR】清华TH-OCR v9.0免费版

今天向大家介绍一款非常好用的单机版OCR图文识别软件&#xff0c;它不仅功能多&#xff0c;识别能力强&#xff0c;而且还是免费使用的。OCR软件为什么要使用单机版&#xff0c;懂得都懂&#xff0c;因为如果使用在线识别的OCR软件&#xff0c;用户需要将文档上传互联网服务器的…

开源情报搜集系统:科研创新的强大引擎

一、引言 在当今全球化和信息化高度发展的时代&#xff0c;科研活动面临着前所未有的机遇与挑战。一方面&#xff0c;知识的更新换代速度极快&#xff0c;科研成果如雨后春笋般不断涌现&#xff1b;另一方面&#xff0c;科研竞争日益激烈&#xff0c;如何在众多科研团队中脱颖…

产品生命周期不同阶段的营销策略

产品生命周期的不同阶段&#xff08;导入期、成长期、成熟期、衰退期&#xff09;需要匹配差异化的营销策略。以下是各阶段的营销重点及具体策略&#xff1a; 1. 导入期&#xff08;Introduction Stage&#xff09; 核心目标&#xff1a;建立市场认知&#xff0c;快速触达目标…

Mujoco 学习系列(二)基础功能与xml使用

这篇文章是 Mujoco 学习系列第二篇&#xff0c;主要介绍一些基础功能与 xmI 使用&#xff0c;重点在于如何编写与读懂 xml 文件。 运行这篇博客前请先确保正确安装 Mujoco 并通过了基本功能与GUI的验证&#xff0c;即至少完整下面这个博客的 第二章节 内容&#xff1a; Mujoc…

面向SDV的在环测试深度解析——仿真中间件SIL KIT应用篇

1.引言 在汽车行业向软件定义汽车&#xff08;SDV&#xff09;转型的过程中&#xff0c;传统硬件在环&#xff08;HIL&#xff09;测试方案因难以适应新的技术架构与需求&#xff0c;其局限性日益凸显。传统HIL对硬件依赖性强&#xff0c;扩展性差&#xff0c;更换ECU或传感器…

windows使用anaconda安装pytorch cuda版本

Windows安装PytorchCUDA环境_使用conda安装pytorch cuda10.2版本-CSDN博客

Axure中使用动态面板实现图标拖动交换位置

要在Axure中实现图标拖动交换位置的功能&#xff0c;可以通过动态面板结合交互事件来实现。 实现步骤 准备图标元素 将每个图标转换为动态面板&#xff08;方便拖动和交互&#xff09;。 设置拖动交互 选中图标动态面板 → 添加“拖动时”交互 → 选择“移动”当前动态面板&am…

从零开始的嵌入式学习day24

标准IO 头文件需求&#xff1a; #include <stdio.h>1.fopen和fclose (1)fopen fopen的函数功能是打开一个文件。 首先看看fopen的函数声明&#xff1a; FILE *fopen(const char *path, const char *mode);第一个参数path是文件地址&#xff0c;传入的是不可变的字符…

抓包分析工具与流量监控软件

目录 一、抓包分析工具&#xff1a;定位问题的“放大镜” 1.1 工作原理简述 1.2 主流工具盘点 1.3 抓包的实战应用 二、流量监控软件&#xff1a;网络全景的“雷达系统” 2.1 功能特征 2.2 常用工具概览 2.3 实战应用场景 五、结语&#xff1a;深入可见&#xff0c;安…

DRIVEGPT4: 通过大语言模型实现可解释的端到端自动驾驶

《DriveGPT4: Interpretable End-to-End Autonomous Driving via Large Language Model》 2024年10月发表&#xff0c;来自香港大学、浙江大学、华为和悉尼大学。 多模态大型语言模型&#xff08;MLLM&#xff09;已成为研究界关注的一个突出领域&#xff0c;因为它们擅长处理…

Vue3 Form 表单限制输入小写字母、数字和下划线

方案一&#xff1a;Element Plus 表单验证 <template><el-form :model"form" :rules"rules" ref"formRef" label-width"120px"><el-form-item label"用户名" prop"username"><el-input v-m…

23、电网数据管理与智能分析 - 负载预测模拟 - /能源管理组件/grid-data-smart-analysis

76个工业组件库示例汇总 电网数据管理与智能分析组件 1. 组件概述 本组件旨在模拟一个城市配电网的运行状态&#xff0c;重点关注数据管理、可视化以及基于模拟数据的智能分析&#xff0c;特别是负载预测功能。用户可以通过界面交互式地探索电网拓扑、查看节点状态、控制时间…