已关闭
并发导致的闪退2 #100
lvyandong创建于  8月14日关闭于  8月24日
lvyandong
8月14日 创建

0
#00 pc 00000000001c3974 /system/lib/ld-musl-aarch64.so.1 (raise+216) [::9dfb43ddce39af2e816005522a86e123]

8
#08 pc 00000000000cac68 /data/storage/el1/bundle/libs/arm64/libc++_shared.so (std::__n1::basic_string<char, std::__n1::char_traits, std::__n1::allocator>::basic_string(std::__n1::basic_string<char, std::__n1::char_traits, std::__n1::allocator> const&)+104) [::396a35e8f4806f252f90a11320d26ec6]
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, std::__n1::allocator>)+136) [::2a1743f7315a5f32136a90327f5c5533]
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]

问题分析报告

  1. 问题摘要
    问题名称:HTTP/2 流关闭回调中的内存分配失败崩溃
    异常解读:
    SIGABRT(6,-6):程序主动终止信号,通常由未捕获的 C++ 异常触发。
    std::bad_alloc:C++ 标准库抛出的异常,表示内存分配失败(如堆内存耗尽或大块内存请求失败)。
    关键调用栈帧:
    #07 operator new:尝试分配内存时失败。
    #08 std::string 拷贝构造:在复制字符串时触发内存分配。
    #10 OnStreamCloseCallback:HTTP/2 流关闭回调中发生崩溃。
    场景关联:崩溃发生在页面导航频繁切换时(如 SplashPage ↔ WalletLockPage),可能因网络请求激增导致内存压力。
  2. 可能原因及分析依据
    按可能性排序:
    ① 内存耗尽(最可能)
    依据:
    std::bad_alloc 直接表明堆内存不足。
    场景调用栈显示频繁页面切换(如 10 秒内 5 次页面跳转),可能伴随大量网络请求。
    HTTP/2 回调中分配内存(OnStreamCloseCallback),若同时处理多个流关闭,易引发瞬时内存峰值。
    根因推测:频繁创建/销毁对象导致内存碎片化,或未释放的请求积累耗尽内存。
    ② 大字符串拷贝导致分配失败
    依据:
    崩溃点位于 std::string 的拷贝构造函数(#08)。
    若被拷贝的字符串极大(如未截断的响应体),可能直接请求超大内存块失败。
    验证线索:检查 OnStreamCloseCallback 中处理的字符串来源(如 HTTP 头/体数据)。
    ③ 内存泄漏
    依据:
    长期运行的页面导航场景(如 Wallet_page ↔ My_Bill)可能积累未释放资源。
    HTTP/2 回调中若未正确释放 Connection 或 RequestTask 对象,会导致渐进式内存泄漏。
    佐证:结合内存监控工具观察内存增长趋势。
  3. 解决方案
    核心思路:优化内存分配 + 异常捕获
    修改示例(基于调用栈推测)
    假设 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(); // 紧急释放预设内存池
}
}

likedislike
程皖Orz
程皖Orz成员
8月15日 评论:

您好,您发的问题我们已接收到,看到您已经提供了解决方案,我们现在进行排查,如果明确是问题的话会有对应pr关联您的issue,如果是其他原因会在本issue下跟踪回复

likedislike
程皖Orz程皖Orz成员
8月24日 关联了pull request:修复稳定性崩溃问题
程皖Orz程皖Orz成员
8月24日 删除了关联的pull request:修复稳定性崩溃问题
程皖Orz程皖Orz成员
8月24日 关联了pull request:修复稳定性崩溃问题
程皖Orz程皖Orz成员
8月24日 删除了关联的pull request:修复稳定性崩溃问题
程皖Orz程皖Orz成员
8月24日 关联了pull request:修复稳定性崩溃问题
程皖Orz
程皖Orz成员
8月24日 评论:

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

likedislike
程皖Orz程皖Orz成员
8月24日 关闭了 issue
SettSett成员
9月22日 关联了pull request:fix: Fix the issue of UAF crash triggered by grpc probability.