一个ILLEGLE INSTRUCTION转SEGMENT FAULT的诡异CORE

absunique 2016-05-09 03:24:34
碰到一个ILLEGAL INSTRUCTION后面转SEGMANET FAULT的诡异的问题,求助一下……
先简单描述一下代码结果,实际比这个复杂,但大概也差不多
a1.c/a2.c/a3.c=>LIBA.SO
e.c + LIBA.SO=>execBin

下面我开始讲述一下,查找原因的过程(前后一个月……悲剧,到现在还没找到原因),感觉进展都可以写成一个小小说了……

阶段一,这个时候,CORE原因是ILLEGAL INSTRUCTION。
只有一个ILLEGAL INSTRUCTION,文件里有CORE的地方,但是根本无法定位原因。
因此只能开始瞎猜,首先怀疑LIBA.SO,因为这是一个开源代码基本上改过来的,唯一使用MALLOC的地方。
考虑到这个SO的功能是解析配置文件,只会有主线程调用,因此将LIBA.SO中动态分配内存(MALLOC/CALLOC/STRDUP)的地方,全部改成静态分配(全局BUFFER)。

改完之后,CORE消失,但是代码本身检查过,没有问题,而且有问题,为何会造成ILLEGAL INSTRUCTION?这感觉像是段错误覆盖了栈中的代码导致?后面再看

阶段二,中间有个小插曲:因为这套代码在操作系统升级前后都跑过,升级后才有的CORE,因此使用两个环境复现:
AIX7.1.2 未出现
AIX7.1.3 基于7.1.3全新编译或使用7.1.2编译的均会出现ILLEGAL INSTRUCTION。
暂时感觉毫无任何帮助。

阶段三:
因为ILLEGAL INSTRUCTION出现的慢(不停的运行过程中才出),所以在A函数中,使用了一些无用的变量(几百K),结果在A调用B时,立马出现CORE
此时CORE变成了SEGMENT FAULT。
这里的函数A是一个用户线程的入口函数,其间会调用函数B。
尝试在创建线程A的时候,增加堆栈大小,段错误消失。

阶段四:
这里肯定要问,是不是我加的变量导致SEGMENT FAULT?
没错,但是函数A内的变量少的可怜,是谁导致它,回想到阶段一改了LIBA.SO,如何证明和LIBA.SO有关系。
于是,验证如下:
首先调用LIBA.SO中的内容,都是在主线程,在A线程中没有调用。
其次因为LIBA.SO是解析配置文件,文件越在,MALLOCL的内存越多。
好了,程序任何都不改,只改配置文件,结果:
小的配置文件,不CORE
大的配置文件,必CORE
也就是说,导致线程堆栈溢出的,并不是用户线程A中的临时变量, 而是主线程调用LIBA.SO,导致堆栈溢出。

联想起阶段一,LIBA.SO的嫌疑越来越大。

到现在,由于线头太多,全部梳理出来几个关键点:
1、LIBA.SO中动态分配内存,改成静态,OK不CORE
2、用户线程A堆栈溢出,加大堆栈,OK不CORE了
3、上述任何作法,在两个操作系统中,都是7.1.2不CORE 7.1.3CORE,即使是完全同构的代码,这和操作系统有什么关系?

问题是,什么导致溢出的?是LIBASO分配的堆的内存使用越界,导致栈溢出吗?不同操作系统保护不一样?
...全文
419 14 打赏 收藏 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-05-16
  • 打赏
  • 举报
回复
没准底层具体实现malloc时,至少需要一定大小的堆栈空间支持。
absunique 2016-05-16
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
使用link的命令行参数设置更大的堆栈。 仅供参考: /STACK (Stack Allocations) Home | Overview | How Do I | Linker Options The Stack Allocations (/STACK:reserve[,commit]) option sets the size of the stack in bytes. To find this option in the development environment, click Settings on the Project menu. Then click the Link tab, and click Output in the Category box. The Reserve text box (or in the reserve argument on the command line) specifies the total stack allocation in virtual memory. The default stack size is 1 MB. The linker rounds up the specified value to the nearest 4 bytes. The optional value specified in the Commit text box (or in the commit argument on the command line) is subject to interpretation by the operating system. In Windows NT, it specifies the amount of physical memory to allocate at a time. Committed virtual memory causes space to be reserved in the paging file. A higher commit value saves time when the application needs more stack space, but increases the memory requirements and possibly the startup time. Specify the reserve and commit values in decimal or C-language notation. Another way to set the size of the stack is with the STACKSIZE statement in a module-definition (.DEF) file. STACKSIZE overrides the Stack Allocations (/STACK) option if both are specified. You can change the stack after the .EXE file is built by using the EDITBIN tool.
增加堆栈的确可以解决。问题是没有定位到原因……该线程的局部变量非常少,而且在主线程中,如果使用的LIBA.SO中不用MALLOC,工作线程中的堆栈问题也就没有了,这个很奇怪。
赵4老师 2016-05-16
  • 打赏
  • 举报
