记录生活:解决Arm 平台工程分段错误

发布时间:2025-01-03 02:11

生活分享平台:记录美食制作过程 #生活乐趣# #生活分享# #生活故事精选# #生活片段#

在对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

相关内容

arm
dart 错误
探索高效能内存设计:ARM SRAM Compiler工具深度解析
git常见错误记录
ARM嵌入式系统在生活中的实际应用有哪些?
行程记录,记录美好生活——小鹏精品功能初体验分享
学困生辅导记录记录
优龙Bootloader ARM汇编代码笔记
记录世界记录生活记录你app有哪些 记录生活软件合集
基于ARM智能交通灯控制系统设计.doc

随便看看