首页 文章 精选 留言 我的

精选列表

搜索[AGI触发],共10003篇文章
优秀的个人博客,低调大师

【 H5踩坑 】Dom变更引起的 touchend 不触发

背景故事 几个月前小编接了一个 全屏阻止touch默认行为,并模拟滚动 的需求。 但事成之后,偶尔出现 “突然锁死” 的问题,无法进行任何滑动。 问题原因 几经排查,是我们设计的 “单指锁定” 模块引起的。 为了更好的体验,我们做了一个“单指锁定”模块,当上一个手指不放开时,另一个手指不论怎么滑也不会引起交互。 因此如果 由于某种情况 导致 touchend 丢失,就无法解除当前手指的锁定状态,导致锁死。 某种情况是什么情况? 原因1 · iOS 底部控制中心划出引起的浏览器JS阻塞 图1 万恶的控制中心,弹出时会阻塞JS 原来如此 通过 window上的 touchcancel 事件来监听这一状况 window.addEventListener('touchcancel',e=>{ // ... 重设触摸状态 }); 然后重设触摸状态,简

优秀的个人博客,低调大师

反射内存网络中断机制全解析:从硬件触发到事件驱动

反射内存的共享内存模型有一个天然诱惑:既然是共享内存,接收方"轮询"读取不就行了?确实,很多入门应用就是靠轮询跑起来的。但轮询有两个硬伤:一是 CPU 空耗——不管有没有新数据,都要一遍遍去读内存;二是响应延迟不确定——轮询间隔决定了数据被"发现"的滞后,而这个间隔又受 CPU 负载影响。反射内存网络中断机制,正是为了解决这两个问题而设计的:让板卡在特定内存地址被写入时,主动给主机 CPU 发送物理中断,从而把"轮询等数据"升级为"事件驱动收通知"。

优秀的个人博客,低调大师

记一起由 Clang 编译器优化触发的 Crash

摘要:一个有意思的 Crash 探究过程,Clang 有 GCC 没有 本文首发于 Nebula Graph 官方博客:https://nebula-graph.com.cn/posts/troubleshooting-crash-clang-compiler-optimization/ 如果有人告诉你,下面的 C++ 函数会导致程序 crash,你会想到哪些原因呢? std::string b2s(bool b) { return b ? "true" : "false"; } 如果再多给一些描述,比如: Crash 以一定的概率复现 Crash 原因是段错误(SIGSEGV) 现场的 Backtrace 经常是不完整甚至完全丢失的。 只有优化级别在 -O2 以上才会(更容易)复现 仅在 Clang 下复现,GCC 复现不了 好了,一些老鸟可能已经有线索了,下面给出一个最小化的复现程序和步骤: // file crash.cpp #include <iostream> #include <string> std::string __attribute__((noinline)) b2s(bool b) { return b ? "true" : "false"; } union { unsigned char c; bool b; } volatile u; int main() { u.c = 0x80; std::cout << b2s(u.b) << std::endl; return 0; } $ clang++ -O2 crash.cpp $ ./a.out truefalse,d$x4DdzRx Segmentation fault (core dumped) $ gdb ./a.out core.3699 Core was generated by `./a.out'. Program terminated with signal SIGSEGV, Segmentation fault. #0 0x0000012cfffff0d4 in ?? () (gdb) bt #0 0x0000012cfffff0d4 in ?? () #1 0x00000064fffff0f4 in ?? () #2 0x00000078fffff124 in ?? () #3 0x000000b4fffff1e4 in ?? () #4 0x000000fcfffff234 in ?? () #5 0x00000144fffff2f4 in ?? () #6 0x0000018cfffff364 in ?? () #7 0x0000000000000014 in ?? () #8 0x0110780100527a01 in ?? () #9 0x0000019008070c1b in ?? () #10 0x0000001c00000010 in ?? () #11 0x0000002ffffff088 in ?? () #12 0xe2ab001010074400 in ?? () #13 0x0000000000000000 in ?? () 因为 backtrace 信息不完整,说明程序并不是在第一时间 crash 的。面对这种情况,为了快速找出第一现场,我们可以试试 AddressSanitizer(ASan): $ clang++ -g -O2 -fno-omit-frame-pointer -fsanitize=address crash.cpp $ ./a.out ================================================================= ==3699==ERROR: AddressSanitizer: global-buffer-overflow on address 0x000000552805 at pc 0x0000004ff83a bp 0x7ffd7610d240 sp 0x7ffd7610c9f0 READ of size 133 at 0x000000552805 thread T0 #0 0x4ff839 in __asan_memcpy (a.out+0x4ff839) #1 0x5390a7 in b2s[abi:cxx11](bool) crash.cpp:6 #2 0x5391be in main crash.cpp:16:18 #3 0x7faed604df42 in __libc_start_main (/usr/lib64/libc.so.6+0x23f42) #4 0x41c43d in _start (a.out+0x41c43d) 0x000000552805 is located 59 bytes to the left of global variable '<string literal>' defined in 'crash.cpp:6:25' (0x552840) of size 6 '<string literal>' is ascii string 'false' 0x000000552805 is located 0 bytes to the right of global variable '<string literal>' defined in 'crash.cpp:6:16' (0x552800) of size 5 '<string literal>' is ascii string 'true' SUMMARY: AddressSanitizer: global-buffer-overflow (/home/dutor.hou/Wdir/nebula-graph/build/bug/a.out+0x4ff839) in __asan_memcpy Shadow bytes around the buggy address: … ... 从 ASan 给出的信息,我们可以定位到是函数 b2s(bool) 在读取字符串常量 "true" 的时候,发生了“全局缓冲区溢出”。好了,我们再次以上帝视角审视一下问题函数和复现程序,“似乎”可以得出结论:因为 b2s 的布尔类型参数 b 没有初始化,所以 b 中存储的是一个 0 和 1 之外的值[1]。那么问题来了,为什么 b 的这种取值会导致“缓冲区溢出”呢?感兴趣的可以将 b 的类型由 bool 改成 char 或者 int,问题就可以得到修复。 想要解答这个问题,我们不得不看下 clang++ 为 b2s 生成了怎样的指令(之前我们提到 GCC 下没有出现 crash,所以问题可能和代码生成有关)。在此之前,我们应该了解: 样例程序中,b2s 的返回值是一个临时的 std::string 对象,是保存在栈上的 C++ 11 之后,GCC 的 std::string 默认实现使用了 SBO(Small Buffer Optimization),其定义大致为 std::string{ char *ptr; size_t size; union{ char buf[16]; size_t capacity}; }。对于长度小于 16 的字符串,不需要额外申请内存。 OK,那我们现在来看一下 b2s 的反汇编并给出关键注解: (gdb) disas b2s Dump of assembler code for function b2s[abi:cxx11](bool): 0x00401200 <+0>: push %r14 0x00401202 <+2>: push %rbx 0x00401203 <+3>: push %rax 0x00401204 <+4>: mov %rdi,%r14 # 将返回值(string)的起始地址保存到 r14 0x00401207 <+7>: mov $0x402010,%ecx # 将 "true" 的起始地址保存至 ecx 0x0040120c <+12>: mov $0x402015,%eax # 将 "false" 的起始地址保存至 eax 0x00401211 <+17>: test %esi,%esi # “测试” 参数 b 是否非零 0x00401213 <+19>: cmovne %rcx,%rax # 如果 b 非零,则将 "true" 地址保存至 rax 0x00401217 <+23>: lea 0x10(%rdi),%rdi # 将 string 中的 buf 起始地址保存至 rdi # (同时也是后面 memcpy 的第一个参数) 0x0040121b <+27>: mov %rdi,(%r14) # 将 rdi 保存至 string 的 ptr 字段,即 SBO 0x0040121e <+30>: mov %esi,%ebx # 将 b 的值保存至 ebx 0x00401220 <+32>: xor $0x5,%rbx # 将 0x5 异或到 rbx(也即 ebx) # 注意,如果 rbx 非 0 即 1,那么 rbx 保存的就是 4 或 5, # 即 "true" 或 "false" 的长度 0x00401224 <+36>: mov %rax,%rsi # 将字符串起始地址保存至 rsi,即 memcpy 的第二个参数 0x00401227 <+39>: mov %rbx,%rdx # 将字符串的长度保存至 rdx,即 memcpy 的第三个参数 0x0040122a <+42>: callq <memcpy@plt> # 调用 memcpy 0x0040122f <+47>: mov %rbx,0x8(%r14) # 将字符串长度保存到 string::size 0x00401233 <+51>: movb $0x0,0x10(%r14,%rbx,1) # 将 string 以 '\0' 结尾 0x00401239 <+57>: mov %r14,%rax # 将 string 地址保存至 rax,即返回值 0x0040123c <+60>: add $0x8,%rsp 0x00401240 <+64>: pop %rbx 0x00401241 <+65>: pop %r14 0x00401243 <+67>: retq End of assembler dump. 到这里,问题就无比清晰了: clang++ 假设了 bool 类型的值非 0 即 1 在编译期,”true” 和 ”false” 长度已知 使用异或指令( 0x5 ^ false == 5, 0x5 ^ true == 4)计算要拷贝的字符串的长度 当 bool 类型不符合假设时,长度计算错误 因为 memcpy 目标地址在栈上(仅对本例而言),因此栈上的缓冲区也可能溢出,从而导致程序跑飞,backtrace 缺失。 注: C++ 标准要求 bool类型至少_能够_表示两个状态: true和 false,但并没有规定 sizeof(bool)的大小。但在几乎所有的编译器实现上, bool都占用一个寻址单位,即字节。因此,从存储角度,取值范围为 0x00-0xFF,即 256 个状态。 喜欢这篇文章?来来来,给我们的 GitHub 点个 star 表鼓励啦~~ 🙇‍♂️🙇‍♀️ [手动跪谢] 交流图数据库技术?交个朋友,Nebula Graph 官方小助手微信:NebulaGraphbot 拉你进交流群~~ 推荐阅读 一次 Segmentation Fault 和 GCC Illegal Instruction 编译问题排查

优秀的个人博客,低调大师

全民直播牵手阿里云,技术升级触发直播新体验

免费开通大数据服务:https://www.aliyun.com/product/odps 【猎云网(微信:ilieyun)北京】1 月 21 日报道(文 / 王艺多) " 建设一家大型的直播平台充满了技术挑战。毫不夸张的说,直播平台囊括了几乎所有的主流互联网技术:Web 站点、App 客户端、音视频编解码、即时聊天、充值付费、送礼消费、社交互动、直播点播、卫星接收、实时互动……相比传统网站应用,直播平台还具有极高的实时性和突发性的特点,对技术故障的敏感度极高。种种问题无疑对平台建设的研发团队提出了更高的技术要求。『要盖多高的大厦,就要有多坚实的基石』。全民直播选择在阿里云上建设全新的 3.0 业务系统,正印证了这句话的价值。" ——全民直播 CTO 张云龙 在视频直播竞争如火如荼的 2015 年,作为后起之秀的全民直播,尽管其在 201

优秀的个人博客,低调大师

如何安全地参与多平台营销活动而不触发风控?

不少朋友参与平台的新用户成长激励活动、社区共建任务时,常常担心的就是:明明是正常参加,怎么账号突然就收到提醒甚至被限制了?很多人第一反应是"是不是动作太频繁",但真正的原因往往不在你点得快不快,而在你的账号"环境"和"行为"看起来像不像一个真实、独立、长期在正常使用的用户。参与平台营销活动,平台真正看重的不是你有没有参加,而是参加的人是不是真实、合规、各不相干。所以答案其实简单也很硬核:把每个参与活动的账号,都放在独立、干净、自洽的环境里长期运营,让平台看到的每一个账号都像真人在独立设备上正常参与。这篇文章就围绕"账号环境隔离与运营稳定性"把这个逻辑讲清楚,全程不谈任何收益和币种,只讲技术和运营本身,帮你把参与平台用户增长活动这件事做得更稳、更久。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册