记录生活:解决Arm 平台工程分段错误
生活分享平台:记录美食制作过程 #生活乐趣# #生活分享# #生活故事精选# #生活片段#
在对arm工控机进行先导测试时,发现一旦数据到达,工控机的接口就会卡住,测试人员肯定有这个问题。经过查看日志,是段错误,并且在同一个代码位置多次出现错误。除去周末,经过一天多的时间,问题解决了。虽然没有遇到什么技术难题,但这个过程还是值得记录的。
由于本文无技术内容,请仔细阅读并按需阅读。
原因
上周五早上,测试人员(可惜我没有资格称其为同事)在去试点的路上,给我打电话说要更新软件版本,于是我在代码上拉取了最新的release分支树。基于没有arm的编译环境,我打包发给他,在测试机上编译测试。后来发现它是目前唯一一款集编译和测试为一体的一体机。编译完成后,指导如何更新。据报道,临近中午时发生段错误。因为其他事情,下午才去找日志。由于我没有参与那个项目,所以就寻找相应的开发者。经过排查,问题定位在一条初始化语句std:string foobar='';上,四眼分析了半天没有结论。经过讨论,中试机被搬回来,在实验室重现,然后跟踪调试。
故障排除及解决
找出问题
咨询测试人员,反馈是在实验室测试相同场景时没有遇到问题。由于实验室都是x86机器,没有错误,所以只能打印调试。
首先在代码的错误行前添加一些语句,测试一下,发现错误行号变了,仍然指向字符串语句。仔细观察代码,发现函数后字符串类型变量被赋值给了另一个数组(char buff[]),所以我怀疑数组的容量不够,并打印组装后的字符串变量的长度,以及发现超过了数组的长度。增加长度,测试,一切正常。使用项目封装的log函数打印,发现URL地址的中文输出有乱码,但用printf输出正常。 URL转义是通过调用curl库函数curl_easy_escape来实现的。汉字会有一个百分号%。怀疑是日志功能封装的问题。由于时间关系,没有进行进一步的研究。不过,这可能是一个隐患,这个以后再讨论。
解决方案
只需增加最后组装的缓冲阵列的容量即可。
重现代码
下面模拟实际项目的功能布局,丢弃不相关的代码以突出问题。
注意:最终的输出将会超出范围。
#包括stdlib.h
#include stdio.h
包括
int main()
{
const char* url='http://172.168.168.188:18080/api/new/v2/queryAVeryloongApiforveryloongremoteipserver?';
char foo1[256]={0};
整数a=100;
整数b=1;
int c=a+b+1+1+b+3+a;
std:string strData='';
for (int i=0; i 3; i++)
{
strData.append('');
strData.append('10000');
strData.append('=');
strData.append('103');
}
字符输出[96]={0};
sprintf(输出, '%s?%s', url, strData.c_str());
printf('url=%s\n', 输出);
返回0;}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 号
18
19
20
21
22
23
24
25
26
27
28
29
30
经测试,只有x86正常,其他2个平台都出现段错误。多年实践的直觉是x86看起来应该正常,但实际上却是不正常的(肯定是越界了),却一直这样使用,令人费解。
x86工控机上测试结果:
$ 文件a.out
a.out: ELF 64 位LSB 可执行文件,x86-64,版本1 (SYSV),动态链接(使用共享库),适用于GNU/Linux 2.6.32,BuildID[sha1]=3e7c0c704230b08e49f529a6924397e0dfd358ba ,未剥离
$ ./a.out
url=http://172.168.168.188:18080/api/new/v2/queryAVeryloongApiforveryloongremoteipserver?10000=10310000=10310000=103
1
2
3
4
5
在arm工控机上测试结果:
$ 文件a.out
a.out: ELF 64 位LSB 可执行文件,ARM aarch64,版本1 (SYSV),动态链接(使用共享库),适用于GNU/Linux 3.7.0,未剥离
$ ./a.out
url=http://172.168.168.188:18080/api/new/v2/queryAVeryloongApiforveryloongremoteipserver?10000=10310000=10310000=103
分段错误(核心吐出)
1
2
3
4
5
6
在loongarch工控机上测试结果:
$ 文件a.out
a.out: ELF 64 位LSB 可执行文件,LoongArch-64,版本1 (SYSV),动态链接,解释器/lib64/ld.so.1,适用于GNU/Linux 4.15.0,BuildID[sha1]=7d61ce6d3a50850e045dcdaab48585f88bbca4 f7,不剥离的
$ ./a.out
url=http://172.168.168.188:18080/api/new/v2/queryAVeryloongApiforveryloongremoteipserver?10000=10310000=10310000=103
总线错误
1
2
3
4
5
6
概括
最近断断续续地接触本地化适配,有点谨慎。
与很多人认为只需更改宏定义并交叉编译即可,我对适配并不太乐观。上面往往以为三两天就可以搞定,但实际操作起来却很麻烦。相同的代码在不同的架构(x86 和arm、mips)上的行为不一定相同。
目前最大的问题有以下几个:
许多工程代码已经有好几年的历史了,有些功能不再可测试,有些代码使用当时的第三方版本。如果贸然更新,或者使用新的操作系统和新的编译器,可能会导致编译失败。
修改宏定义确实很简单,但是在工程代码中,系统位数和系统架构这两个不同的概念是没有区别的,所以要非常小心。例如,指针长度在32位和64位系统中具有不同的值。
代码中存在隐藏的错误,例如分段错误。一方面,不同的架构平台对个别段错误类型的处理不同(比如本文遇到的问题,在x86上不存在),无条件很难就地测试。另一方面,审查代码可能很难明确地看到。
项目代码中存在大量编译警告,但似乎没有人纠正。从笔者的经验来看,纠正警告也会带来隐患。
the end
免责声明:本文不代表本站的观点和立场,如有侵权请联系本站删除!本站仅提供信息存储空间服务。
网址:记录生活:解决Arm 平台工程分段错误 https://www.yuejiaxmz.com/news/view/631953
相关内容
armdart 错误
探索高效能内存设计:ARM SRAM Compiler工具深度解析
git常见错误记录
ARM嵌入式系统在生活中的实际应用有哪些?
行程记录,记录美好生活——小鹏精品功能初体验分享
学困生辅导记录记录
优龙Bootloader ARM汇编代码笔记
记录世界记录生活记录你app有哪些 记录生活软件合集
基于ARM智能交通灯控制系统设计.doc