一个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分配的堆的内存使用越界,导致栈溢出吗?不同操作系统保护不一样?
...全文
409 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
  • 打赏
  • 举报
回复
内容概要:本文围绕基于CNN-BiLSTM-Attention混合神经网络模型的电力负荷预测展开研究,提出一种结合卷积神经网络(CNN)、双向长短期记忆网络(BiLSTM)与注意力机制(Attention)的深度学习框架,并通过Python代码实现高精度的短期与超短期负荷预测。该模型充分利用CNN对局部特征的提取能力,捕捉负荷数据中的周期性与趋势性模式;借助BiLSTM对时间序列前后向依赖关系的建模能力,增强对动态变化的感知;并通过Attention机制自适应地聚焦关键历史时刻,提升预测准确性。文中详细阐述了数据预处理、模型结构设计、训练流程及超参数调优方法,并在真实负荷数据集上进行了实验验证,结果表明该混合模型相比传统单一模型和其他基准模型具有更优的预测性能,尤其在应对非线性、非平稳负荷波动方面表现突出。; 适合人群:具备一定Python编程能力和机器学习基础,从事电力系统分析、能源管理、智能电网或时序预测相关工作的科研人员、工程师及高校研究生。; 使用场景及目标:①应用于电网调度、电力市场出清、需求响应管理等场景下的精细化负荷预测;②为研究人员提供一套完整的、可复现的深度学习负荷预测代码框架,推动AI技术在能源领域的落地应用;③帮助理解CNN、BiLSTM与Attention模块之间的协同机制及其在时序建模中的集成方式。; 阅读建议:建议读者结合所提供的Python代码进行动手实践,重点掌握数据归一化、滑动窗口构造、模型搭建与训练技巧,并尝试在不同地区、不同季节的负荷数据上进行迁移测试,以深入理解模型泛化能力与调参策略。
内容概要:本文围绕“MATLAB具有储能的经济调度及机会约束和鲁棒优化”展开,系统研究了电力系统中融合储能技术的经济调度问题,重点探讨了机会约束规划与鲁棒优化方法在应对新能源出力不确定性、负荷波动及系统运行风险中的应用。内容涵盖风光储协同调度、多微网共享储能、电动汽车参与调度、低碳经济调度等多种典型场景,深入分析了储能的选址定容、功率协调控制、状态估计与优化调度模型。核心技术包括粒子群优化(PSO)、分布鲁棒机会约束(DRCC)、模型预测控制(MPC)、鲁棒优化、二阶锥规划(SOCP)等先进算法,并提供了基于Matlab/Simulink的完整仿真代码实现,旨在提升新型电力系统的运行灵活性、经济性与抗风险能力。; 适合人群:具备电力系统、自动化、电气工程或相关专业背景,熟悉Matlab/Simulink仿真环境与基本优化算法,从事新能源并网、微电网运行、储能系统规划、电力市场调度等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:① 学习并构建含储能的电力系统经济调度优化模型;② 掌握机会约束与鲁棒优化在处理新能源不确定性问题中的建模思路与求解方法;③ 利用提供的Matlab代码进行算法复现、仿真验证与性能对比,支撑科研项目攻关;④ 为撰写高水平学术论文、学位论文或工程优化方案提供可靠的模型参考与代码支持。; 阅读建议:建议读者结合文档中具体的案例(如风电-水电联合调度、电动汽车集群调度、多微网共享储能等)和配套的Matlab代码进行动手实践,重点关注优化模型的构建逻辑、约束条件设定与求解器配置过程,同时可关注公众号“荔枝科研社”获取完整资源包、复现教程及持续的技术支持。

65,213

社区成员

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

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