回复
使用link的命令行参数设置更大的堆栈。 仅供参考: /STACK (Stack Allocations) Home | Overview | How Do I | Linker Options The Stack Allocations (/STACK:reserve[,commit]) option sets the size of the stack in bytes. To find this option in the development environment, click Settings on the Project menu. Then click the Link tab, and click Output in the Category box. The Reserve text box (or in the reserve argument on the command line) specifies the total stack allocation in virtual memory. The default stack size is 1 MB. The linker rounds up the specified value to the nearest 4 bytes. The optional value specified in the Commit text box (or in the commit argument on the command line) is subject to interpretation by the operating system. In Windows NT, it specifies the amount of physical memory to allocate at a time. Committed virtual memory causes space to be reserved in the paging file. A higher commit value saves time when the application needs more stack space, but increases the memory requirements and possibly the startup time. Specify the reserve and commit values in decimal or C-language notation. Another way to set the size of the stack is with the STACKSIZE statement in a module-definition (.DEF) file. STACKSIZE overrides the Stack Allocations (/STACK) option if both are specified. You can change the stack after the .EXE file is built by using the EDITBIN tool.
absunique 2016-05-16
  • 打赏
  • 举报
回复
引用 9 楼 DTCPzhuxh 的回复:
不能明确的帮楼主解决问题。之前我有遇到过相同的程序一个在aix下运行则能正常运行,但是在linux下则报段错误,所以不同的操作系统保护措施肯定是有些区别的。 给楼主两点建议: 1、aix的话用dbx应该是可以调处段错误的位置; 2、还有我看楼主多次提到malloc,不知道楼主malloc用完之后有没有使用free。
另外段错误的位置是一个SPRINTF,感觉很像线程堆栈不够用了。
absunique 2016-05-16
  • 打赏
  • 举报
回复
引用 9 楼 DTCPzhuxh 的回复:
不能明确的帮楼主解决问题。之前我有遇到过相同的程序一个在aix下运行则能正常运行,但是在linux下则报段错误,所以不同的操作系统保护措施肯定是有些区别的。 给楼主两点建议: 1、aix的话用dbx应该是可以调处段错误的位置; 2、还有我看楼主多次提到malloc,不知道楼主malloc用完之后有没有使用free。
引用 9 楼 DTCPzhuxh 的回复:
不能明确的帮楼主解决问题。之前我有遇到过相同的程序一个在aix下运行则能正常运行,但是在linux下则报段错误,所以不同的操作系统保护措施肯定是有些区别的。 给楼主两点建议: 1、aix的话用dbx应该是可以调处段错误的位置; 2、还有我看楼主多次提到malloc,不知道楼主malloc用完之后有没有使用free。
1、DBX使用REGISTERS看到有 STDU R3,-3240(R3) 这样的地方,但是这句命令看不出有啥异常啊…… 2、MALLOC使的FREE有用,但是即使不用最多也是内存泄漏,现在感觉像是堆栈溢出……
赵4老师 2016-05-10
  • 打赏
  • 举报
回复
会用→会有
赵4老师 2016-05-10
  • 打赏
  • 举报
回复
AIX会用同样问题。我觉得。
absunique 2016-05-10
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
[quote=引用 2 楼 absunique 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] C Run-Time Libraries http://msdn.microsoft.com/zh-cn/library/abx4dbyh(VS.80).aspx
请问和这个有什么关系啊?[/quote] 里面应该说明了在库中调用C Run-Time Libraries中的malloc类函数时需要注意的几个方面。[/quote]
引用 3 楼 zhao4zhong1 的回复:
[quote=引用 2 楼 absunique 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] C Run-Time Libraries http://msdn.microsoft.com/zh-cn/library/abx4dbyh(VS.80).aspx
请问和这个有什么关系啊?[/quote] 里面应该说明了在库中调用C Run-Time Libraries中的malloc类函数时需要注意的几个方面。[/quote] 大哥,我是AIX的……
DTCPzhuxh 2016-05-10
  • 打赏
  • 举报
回复
不能明确的帮楼主解决问题。之前我有遇到过相同的程序一个在aix下运行则能正常运行,但是在linux下则报段错误,所以不同的操作系统保护措施肯定是有些区别的。 给楼主两点建议: 1、aix的话用dbx应该是可以调处段错误的位置; 2、还有我看楼主多次提到malloc,不知道楼主malloc用完之后有没有使用free。
赵4老师 2016-05-10
  • 打赏
  • 举报
回复
Potential Errors Passing CRT Objects Across DLL Boundaries. https://msdn.microsoft.com/zh-cn/library/ms235460(v=vs.80).aspx
absunique 2016-05-10
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
会用→会有
引用 6 楼 zhao4zhong1 的回复:
会用→会有
引用 6 楼 zhao4zhong1 的回复:
会用→会有
你这个链接里没有啊,能不能发具体的链接?
赵4老师 2016-05-09
  • 打赏
  • 举报
