You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

getPIDByName执行144次malloc崩溃及readFromAccel内存写入异常排查

内存相关问题排查方案

问题1:getPIDByName函数周期性触发malloc段错误

现象

每执行144次getPIDByName函数时,会在fscanf调用链中的malloc环节触发SIGSEGV段错误。

已完成排查

  • 存在内存泄漏,但系统剩余内存充足(50~55GB),swap配置为200GB
  • 进程内存限制ulimit -v设为unlimited,64位系统排除地址空间耗尽可能
  • 调整malloc调用位置后,错误转移至新的malloc行,未定位根因

排查建议

  • 检查malloc元数据损坏:内存越界写、非法free等操作会破坏malloc的chunk元数据,即使剩余内存充足也会导致后续malloc崩溃。可通过以下方式验证:
    • 启动程序时设置环境变量export MALLOC_CHECK_=1,malloc检测到错误会直接输出详细报错信息
    • 使用mtrace跟踪malloc/free调用:编译时加-g参数,运行前设置export MALLOC_TRACE=mtrace.log,程序结束后执行mtrace 程序名 mtrace.log分析是否存在非法内存操作
  • 验证fscanf参数合法性:检查每次循环中fscanf的格式字符串、传入指针是否存在野指针或越界情况,某次非法参数可能破坏内存结构,积累到144次时触发崩溃
  • 排查144次的周期关联:检查是否存在资源泄漏(如文件句柄、线程),当资源达到144个时触发系统限制,间接导致内存操作异常。可使用lsof -p 进程ID实时监控文件句柄变化
  • gdb捕获崩溃现场:崩溃时执行bt full查看栈帧和寄存器值,检查malloc内部处理的chunk元数据是否被篡改,定位具体损坏的内存区域

问题2:readFromAccel函数fread触发无效内存写入

现象

valgrind检测到readFromAccel函数中fread存在无效内存写入,报错地址不属于栈、malloc分配或刚释放的内存区域;函数接收的data指针由MLIR通过memref.alloc分配并传递。

排查建议

  • 验证memref分配的有效性:检查MLIR代码中memref.alloc的参数是否正确,确认分配的内存大小是否足够容纳fread要读取的数据量。比如如果fread要读取1024字节,但memref仅分配512字节,会直接导致越界写入
  • 检查memref生命周期:确认data指针在fread执行期间是否仍处于有效状态,是否存在MLIR pass异步释放该memref的情况,导致指针悬空后触发非法写入
  • 校验fread参数:确认data指针、读取字节数size、文件流stream的合法性,比如文件流是否已被关闭、size计算错误导致写入超出预期范围
  • 跟踪fread执行过程:用gdb在readFromAccel函数内设置断点,通过x/10x data查看data指针的内存范围,单步执行fread,观察写入地址是否真的超出分配范围,或是否有其他线程篡改该内存区域
  • 检查MLIR代码生成:查看memref.alloc生成的LLVM IR或机器码,确认内存分配逻辑是否正确,是否存在地址计算错误导致data指针指向非法内存区域

内容的提问来源于stack exchange,提问作者임수환

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:53:20