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,提问作者임수환
相关产品推荐
相关产品推荐

