星期一 九月 04, 2006
32位到64位移植的问题
上周有个客户在进行Solaris移植时,编译好的代码在一个地方就会crash,产生core文件,造成这个错误的代码为:
ptr = (char *)malloc(strlen(data) *(sizeof(char))+1)
按照常理,有这样错误,首先应该检查data是否为NULL,可每次调用时,data被赋予一个const char *,就是一个字符串常量,是没有问题的,看来问题应该是出在别的地方了。
后来得知,这段代码如果是编译为32位,就不会产生错误,如果编译为64位,就会产生core dump,看来问题应该处在数据类型的转换上,重点查integer,long 和pointer类型。在32情况下,着三个数据类型为32位,而64位情况下,integer型还是32位,但后面两个类型为64位,因为在客户程序中只有两个类型被调用,integer和char *,重点还是在integer上面。果然,在一个类似上面提到的代码中发现了一些问题,看
ptr = (int *)malloc(sizeof(int));
在这句话里,为prt来分配一个指针型的长度空间,但由于int型为32位,实际分到的空间就不是64位,这样就造成以后对ptr的操作会造成非法访问,从而造成core dump,将这段代码稍作调整
ptr = (int *)malloc(sizeof(int *));
程序就工作正常了。
以上只是在从32位移植到64位时碰到的一个实例,通过这个我们可以看出,如果大家要做这种移植,一定要注意这几个数据类型由于长度带来的问题,如果出现错误,先要排除这些数据类型带来的错误。有时单从错误的表面现象来分析,却很难下手,找不到错误的根源。
Posted at 04:38下午 九月 04, 2006 by Wenlong Zhang in Solaris | Comments[3]
估计是bus 访问错误导致的core. 不会是malloc分配的错误. 比如64位下一个long *lp = (long *)malloc(sizeof(int)) ; lp 的操作会引起 bus access 错误. 导致core.
Posted by 曾经 on 四月 24, 2007 at 07:24 下午 GMT+08:00 #
malloc不会出错,是分配了32位的地址空间,但还是按照64位来操作,导致SIGSEGV,这里有字数限制,写下个comments.
Posted by wenlong on 四月 24, 2007 at 07:25 下午 GMT+08:00 #
Incurred fault #6, FLTBOUNDS %pc = 0xFFFFFD7FFEB6AF8A
siginfo: SIGSEGV SEGV_MAPERR addr=0x008416A0
Received signal #11, SIGSEGV [default]
siginfo: SIGSEGV SEGV_MAPERR addr=0x008416A0
Posted by wenlong on 四月 24, 2007 at 07:25 下午 GMT+08:00 #