首页 > 其他分享 >刷新三观的HP-UX系统中的强指针赋值出core问题

刷新三观的HP-UX系统中的强指针赋值出core问题

时间:2023-01-17 13:38:04浏览次数:45  
标签:aa core begin UX int HP char printf functionID

       这周在某省升级通信中间件,在RedHat平台的中间件 运行正常,业务可以正常处理。但在 HP-UX服务器上,一承载业务,中间件就出Core重启。

       我立刻组织部门的同事投入到问题分析中。

       首先我在公司的实验室的HP服务器上部署某省的业务。然后在实验室编写votel话务测试脚本,进行业务测试。故障现象浮现,HP下的中间件出core重启。分析代码的位置,是出现在        int i=*(int*)(*begin+1);地方。

        然后对版本进行回滚,原来的代码赋值是

+   int i;

+   memcpy((char*)(&i),(*begin)+1,4);

    将该处代码由强指针转换改为memcpy后,业务中间件正常运行。

   对这个问题百思不得其解,于是我安排小汪在写一个简单的测试程序,代码中只写强制转换的代码。

   

#include <stdio.h>
int main()
{
char  aa[10] = {'a','b','c','d','d','e','f','a','b','c'};
char *p = (aa+0);
char *p2 = (aa+0); 
char **begin = &p2;


printf("%p\n",*begin);

printf("%p\n",*begin+1);

printf("%p\n",**begin);

int functionID = *(int*)(*begin+1);
printf("functionID=%x\n",functionID);
}

  用aCC编译后,运行程序,果然出core。

然后改用代码

​
#include <stdio.h>
int main()
{
char  aa[10] = {'a','b','c','d','d','e','f','a','b','c'};
char *p = (aa+0);
char *p2 = (aa+0); 
char **begin = &p2;


printf("%p\n",*begin);

printf("%p\n",*begin+1);

printf("%p\n",**begin);

int functionID ;
memcpy((char*)&functionID,(*begin)+1,4);
printf("functionID=%x\n",functionID);
}

​

aCC编译后运行正常。

小汪跟我说他看到一个帖子,挺有借鉴意义的,具体如下:

刷新三观的HP-UX系统中的强指针赋值出core问题_中间件

 概括来讲有的CPU存在内存奇偶的机制,要用偶数内存地址做强制转换。

于是我按照这个文章讲的,对代码又做了修改验证:

#include <stdio.h>
int main()
{
char  aa[10] = {'a','b','c','d','d','e','f','a','b','c'};
char *p = (aa+0);
char *p2 = (aa+0); 
char **begin = &p2;


printf("%p\n",*begin);

printf("%p\n",*begin+1);

printf("%p\n",**begin);
int functionID = *(int*)(*begin+2);
printf("functionID=%x\n",functionID);
}

经过aCC编译验证后,程序仍然出core。

然后我接着进行了修改,具体如下:

​
#include <stdio.h>
int main()
{
char  aa[10] = {'a','b','c','d','d','e','f','a','b','c'};
char *p = (aa+0);
char *p2 = (aa+0); 
char **begin = &p2;


printf("%p\n",*begin);

printf("%p\n",*begin+1);

printf("%p\n",**begin);
int functionID = *(int*)(*begin+4);
printf("functionID=%x\n",functionID);
}

​

对于指针地址+4后,进行强制转换,用aCC编译后运行,程序可以正常运行。

然后我把情况给小汪讲了后,小汪又做了个测试:

​
#include <stdio.h>
int main()
{
char  aa[10] = {'a','b','c','d','d','e','f','a','b','c'};
char *p = (aa+0);
char *p2 = (aa+0); 
char **begin = &p2;


printf("%p\n",*begin);

printf("%p\n",*begin+1);

printf("%p\n",**begin);
int functionID = *(short*)(*begin+2);
printf("functionID=%x\n",functionID);
}

​

用aCC编译后,程序也可以正常运行。

总结下:

进行数值进行强转赋值需要谨慎,有的CPU存在内存对齐和起始地址的奇偶性。所以尽量用memcpy(类似memcpy((char*)(&i),(*begin)+1,4);),少用类型强转赋值(类似int i=*(int*)(*begin+1);)。

标签:aa,core,begin,UX,int,HP,char,printf,functionID
From: https://blog.51cto.com/u_15942605/6017160

相关文章

  • 如何获取LINUX主机所有的IP
    上个月写了一篇文章,介绍了如何获取本机的第一个IP。后面我再想是否有办法获取LINUX主机的所有的IP,通过查询资料,找到了方法。借助对象ifaddrs以及getifaddrs函数可以实现这......
  • Linux中安装Git 2.39.0
    1、依赖安装yuminstalldh-autoreconfcurl-develexpat-develgettext-developenssl-develperl-develzlib-develnss-y2、移除默认的gityumremovegit-y3......
  • linux命令详解
    万字详解Linux常用指令(值得收藏)运维网工 2023-01-0109:00 发表于重庆收录于合集#linux命令12个#linux11个#linux常用命令4个来源:https://blog.csdn.n......
  • MySQL安装-Linux版
    MySQL8.0.26-Linux版安装1.准备一台Linux服务器云服务器或者虚拟机都可以;Linux的版本为CentOS7;2.下载Linux版MySQL安装包https://downloads.mysql.com/archives/......
  • MySQL卸载-Linux版
    MySQL卸载-Linux版停止MySQL服务systemctlstopmysqld查询MySQL的安装文件rpm-qa|grep-imysql卸载上述查询出来的所有的MySQL安装包rpm-emysql-community......
  • 回收linux中的cache
    Linux内存中的Cache真的能被回收么?入门小站 入门小站 2023-01-0922:15 发表于湖北收录于合集#Linux677个#内存3个入门小站分享运维技巧及10k+S......
  • linux 软链接 硬链接 区别
    来源  https://www.cnblogs.com/oceanftd/p/13475643.html 相关概念:链接:简单说,链接就是一种文件共享的方式,是POSIX中的概念,主流文件系统都支持链接文件。in......
  • Linux 驱动像单片机一样读取一帧dmx512串口数据
    硬件全志R528目标:实现Linux 读取一帧dmx512串口数据。问题分析:因为串口数据量太大,帧与帧之间的间隔太小。通过Linux自带的读取函数方法无法获取到帧头和帧尾,读取到的数......
  • linux中用命令导出、导入mysql数据库表
    一、导出数据1.使用场景:在没有数据库可视化工具的情况下备份导出数据库。命令如下:mysqldump-u用户名-p数据库名>数据库名.sqlmysqldump-uroot-pcity>city.sq......
  • PHPMyWind编辑器支持Word图文一键粘贴
    ​图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-editor的二进制流保存为例:打开umeditor.js,......