回复
引用 2 楼 absunique 的回复:
[quote=引用 1 楼 zhao4zhong1 的回复:] C Run-Time Libraries http://msdn.microsoft.com/zh-cn/library/abx4dbyh(VS.80).aspx
请问和这个有什么关系啊?[/quote] 里面应该说明了在库中调用C Run-Time Libraries中的malloc类函数时需要注意的几个方面。
absunique 2016-05-09
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
C Run-Time Libraries http://msdn.microsoft.com/zh-cn/library/abx4dbyh(VS.80).aspx
请问和这个有什么关系啊?
赵4老师 2016-05-09
  • 打赏
  • 举报
回复
内容概要:本文针对质子交换膜燃料电池(PEMFC)在动态压力工况下的最大功率点跟踪(MPPT)问题,提出了一种压力工况协同调控下的自适应高阶滑模控制策略,并基于Simulink平台完成了系统建模与仿真实现。该策略融合高阶滑模控制的强鲁棒性与自适应机制的参数在线优化能力,有效克服了PEMFC系统固有的非线性、外部扰动及工况时变性等挑战,实现了对最大功率点的快速、精确与稳定跟踪。研究内容涵盖控制策略的理论设计、李雅普诺夫稳定性分析、自适应律构建以及在多种动态工况下的仿真实验验证,结果表明该方法相较于传统控制策略具有更快的动态响应速度、更小的稳态振荡以及更强的抗干扰能力,显著提升了PEMFC系统的能量转换效率与运行稳定性。; 适合人群:具备一定控制理论基础和Simulink仿真经验,从事新能源发电系统、燃料电池控制、电力电子变换或先进控制算法研究的研发人员及高校研究生。; 使用场景及目标:①应用于燃料电池发电系统的高性能最大功率点跟踪控制设计;②为解决强非线性、多扰动耦合的能源系统提供先进的自适应鲁棒控制方案;③通过Simulink仿真验证高阶滑模与自适应控制算法的有效性,服务于科研项目攻关或工程原型开发。; 阅读建议:建议读者结合Simulink模型同步学习,重点关注控制律设计原理、自适应机制实现方式及仿真结果对比分析部分,并可通过与传统滑模控制进行对比,深入理解该策略在鲁棒性与动态性能上的优越性。
下拉可见数据集可视化效果示意。 【数据集概况】 · 检测类别(中文):[滴落物(Drop)] · 训练集:2021 张 · 验证集:128 张 · 测试集:42 张 · 总计:2191 张 该数据集聚焦于工业生产环境中地面或设备表面出现的各类滴落物检测,通过多角度、多光照条件下的图像采集,全面覆盖了不同形态、颜色和材质的滴落物样本。数据集真实还原了车间地面、金属板、木质结构等复杂背景下的实际场景,为自动化巡检系统提供了高价值的视觉依据,有助于实现对潜在污染源或泄漏点的早期识别与预警。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 71 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.8949** mAP50-95 | 0.5139 Precision | 0.8991 Recall | 0.8527 train/box_loss | 0.8544 train/cls_loss | 0.4842 val/box_loss | 1.5612 val/cls_loss | 0.6862 【训练过程分析】 71 轮训练后 mAP50 为 0.8949,模型基本收敛但还有提升余地。Loss 曲线下降正常,后期趋于平缓。mAP50-95 为 0.5139,和 mAP50 差距 0.38,定位精度是主要短板。 【模型性能评估】 Precision 0.8991、Recall 0.8527,精度高于召回,存在一定漏检。 【预测效果展示】 验证集预测效果较好,检测框基本准确覆盖滴落物,置信度整体偏高。 【改进建议】 1. 增强难例挖掘:在大规模数据中筛选误检...
【2026年华为杯D题】山区洪涝灾害下无人机运输与通信协同优化(思路、代码、论文,持续更新)内容概要:本文围绕山区洪涝灾害背景下无人机在运输与通信任务中的协同优化问题展开研究,旨在通过数学建模与算法设计解决复杂地理环境下的应急响应难题。文中提出了综合考虑无人机飞行路径规划、物资投送效率、通信中继覆盖能力及多机协同控制的优化模型,并结合智能优化算法(如灰狼优化算法、鲸鱼算法等)进行求解,确保在灾情紧急、基础设施受损的情况下实现高效、可靠的救援支持。研究涵盖了从任务建模、约束条件设定到多目标优化框架构建的全过程,强调了算法在实际场景中的鲁棒性与适应性。; 适合人群:具备一定编程基础和运筹优化知识,从事应急管理、无人机应用或智能算法研究的研发人员及高校研究生。; 使用场景及目标:①应对山区洪涝等自然灾害时的无人机应急物流与通信保障;②提升多无人机系统在复杂环境下的协同作业能力,优化路径规划与资源分配策略;③为相关科研项目提供可复现的算法模型与仿真代码参考。; 阅读建议:建议结合文中提供的Matlab代码进行实践操作,重点关注多目标优化模型的构建逻辑与智能算法的实现细节,同时可参照其他类似无人机路径规划案例加深理解,以实现理论与应用的有效结合。

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