在ARM上运行TinyX的一个问题(转贴)

  转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>


最近在ARM上折腾TinyX,花三天时间终于编译过去了,可是板子上一运行,就莫名其妙的死机。

开始以为是驱动的问题,经过调试,发现在初始化时,进入函数CreateRootCursorTinyX就玩完,一想,没有道理啊,cursor字体都存在,不可能创建不了cursor啊。

进一步分析,在函数shadowGetImage里调用unwrap,执行该操作之后,pScreen->GetImage就为NULL,看了看unwrap的实现,原来它只是把pScrPrivpScreen的函数指针GetImage对调了一下,而pScrPrivGetImageNULL,所以交换之后pScreen->GetImage就为NULL。不会pScrPriv没初始化成功吧?于是在shadowSetup设置了一个断点,单步跟踪了整个函数,初始化过程完全正确。

百思不得其解,即然初始化时是对的,那一定是中途被修改了,难道TinyX也有内存溢出的问题?

PC上和板子上对比调试,在ARM板子上,进入shadowGetImage时,shadowScrPrivateIndex的值是0,而PC上的值是5。奇怪?难道真的被我估中了?

想使用gdbwatch功能监视shadowScrPrivateIndex,不行,原来arm-linux-gdb不支持watch功能,只好使用gdbdisplay功能。经过反复的试,最后发现执行readKernelMapping完后,shadowScrPrivateIndexr的值就变为0了,又分析全局变量的分布情况,了解kdKeymapshadowScrPrivateIndex的位置连在一起,猜测是访问kdKeymap越界了,继续调试,事实证实不出我所料。

想了想,TinyX里不会有这种错误吧,况且PC上是运行得很正常啊,仔细看了变量的定义和相关的访问代码,没有发现问题。只是发现在一个循环里,i的值竟达到了248,与PC上的有点不同,检查了一点循环的条件,估计是NR_KEYS值在PC上和ARM上有所不同。找到该宏的定义,它是在linuxkeyboard.h里定义的。ARM linux用的是2.69内核, 其值定义为256,而PC上运行的是2.4内核,里定义的是128。在ARM上它,就越界了,而PC上正常。

(TinyX用的是Xfree 4.5)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值