INET3路由协议代码迁移至INET4触发Exit code 139错误如何解决
问题根因
Exit code 139属于Linux环境下的段错误,此处是mobility指针为空导致的非法内存访问,核心原因是INET 3到INET 4版本中获取移动性模块的接口逻辑发生了变更,原有INET 3的模块获取方式拿到的是空指针。
适配修改步骤
- 第一步:确认当前节点模块的移动性子模块路径配置正确,veins-5.1-i2配套的
veins-inet Mobility模块默认挂载路径为节点的mobility子模块,无需额外修改路径。 - 第二步:替换原有INET 3风格的移动性模块获取代码,INET 4要求使用
getModuleFromPar接口从参数绑定模块,示例代码如下:
// 原有INET 3写法(会拿到空指针导致崩溃) // mobility = check_and_cast<IMobility*>(getParentModule()->getSubmodule("mobility")); // 替换为INET 4兼容写法 #include "inet/mobility/contract/IMobility.h" mobility = inet::getModuleFromPar<inet::IMobility>(par("mobilityModule"), this);
- 第三步:在你的路由协议NED文件中新增
mobilityModule参数声明,示例如下:
module YourRoutingProtocol extends <你原有继承的协议父类> { parameters: string mobilityModule = default("^.mobility"); // 指向节点的mobility子模块 // 其他原有参数保持不变 }
- 第四步:清理项目后重新编译运行,验证
Coord senderPos=mobility->getCurrentPosition();调用是否正常。
补充排查点
如果修改后仍报错,可依次确认:
- veins-inet依赖包已经正确引入到项目的
opp_makemake配置中,没有头文件找不到或链接错误 - 节点的NED配置中确实挂载了
veins.inet.mobility.TraCIMobility作为mobility子模块,没有拼写错误
内容的提问来源于stack exchange,提问作者Dalia Adly
相关产品推荐
相关产品推荐

