如何修复cache崩溃
* d/ \2 g; I' T
) s3 M: E$ s) }8 e1 r4 Yhttp://www.hobbyistsoftware.com/InsideYourTreo/cache-crash.php o3 v+ [4 N* _7 n% ^
/ [# f$ H( h7 M不稳定的palm会让你疯狂。更郁闷的是你无法确定究竟哪个程序引发了这个问题。/ Z3 j3 l9 d/ O! v
如果你遇见的崩溃是随机的,看起来并非和某个特定的动作相关,那么这篇文章应该能帮助你。
3 i. {5 z3 W* |1 a我会解释其中一部分这样的崩溃是来自哪里,同时,给你一些如何查找它们的线索。8 E! B- S- c' J) e, k# {- ` a' b4 {% F
这种类型的崩溃适用于所有使用了NVFS(non-volatile file system非挥发性内存系统)内存的palm设备。包括650以上的treo、life drve、tungsten E2、T5、Tungsten X 和 Zire Z22,今后可能有更多这样的掌机问世。
7 ?1 p0 e8 G! B8 U5 B) j1 Z; [
8 F( r" f% q" X我们会用“Palm Internals”来观察treo的内部情况,用“Reset Doctor”来管理这些崩溃,同时有助于这些崩溃发生的更频繁:)。通过强制崩溃的频繁发生,更容易的制造这些崩溃,你可以更快的判断问题出在哪里。1 k4 j/ I K, @, I0 r! Y
% J( l" C4 ~$ p b5 _ D* Y
快速cache翻新
6 r- s% O2 l+ }9 r$ U! ~- {, ^我以treo 650为例,虽然各机型的存储容量不同,但适用于所有用NVFS内存的设备。
3 A$ z t+ n& P! ]$ }% tTreo 650宣称有32MB(23MB用户可用)的内存,但这并非表示你可以用到这么多内存。% |, m9 S T' _* t
你不可能用23MB内存来运行一个应用程序。- u3 }( @. K: h* f! f/ m
运行中的应用程序无法抓取整块内存用来运算。
3 W: T5 C# _! U9 }. q这和你的treo 600的内存是完全不同的。- U. r, P1 m" u. f% W& ~
实际上,650的内存更象是一块内建的32MB SD卡,我下面将谈到NVFS内存的这种情况。8 y9 _& j* m I+ E+ [
{$ ^/ ?. {9 C- y% d
Palm不能在SD卡中运行程序,你必需把程序拷入RAM,在RAM中运行(你的launcher为你做了这些事,如果没有,那么get initiate(译者注:这句偶翻译不好,请达人指教))。你可能已经注意到从卡上运行程序会有延迟,那是你的launcher正在把程序拷入RAM。: N- k9 ]9 h/ n, K
( X% t5 m! c/ \' d
NVFS内存有同样的限制。你不能在NVFS内存上运行程序,系统也不能用它作为工作内存来进行运算等工作。为了做运算等工作,palm有一些正常的内存,在650上,大约是12MB,这就是我们所说的DBCache。; E& v, F* r7 X9 e
+ S: W4 T) u$ P7 ^. b _) ~1 c你设备上运行的程序认为它们可以拥有和处理的是一台有23MB内存的正常设备。它们希望可以存取数据库、创建数据库和使用这些内存。这意味着系统必需做一些设定的基础工作,在需要的时候动态的调用数据库和程序进入DBCache。当然,你不能把一夸特东西装到一品特的锅里,同样,23MB的NVFS和仅12MB的DBCache,DBCache必然会被装满。这时,系统不得不清理一些它认为不再需要的数据,这样就会导致错误。
' a" u$ x* [; v5 f: @4 ~
' E! @0 p* h0 w& U |+ s在这里,你可以了解更多NVFS和DBCache的细节。
7 g! y9 Q( F3 d, ^- e' i& G+ d. q# W! X, f1 H" Y" {
这样的确相当复杂,但Palm使用这样的结构有几个重要的原因。
( W$ B9 d& x h) m7 T7 R/ ^% l+ a( t; {( E9 ]$ Z' K
1、就象SD卡,你的NVFS内存不需要用电力保存数据,这意味着电池耗尽也不会丢失数据。
, v1 c/ ]/ }% _1 e1 i# S; {, X2、既然NVFS内存不用电,那么,你的palm就可以有更长的电池续航能力。
8 I3 }$ r2 j9 _) |3、NVFS内存价格便宜。这使得我们的palm可以用较低的价格获得较多的内存,坦白的说,我很惊奇厂家为什么没有提供给我们1G内存的设备。(译者:我考,650也太小气了吧!) H c% j. c: t( c! i- X' z3 |/ l! M6 e
. s6 ^5 f& H/ ]$ z$ H
哪里出错了?+ ?( P) g/ y2 n# s i
我在上次的文章《公告、后台程序和快速上网的treo》中,我解释了程序是如何注册系统通告,当特定的事件发生时,操作系统调用该程序,给它处理数据的机会。- \, E5 f K7 \, B6 N7 C
% d7 W K5 e H下面是它出错的步骤:+ S& y) S% P) w, t2 k9 a0 }; L
1、一个程序(这里我们称呼它为“糟糕程序”)注册“hvch”通告,这是一个由任意一个虚拟字符被处理时发出的通告。你随时可能获得虚拟字符,比如按下键盘上的一个键、电池达到一定的容量、一个警报消除等等。
) J5 m8 U& W$ J/ L: W5 D2 J2、“糟糕程序”关心的是速度,所以它注册了“the fast way绿色通道”。这意味着它告诉系统当通告发生时,请系统去某个特定的内存地址调用处理函数。9 J4 w& Q: |; r" `+ ^- F! S: e
3、“糟糕程序”一般都是几年前写的,当时它们的作者并不了解NVFS,所以,程序不会再做任何其它事,它开始坐等通告的发生。
) g0 L+ k! A8 m4、在你阅读文档、玩游戏等的前几个小时里,程序会工作的很正常。
) b( g6 m m' n( Y+ O3 ]" A; I6 L5、到了某个临界点时,DBCache装满了。4 x( Z7 _8 r4 q! P
6、系统开始察看DBCache,它高兴的发现没有任何程序会用到这个“糟糕程序”,于是,系统把所有改动拷贝进入NVFS,然后在DBCache里面把它删除。
9 i: u: e- Y( Q' }7 Z7、几乎与此同时,系统获得了一个虚拟字符,它开始试图去那个通告所注册的内存地址,运行相应的代码。比如说现在这个内存地址变成了你正在阅读的一个网页的代码,于是,系统崩溃了。& c: k/ S J; H1 v- T% F7 f) S
如果这时,你查看你的“崩溃日志”,你会看见一个类似“Emul68KMain.c, Line:403, illegal instruction xxxx at address xxxxxxxx”的错误提示信息。, r- K1 a) C4 l! b
现在编写的大部分程序都已经了解的NVFS的特性,所以,在上面第3步,它们会锁住自己的代码,禁止系统把它们从DBCache中清除出去。/ D8 n$ j' A. Q4 j6 N/ i0 t
, D4 o( u! n. BCache崩溃,你遇见过么?
# [, U9 R/ U' K& \( G: n# m* zDBCache崩溃的确很难弄清楚。它有可能引起、也有可能不引起上表所列的错误,你也永远无法知道它发生的时间。 N! F- f* K+ O4 w& a, S
一个简单的检查方法是使用“Reset Doctor”。它可以让你按一个键来清除你的DBCache。如果这样引起了一次崩溃(或者在你清除DBCache后不久发生崩溃),那么,你的系统就是有这个cache崩溃问题。( l3 }6 e3 v: _, ^3 j' j' ?. _: w
“Reset Doctor”也可以让你自动清除DBCache来保持一定量的空闲内存。一个程序退出和另一个程序启动时,如果必要,“Reset Doctor”会清空DBCache。这意味着DBCache清理未必会在一个程序实际被打开时发生(这是另一件可能导致故障的操作)。更重要的是,“Reset Doctor”可以在它清除DBCache和系统重启时保存信息至日志文件。如果你的日志文件显示崩溃是在DBCache被清除后不久发生的,那么,这是系统有cache崩溃问题的又一信号。5 s- W; x% n. p$ T1 _% D: j8 e
' `1 o( A1 J! Q) P
Cache崩溃:你可以做什么
9 d- A) g2 o X4 d我们能很方便的找到大多数注册为“the fast way绿色通道”通告的程序,同时也很方便能判断出它们是否锁定了自己。下面是做法:3 v! f2 J b1 W, ~) H8 t9 `
1)运行“Palm Internals” 点击“Notif”按钮,你可以看见如下列表:
( ~; K& T2 Z \1 n$ N, F6 @*如果系统的状态相当差——甚至运行“Palm Internals”都会导致cache被清空、系统重启,那么你必须把你怀疑有问题的程序移到卡里,手动重启机器,然后再次运行“Palm Internals”。如果可以正常运行,你可以逐步将这些程序移回内存同时注意观察是否有问题。
8 C* [7 { d5 y8 b' u2)检查这个列表,找到其中在它们注册后含有'm68k xxxx DBCache'字样的程序(这些是那些注册为“the fast way绿色通道”的程序)。我的列表中会有“butler”和其他一些“糟糕程序”。这些就是你的怀疑对象。
8 I7 B# h1 Q( b) Q. W" f; m3)选择menu-locked DBs,这可以显示哪些数据库被锁定。4 ^5 S# j6 z' t
4)检查你的“怀疑列表”中的每一个程序。如果其中一个程序没有锁定自己的源代码,那么可能它就是导致出错的原因。我这里,“butler”已经锁定,而另外一个“糟糕程序”则没有。; |% J7 P V8 t/ g
5)选择menu-protected DBs。列出哪个数据库做了保护,不被删除。
7 E4 @# f$ M7 ^2 H7 X% o+ }6)检查你的“怀疑列表”中的每一个程序。这个检查相对不太重要,但程序应该能保护自己从而能知道系统什么时候会再次删除它们。“butler”被保护,另外一个“糟糕程序”则没有。
4 `6 H( h& c. M1 i. l; \
4 R1 b5 I" v6 A你现在已经有了风险程序的列表,尝试把它们删除(或者移到卡里)。如果走运的话,你的palm就会稳定。* I( ^- P. c: B# T* \
一旦你弄清除这些风险程序,你可以不再运行它们,或者用类似“Resco Locker”的程序来锁定它。一个附加的好处是:你现在已经确切知道哪个程序有风险,你可以不必再锁定其他的程序!过度使用“Resco Locker”有可能迅速填满你的cache,而且看起来会导致它自身出现问题。+ @0 d }. K( _
& z( l2 ^' J# d0 P0 z9 D& `5 T/ f
这样做容易么?
1 S7 q: b4 \2 x) F" Y' U1 w/ B( f希望如此!不幸的是,还有一些事会发生。* s1 a* ~' s" h$ V
你的“怀疑列表”并不十分完整。一些程序不使用通告直接潜入你的系统。它可以在后台做任何处理,并且不会显示在通告列表,你也就无法把它加入怀疑名单里。“LudusP”就是这样一个例子,它虽然是潜入系统,但我确信它给自己加上了保护。
4 o& W# W8 h; |还有一些程序仅在特定环境下才会注册通告。举例来说,一个程序可能为与通告相关的电话注册了“the slow way慢速通道”,但当电话正在进行时,它为关键按键注册了“the fast way绿色通道”。
% |& U: x+ X/ |( r/ E
6 D) Y8 K* }# k3 Y还有么?谁知道呢!palm总会用一些特殊的方式让我们吃惊……
" @! Q8 V3 w9 J3 r5 R而且,这也是我们期待的……(译者:对于崩溃,我可一点都不期待!)( R. r% y6 t0 A' l
& l* q* G3 {( M( `7 V h
和palm和谐相处并不容易,但对于开发者来说,总有很多快乐的事可以做。/ d: T, l+ F1 K M$ |$ |
( p' ~, ~: V0 Q/ n0 q9 o+ d3 E) Y( ]一个避免锁定代码的技巧是把它拷入一些特征内存。这是操作系统可以识别需要留下来的正常内存。2 N" E$ L ]# ?7 y: p
这个技术被Daniel Grobe Sachs,可能还有其他人所采用。+ F& w' t+ w/ e
不幸的是,我不知道有什么办法能让你检查哪个程序运用了这个技术。" R" o. o, i' |+ f' S9 F2 U
" p4 Q2 n3 a7 V3 R1 |[ 本帖最后由 anil 于 2007-3-29 21:55 编辑 ] |