HarmonyOS鸿蒙Next线上监控,遇到了crash的日志,SIGSEGV(SEGV_MAPERR)@000000000000000000 probably caused by NULL pointer dereference?

HarmonyOS鸿蒙Next线上监控,遇到了crash的日志,SIGSEGV(SEGV_MAPERR)@000000000000000000 probably caused by NULL pointer dereference? 线上监控,遇到了crash的日志,这个是什么原因导致的?

Reason:Signal:SIGSEGV(SEGV_MAPERR)@000000000000000000 probably caused by NULL pointer dereference Fault thread info: Tid:62193, Name:OS_FFRT_3_3

  • #00 pc 00000000000d837c /system/lib64/platformsdk/libextplugin.z.so(OHOS::ImagePlugin::JpegHardwareDecoder::InitDecoder()+184)(d809ad463b74fdd1556b2b04bdc60223)
  • #01 pc 00000000000a1fcc /system/lib64/platformsdk/libextplugin.z.so(OHOS::ImagePlugin::ExtDecoder::InitJpegDecoder()+132)(d809ad463b74fdd1556b2b04bdc60223)
  • #02 pc 00000000000e44d8 /system/lib64/platformsdk/libimage_native.z.so(OHOS::Media::ImageSource::InitDecoderForJpeg()+456)(89d7c1c202c9ab814c5f18cc35d36e46)
  • #03 pc 00000000000eaef8 /system/lib64/platformsdk/libimage_native.z.so(OHOS::Media::ImageSource::CreatePixelMap(unsigned int, OHOS::Media::DecodeOptions const&, unsigned int&)+472)(89d7c1c202c9ab814c5f18cc35d36e46)
  • #04 pc 00000000000e803c /system/lib64/platformsdk/libimage_native.z.so(OHOS::Media::ImageSource::CreatePixelMapEx(unsigned int, OHOS::Media::DecodeOptions const&, unsigned int&)+888)(89d7c1c202c9ab814c5f18cc35d36e46)
  • #05 pc 00000000000ba280 /system/lib64/platformsdk/libimage_napi.z.so(OHOS::Media::CreatePixelMapInner(OHOS::Media::ImageSourceNapi*, std::__h::shared_ptrOHOS::Media::ImageSource, unsigned int, OHOS::Media::DecodeOptions, unsigned int&)+332)(6d94ad2d07e06590c6970b4564e53de4)
  • #06 pc 00000000000bb66c /system/lib64/platformsdk/libimage_napi.z.so(OHOS::Media::CreatePixelMapExecute(napi_env__, void) (.1835.cfi)+332)(6d94ad2d07e06590c6970b4564e53de4)
  • #07 pc 0000000000079f84 /system/lib64/platformsdk/libace_napi.z.so(NativeAsyncWork::AsyncWorkCallback(uv_work_s*)+500)(9a6c64e04b99f8978e8b7e78192bf769)
  • #08 pc 0000000000013230 /system/lib64/platformsdk/libuv.so(uv__queue_work+56)(aeff7f340f561902ca2aa84c6862b719)
  • #09 pc 0000000000096514 /system/lib64/ndk/libffrt.so(ffrt::UVTask::ExecuteImpl(ffrt::UVTask*, void ()(ffrt_executor_task, int))+256)(17ccc4a3fad5b42360a91caaf88a38e4)
  • #10 pc 00000000000929b0 /system/lib64/ndk/libffrt.so(ffrt::ExecuteTask(ffrt::TaskBase*)+252)(17ccc4a3fad5b42360a91caaf88a38e4)
  • #11 pc 0000000000062228 /system/lib64/ndk/libffrt.so(ffrt::CPUWorker::RunTask(ffrt::TaskBase*, ffrt::CPUWorker*)+108)(17ccc4a3fad5b42360a91caaf88a38e4)
  • #12 pc 00000000000624fc /system/lib64/ndk/libffrt.so(ffrt::CPUWorker::WorkerLooper(ffrt::CPUWorker*)+396)(17ccc4a3fad5b42360a91caaf88a38e4)
  • #13 pc 0000000000048020 /system/lib64/ndk/libffrt.so(ffrt::CPUWorker::Dispatch(ffrt::CPUWorker*)+212)(17ccc4a3fad5b42360a91caaf88a38e4)
  • #14 pc 0000000000047df4 /system/lib64/ndk/libffrt.so(ffrt::CPUWorker::WrapDispatch(void*)+60)(17ccc4a3fad5b42360a91caaf88a38e4)
  • #15 pc 00000000001d0858 /system/lib/ld-musl-aarch64.so.1(start+240)(f83970fe414a8a0eaeb706794b1b2f7b)

