已关闭
并发导致的闪退2 #100
lvyandong创建于 8月14日关闭于 8月24日
程皖Orz
8月15日 评论:
8月15日 评论:
您好,您发的问题我们已接收到,看到您已经提供了解决方案,我们现在进行排查,如果明确是问题的话会有对应pr关联您的issue,如果是其他原因会在本issue下跟踪回复


8月24日 关联了pull request:修复稳定性崩溃问题
8月24日 删除了关联的pull request:修复稳定性崩溃问题
8月24日 关联了pull request:修复稳定性崩溃问题
8月24日 删除了关联的pull request:修复稳定性崩溃问题
8月24日 关联了pull request:修复稳定性崩溃问题
程皖Orz
8月24日 评论:
8月24日 评论:
您好,针对这个堆栈,我们尝试进行了复现,并且已有demo复现成功,已经提了pr https://gitcode.com/CPF-ApplicationTPC/ohos_grpc_node/pull/99 ,按照正常流程,这个pr先进行关闭处理,您可以看下我们修改的内容,如果有疑问之类的欢迎再次提交issue


8月24日 关闭了 issue
9月22日 关联了pull request:fix: Fix the issue of UAF crash triggered by grpc probability.
0
#00 pc 00000000001c3974 /system/lib/ld-musl-aarch64.so.1 (raise+216) [::9dfb43ddce39af2e816005522a86e123]
8, std::__n1::allocator>::basic_string(std::__n1::basic_string<char, std::__n1::char_traits, std::__n1::allocator> const&)+104) [::396a35e8f4806f252f90a11320d26ec6], std::__n1::allocator>)+136) [::2a1743f7315a5f32136a90327f5c5533]
#08 pc 00000000000cac68 /data/storage/el1/bundle/libs/arm64/libc++_shared.so (std::__n1::basic_string<char, std::__n1::char_traits
9
#09 pc 000000000006bfc8 /data/storage/el1/bundle/libs/arm64/libhttp2_napi.so [::2a1743f7315a5f32136a90327f5c5533]
10
#10 pc 0000000000052588 /data/storage/el1/bundle/libs/arm64/libhttp2_napi.so (OnStreamCloseCallback(nghttp2_session*, int, unsigned int, void*)+1620) [::2a1743f7315a5f32136a90327f5c5533]
11
#11 pc 0000000000018a88 /data/storage/el1/bundle/libs/arm64/libnghttp2.so.14 [::2d114b6e2fccab8f7e1090125d27feb4]
12
#12 pc 000000000001ed5c /data/storage/el1/bundle/libs/arm64/libnghttp2.so.14 (nghttp2_session_mem_recv2+7416) [::2d114b6e2fccab8f7e1090125d27feb4]
13
#13 pc 000000000001f5c4 /data/storage/el1/bundle/libs/arm64/libnghttp2.so.14 (nghttp2_session_recv+140) [::2d114b6e2fccab8f7e1090125d27feb4]
14
#14 pc 0000000000054a64 /data/storage/el1/bundle/libs/arm64/libhttp2_napi.so (HandleIo(Connection*, std::__n1::basic_string<char, std::__n1::char_traits
15
#15 pc 0000000000057304 /data/storage/el1/bundle/libs/arm64/libhttp2_napi.so (ReadWriteBuffer(pollfd*, int, Connection&, RequestTask*, bool&)+264) [::2a1743f7315a5f32136a90327f5c5533]
16
#16 pc 000000000003dec4 /data/storage/el1/bundle/libs/arm64/libhttp2_napi.so (HandleWritePooled(RequestTask*)+4804) [::2a1743f7315a5f32136a90327f5c5533]
17
#17 pc 0000000000067320 /system/lib64/platformsdk/libace_napi.z.so (NativeAsyncWork::AsyncWorkCallback(uv_work_s*)+304) [::450a6d44bdb4f26d59104e95c83ef40c]
23
#23 pc 00000000001e3ba8 /system/lib/ld-musl-aarch64.so.1 (start+240) [::9dfb43ddce39af2e816005522a86e123]
问题分析报告
问题名称:HTTP/2 流关闭回调中的内存分配失败崩溃
异常解读:
SIGABRT(6,-6):程序主动终止信号,通常由未捕获的 C++ 异常触发。
std::bad_alloc:C++ 标准库抛出的异常,表示内存分配失败(如堆内存耗尽或大块内存请求失败)。
关键调用栈帧:
#07 operator new:尝试分配内存时失败。
#08 std::string 拷贝构造:在复制字符串时触发内存分配。
#10 OnStreamCloseCallback:HTTP/2 流关闭回调中发生崩溃。
场景关联:崩溃发生在页面导航频繁切换时(如 SplashPage ↔ WalletLockPage),可能因网络请求激增导致内存压力。
按可能性排序:
① 内存耗尽(最可能)
依据:
std::bad_alloc 直接表明堆内存不足。
场景调用栈显示频繁页面切换(如 10 秒内 5 次页面跳转),可能伴随大量网络请求。
HTTP/2 回调中分配内存(OnStreamCloseCallback),若同时处理多个流关闭,易引发瞬时内存峰值。
根因推测:频繁创建/销毁对象导致内存碎片化,或未释放的请求积累耗尽内存。
② 大字符串拷贝导致分配失败
依据:
崩溃点位于 std::string 的拷贝构造函数(#08)。
若被拷贝的字符串极大(如未截断的响应体),可能直接请求超大内存块失败。
验证线索:检查 OnStreamCloseCallback 中处理的字符串来源(如 HTTP 头/体数据)。
③ 内存泄漏
依据:
长期运行的页面导航场景(如 Wallet_page ↔ My_Bill)可能积累未释放资源。
HTTP/2 回调中若未正确释放 Connection 或 RequestTask 对象,会导致渐进式内存泄漏。
佐证:结合内存监控工具观察内存增长趋势。
核心思路:优化内存分配 + 异常捕获
修改示例(基于调用栈推测)
假设 OnStreamCloseCallback 中存在字符串拷贝:
// 修改前(易崩溃)
void OnStreamCloseCallback(...) {
std::string logData = someLargeString; // 潜在大内存分配
SendToLogService(logData);
}
修改后方案:
#include
void OnStreamCloseCallback(...) {
// 方案1:改用指针避免拷贝(推荐)
auto logDataPtr = std::make_sharedstd::string(std::move(someLargeString));
SendToLogServiceAsync(logDataPtr); // 异步处理避免阻塞
// 方案2:捕获异常并降级
try {
std::string logData = someLargeString;
SendToLogService(logData);
} catch (const std::bad_alloc&) {
LogError("Memory exhausted in stream close");
ReleaseEmergencyMemory(); // 紧急释放预设内存池
}
}