如何修复cache崩溃( \# m/ A& t2 @: l
& \9 B; W; I. U" X6 U% _http://www.hobbyistsoftware.com/InsideYourTreo/cache-crash.php! L; b9 m& t# O, y/ h* G
* s. u) t. x/ c3 a" g, o1 Q$ a
不稳定的palm会让你疯狂。更郁闷的是你无法确定究竟哪个程序引发了这个问题。5 h' H* W X2 q$ r6 J
如果你遇见的崩溃是随机的,看起来并非和某个特定的动作相关,那么这篇文章应该能帮助你。; Q/ ?$ K' i2 m" o: a6 i! [( S
我会解释其中一部分这样的崩溃是来自哪里,同时,给你一些如何查找它们的线索。
5 F: p% V# e6 m5 ?这种类型的崩溃适用于所有使用了NVFS(non-volatile file system非挥发性内存系统)内存的palm设备。包括650以上的treo、life drve、tungsten E2、T5、Tungsten X 和 Zire Z22,今后可能有更多这样的掌机问世。
3 E4 L6 p2 K' _; p0 \& p7 | b8 m4 X! R* E3 N
我们会用“Palm Internals”来观察treo的内部情况,用“Reset Doctor”来管理这些崩溃,同时有助于这些崩溃发生的更频繁:)。通过强制崩溃的频繁发生,更容易的制造这些崩溃,你可以更快的判断问题出在哪里。
. I' W3 q5 h/ t: ^) `. S2 J2 J# r1 l, G0 G
快速cache翻新
3 W' V! y- ~8 R" c我以treo 650为例,虽然各机型的存储容量不同,但适用于所有用NVFS内存的设备。
/ j7 u! D9 z( d0 n8 _Treo 650宣称有32MB(23MB用户可用)的内存,但这并非表示你可以用到这么多内存。) v$ s6 h e* V9 S% ~" J: `
你不可能用23MB内存来运行一个应用程序。
1 M" ?7 I2 L( S8 D' p运行中的应用程序无法抓取整块内存用来运算。 s' A) r* G) _, k$ e8 K
这和你的treo 600的内存是完全不同的。9 N( O# T4 l) Q! t
实际上,650的内存更象是一块内建的32MB SD卡,我下面将谈到NVFS内存的这种情况。
( u5 Z& Y8 G; @5 ~; B! |. t+ b1 @) u7 U
Palm不能在SD卡中运行程序,你必需把程序拷入RAM,在RAM中运行(你的launcher为你做了这些事,如果没有,那么get initiate(译者注:这句偶翻译不好,请达人指教))。你可能已经注意到从卡上运行程序会有延迟,那是你的launcher正在把程序拷入RAM。
) E1 P \" \+ c! w# f) k' H8 j3 D+ S' ~, q# S
NVFS内存有同样的限制。你不能在NVFS内存上运行程序,系统也不能用它作为工作内存来进行运算等工作。为了做运算等工作,palm有一些正常的内存,在650上,大约是12MB,这就是我们所说的DBCache。$ u* n; j% \2 P/ G3 v
5 {4 Y7 c6 S6 c$ m3 G你设备上运行的程序认为它们可以拥有和处理的是一台有23MB内存的正常设备。它们希望可以存取数据库、创建数据库和使用这些内存。这意味着系统必需做一些设定的基础工作,在需要的时候动态的调用数据库和程序进入DBCache。当然,你不能把一夸特东西装到一品特的锅里,同样,23MB的NVFS和仅12MB的DBCache,DBCache必然会被装满。这时,系统不得不清理一些它认为不再需要的数据,这样就会导致错误。
1 F) W1 ?% q4 _& F; Y8 i. B- o! {! G" `! {! }$ i1 k
在这里,你可以了解更多NVFS和DBCache的细节。
5 [) T: a7 @) f# J: e+ z+ N k f0 k5 ?# M5 G: j, U
这样的确相当复杂,但Palm使用这样的结构有几个重要的原因。. X8 N3 H% D: T3 m
; Z/ b$ m! [; L( o. R& r
1、就象SD卡,你的NVFS内存不需要用电力保存数据,这意味着电池耗尽也不会丢失数据。
* `7 c, i2 f- W# M2、既然NVFS内存不用电,那么,你的palm就可以有更长的电池续航能力。
`# f+ Z6 Q& y/ y8 }. j3 F8 G3、NVFS内存价格便宜。这使得我们的palm可以用较低的价格获得较多的内存,坦白的说,我很惊奇厂家为什么没有提供给我们1G内存的设备。(译者:我考,650也太小气了吧!)
# K/ `1 `0 R$ V! g7 ^5 S# S+ c/ I' s# p9 X# ^! S q+ r- @. y( F
哪里出错了?5 x9 q8 v) A O) |- x) R( W# Y
我在上次的文章《公告、后台程序和快速上网的treo》中,我解释了程序是如何注册系统通告,当特定的事件发生时,操作系统调用该程序,给它处理数据的机会。 b: E/ \0 r6 Z) p8 h
! X& Q7 [! e% ~( h0 z
下面是它出错的步骤:( X- s8 ^0 _: x# H2 o
1、一个程序(这里我们称呼它为“糟糕程序”)注册“hvch”通告,这是一个由任意一个虚拟字符被处理时发出的通告。你随时可能获得虚拟字符,比如按下键盘上的一个键、电池达到一定的容量、一个警报消除等等。
. k0 J# D- G$ N/ Y2、“糟糕程序”关心的是速度,所以它注册了“the fast way绿色通道”。这意味着它告诉系统当通告发生时,请系统去某个特定的内存地址调用处理函数。9 h t4 e, `: {; b! ^0 l
3、“糟糕程序”一般都是几年前写的,当时它们的作者并不了解NVFS,所以,程序不会再做任何其它事,它开始坐等通告的发生。1 W/ t" N) [# _$ w2 V* ^
4、在你阅读文档、玩游戏等的前几个小时里,程序会工作的很正常。- m- ^) z1 K2 M1 z' U
5、到了某个临界点时,DBCache装满了。; W# k& z& f3 }6 l7 w6 z
6、系统开始察看DBCache,它高兴的发现没有任何程序会用到这个“糟糕程序”,于是,系统把所有改动拷贝进入NVFS,然后在DBCache里面把它删除。: c: y% G0 M4 C0 u, N6 ^
7、几乎与此同时,系统获得了一个虚拟字符,它开始试图去那个通告所注册的内存地址,运行相应的代码。比如说现在这个内存地址变成了你正在阅读的一个网页的代码,于是,系统崩溃了。) n5 `8 Q' i! |& P$ U: P, F& ?
如果这时,你查看你的“崩溃日志”,你会看见一个类似“Emul68KMain.c, Line:403, illegal instruction xxxx at address xxxxxxxx”的错误提示信息。" d/ w) c' i% t. u! u
现在编写的大部分程序都已经了解的NVFS的特性,所以,在上面第3步,它们会锁住自己的代码,禁止系统把它们从DBCache中清除出去。
: p, J' {2 ?5 F {' [
, w7 b3 G: ~; V: ZCache崩溃,你遇见过么?, V- G8 @/ Y) D* C+ T4 q( P
DBCache崩溃的确很难弄清楚。它有可能引起、也有可能不引起上表所列的错误,你也永远无法知道它发生的时间。
) G1 C2 K, q* ^) @, w" R1 i/ g1 C一个简单的检查方法是使用“Reset Doctor”。它可以让你按一个键来清除你的DBCache。如果这样引起了一次崩溃(或者在你清除DBCache后不久发生崩溃),那么,你的系统就是有这个cache崩溃问题。* m( ? @" N. z$ p/ V. S, }/ \
“Reset Doctor”也可以让你自动清除DBCache来保持一定量的空闲内存。一个程序退出和另一个程序启动时,如果必要,“Reset Doctor”会清空DBCache。这意味着DBCache清理未必会在一个程序实际被打开时发生(这是另一件可能导致故障的操作)。更重要的是,“Reset Doctor”可以在它清除DBCache和系统重启时保存信息至日志文件。如果你的日志文件显示崩溃是在DBCache被清除后不久发生的,那么,这是系统有cache崩溃问题的又一信号。7 k% ]- F1 K' i1 k& `
9 M | a' W3 J; z7 }8 C" N
Cache崩溃:你可以做什么
& j8 `. C, _ e; W9 z我们能很方便的找到大多数注册为“the fast way绿色通道”通告的程序,同时也很方便能判断出它们是否锁定了自己。下面是做法:/ P) d7 ~# |. M& x6 \
1)运行“Palm Internals” 点击“Notif”按钮,你可以看见如下列表:
% v1 o8 [! u( X) w*如果系统的状态相当差——甚至运行“Palm Internals”都会导致cache被清空、系统重启,那么你必须把你怀疑有问题的程序移到卡里,手动重启机器,然后再次运行“Palm Internals”。如果可以正常运行,你可以逐步将这些程序移回内存同时注意观察是否有问题。/ ]6 U+ R1 [5 d L
2)检查这个列表,找到其中在它们注册后含有'm68k xxxx DBCache'字样的程序(这些是那些注册为“the fast way绿色通道”的程序)。我的列表中会有“butler”和其他一些“糟糕程序”。这些就是你的怀疑对象。
1 b/ T8 @8 Y9 k. K3)选择menu-locked DBs,这可以显示哪些数据库被锁定。( @5 Y, F3 E# l; M1 s2 P
4)检查你的“怀疑列表”中的每一个程序。如果其中一个程序没有锁定自己的源代码,那么可能它就是导致出错的原因。我这里,“butler”已经锁定,而另外一个“糟糕程序”则没有。
+ b8 ]" N2 Y7 ^. y$ m: A3 _" j5)选择menu-protected DBs。列出哪个数据库做了保护,不被删除。
% {$ r3 y% X# u% _6)检查你的“怀疑列表”中的每一个程序。这个检查相对不太重要,但程序应该能保护自己从而能知道系统什么时候会再次删除它们。“butler”被保护,另外一个“糟糕程序”则没有。* }/ u% L/ M* A/ I
1 B" }7 S6 I+ S' Z你现在已经有了风险程序的列表,尝试把它们删除(或者移到卡里)。如果走运的话,你的palm就会稳定。
" X/ u0 t1 c1 c3 F一旦你弄清除这些风险程序,你可以不再运行它们,或者用类似“Resco Locker”的程序来锁定它。一个附加的好处是:你现在已经确切知道哪个程序有风险,你可以不必再锁定其他的程序!过度使用“Resco Locker”有可能迅速填满你的cache,而且看起来会导致它自身出现问题。8 f6 w5 c2 P5 P! P) {
& _1 A# Q4 {8 r- v# B; O' `这样做容易么?
' A1 R8 p; v6 j' y) Y希望如此!不幸的是,还有一些事会发生。' u1 B0 G0 p( E1 }3 p
你的“怀疑列表”并不十分完整。一些程序不使用通告直接潜入你的系统。它可以在后台做任何处理,并且不会显示在通告列表,你也就无法把它加入怀疑名单里。“LudusP”就是这样一个例子,它虽然是潜入系统,但我确信它给自己加上了保护。: Z5 G; T o5 u; v
还有一些程序仅在特定环境下才会注册通告。举例来说,一个程序可能为与通告相关的电话注册了“the slow way慢速通道”,但当电话正在进行时,它为关键按键注册了“the fast way绿色通道”。' P9 K; i, r& |
% K' m8 R% i7 e* b8 @; ]% X' d
还有么?谁知道呢!palm总会用一些特殊的方式让我们吃惊……
; H- e6 R8 V$ k$ Y4 b而且,这也是我们期待的……(译者:对于崩溃,我可一点都不期待!)# y( \9 Z0 K/ h! K7 D- @) w
% s9 L) ~: @- m1 X4 k8 q/ d3 `
和palm和谐相处并不容易,但对于开发者来说,总有很多快乐的事可以做。# J1 B1 L! Y/ O" [! v' Z- d. @# f
# n; r) P6 L: T/ N一个避免锁定代码的技巧是把它拷入一些特征内存。这是操作系统可以识别需要留下来的正常内存。2 P0 t- N# D1 B5 H+ {$ d( K2 {" Q2 v
这个技术被Daniel Grobe Sachs,可能还有其他人所采用。& ?2 I7 u3 y* c5 T2 F
不幸的是,我不知道有什么办法能让你检查哪个程序运用了这个技术。& J( }7 s$ [# |/ s8 s( f7 \7 P
! T, D1 i9 T6 [* `[ 本帖最后由 anil 于 2007-3-29 21:55 编辑 ] |