Registers:

x0:00008cc939efda34 x1:0000005c83fd1ca8 x2:0000000000000000 x3:0000005c83fd16a0 x4:0000005c83fd1685 x5:0000005c83fd16c2 x6:0000000000000031 x7:7f7f7f7f7f7f7f7f x8:0000005b629c7c8c x9:f5f8cb150eec92bd x10:0000000000000000 x11:00000000311d6b0f x12:000000003b9ac9ff x13:0000000000b94b68 x14:0000000000086210 x15:0000000000000000 x16:0000005b500d34d0 x17:0000005ac416ceec x18:0000000000000001 x19:0000000000000000 x20:0000005c89e40cb0 x21:0000005b500d2a78 x22:0000005c89673218 x23:0000005b64b802fc x24:0000005b498a0a08 x25:0000005c89dc6500 x26:0000000000000000 x27:0000005c83fd2468 x28:0000000000000001 x29:0000005c83fd1d20 lr:0000005b64c58368 sp:0000005c83fd1cd0 pc:0000005b64c5837c pstate:0000000060001000 esr:0000000092000007


更多关于HarmonyOS鸿蒙Next线上监控,遇到了crash的日志,SIGSEGV(SEGV_MAPERR)@000000000000000000 probably caused by NULL pointer dereference?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

日志里面出现最多是CreatePixelMap,这个是图片相关操作,建议你查下图片处理相关ImageSource有没有为空的情况。

cke_1087.png

更多关于HarmonyOS鸿蒙Next线上监控,遇到了crash的日志,SIGSEGV(SEGV_MAPERR)@000000000000000000 probably caused by NULL pointer dereference?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


SIGSEGV(SEGV_MAPERR) 表示内存访问违规,地址0x0000000000000000是空指针。在HarmonyOS Next中,这通常是由于应用尝试解引用空指针或访问未映射的内存地址导致的。请检查应用代码中指针的使用,特别是涉及JNI、Native API或ArkTS/ArkUI中C++组件交互的部分,确保指针有效且内存已正确分配。

根据你提供的日志,这是一个典型的空指针解引用导致的 SIGSEGV 段错误。具体分析如下:

1. 根本原因: 日志明确提示 probably caused by NULL pointer dereference,且错误地址为 0x0000000000000000。这表明程序试图访问或操作一个空指针(NULL)指向的内存地址,这在操作系统中是非法操作,会立即触发段错误并崩溃。

2. 问题定位: 崩溃堆栈清晰地指向了图像解码模块:

  • 崩溃发生在 libextplugin.z.so 动态库的 OHOS::ImagePlugin::JpegHardwareDecoder::InitDecoder() 函数中(#00)。
  • 调用链显示,这是在尝试创建 PixelMap(#03-#05)时,初始化JPEG解码器(#01-#02)的过程中发生的。

3. 具体分析:InitDecoder() 函数内部,极有可能在未对某个关键的类成员指针(例如解码器上下文、硬件缓冲区句柄、输入数据指针等)进行有效性检查的情况下,直接对其进行了访问、赋值或调用方法。从寄存器信息看,x19 寄存器的值为 0x0000000000000000,这很可能就是那个未被正确初始化或已释放的空指针。

4. 触发场景: 这种情况通常发生在:

  • 传入的图像数据(JPEG)本身异常或已损坏,导致解码器初始化失败,但后续代码未处理该失败情况。
  • 解码器对象(JpegHardwareDecoder)或其依赖的某个资源(如硬件加速器上下文)在初始化完成前就被访问,或在并发操作中被意外释放。
  • 内存压力过大,导致某些关键对象在分配时失败,返回了空指针。

5. 解决方向:

  • 代码审查: 重点检查 JpegHardwareDecoder::InitDecoder() 及其调用栈中上层函数的代码。确保所有指针成员在访问前都已有效初始化,并对可能失败的资源分配(如 newmalloc、系统调用返回的句柄)进行判空处理。
  • 数据校验: 在调用 ImageSource 相关接口创建 PixelMap 前,增加对输入图像数据(PixelMap)有效性的校验。
  • 并发安全: 如果图像解码操作可能在多线程(FFRT任务)环境下进行,需检查 JpegHardwareDecoder 及相关数据结构是否具备线程安全性,或在访问时加锁保护。
  • 资源管理: 检查是否存在资源(如硬件解码器实例)生命周期管理不当的问题,确保在对象析构时正确释放资源,避免悬空指针。

总结:问题根源在于图像解码库中,JPEG硬件解码器初始化路径存在空指针访问缺陷。需要结合具体业务代码和图像数据,对解码器的初始化逻辑和资源管理进行加固。

回到顶部