如何修复cache崩溃
9 g0 v, M6 R; V, n4 [' a& O# z6 D |! G5 f! d
http://www.hobbyistsoftware.com/InsideYourTreo/cache-crash.php
7 ^& I% n; k1 V/ s. F3 u8 N! ]
7 W& ` K6 |% f2 ^不稳定的palm会让你疯狂。更郁闷的是你无法确定究竟哪个程序引发了这个问题。
4 `$ L) Z7 V( Q3 _' o; J如果你遇见的崩溃是随机的,看起来并非和某个特定的动作相关,那么这篇文章应该能帮助你。
1 a/ B P0 b6 n" p: Q7 Z$ @6 U我会解释其中一部分这样的崩溃是来自哪里,同时,给你一些如何查找它们的线索。: |4 T; z* Z& D' R3 D
这种类型的崩溃适用于所有使用了NVFS(non-volatile file system非挥发性内存系统)内存的palm设备。包括650以上的treo、life drve、tungsten E2、T5、Tungsten X 和 Zire Z22,今后可能有更多这样的掌机问世。
b' C6 c3 E& l0 V/ h
9 ^; |, q" k8 j& j- p我们会用“Palm Internals”来观察treo的内部情况,用“Reset Doctor”来管理这些崩溃,同时有助于这些崩溃发生的更频繁:)。通过强制崩溃的频繁发生,更容易的制造这些崩溃,你可以更快的判断问题出在哪里。
! }0 h$ E+ h! K' F$ c5 ?3 Y" b* X% h! I* F
快速cache翻新
l" Q4 [4 }- x+ G" ^我以treo 650为例,虽然各机型的存储容量不同,但适用于所有用NVFS内存的设备。
: G: \) X, |* B; VTreo 650宣称有32MB(23MB用户可用)的内存,但这并非表示你可以用到这么多内存。
6 `6 n- ^, ~4 _8 j7 W; N; y; E你不可能用23MB内存来运行一个应用程序。' h" ~' `: v/ M
运行中的应用程序无法抓取整块内存用来运算。) w) e* d( w7 Q5 q9 K' a
这和你的treo 600的内存是完全不同的。4 d3 h6 } k5 {; \9 I
实际上,650的内存更象是一块内建的32MB SD卡,我下面将谈到NVFS内存的这种情况。# v/ `+ _1 ^ _8 j
5 r( q$ W4 z4 q/ u6 n! p" _- EPalm不能在SD卡中运行程序,你必需把程序拷入RAM,在RAM中运行(你的launcher为你做了这些事,如果没有,那么get initiate(译者注:这句偶翻译不好,请达人指教))。你可能已经注意到从卡上运行程序会有延迟,那是你的launcher正在把程序拷入RAM。
5 H1 ?9 ]5 l' a7 E7 g/ _
5 L5 u' \, Z" }: }0 uNVFS内存有同样的限制。你不能在NVFS内存上运行程序,系统也不能用它作为工作内存来进行运算等工作。为了做运算等工作,palm有一些正常的内存,在650上,大约是12MB,这就是我们所说的DBCache。7 P+ Q! k( O& r) F% |
a: B- j2 E4 K$ I4 x l& `
你设备上运行的程序认为它们可以拥有和处理的是一台有23MB内存的正常设备。它们希望可以存取数据库、创建数据库和使用这些内存。这意味着系统必需做一些设定的基础工作,在需要的时候动态的调用数据库和程序进入DBCache。当然,你不能把一夸特东西装到一品特的锅里,同样,23MB的NVFS和仅12MB的DBCache,DBCache必然会被装满。这时,系统不得不清理一些它认为不再需要的数据,这样就会导致错误。
- R4 _. S, X" A+ W1 L6 s, v, |" B) ?
在这里,你可以了解更多NVFS和DBCache的细节。4 ~, v: x3 L+ _, w
4 d" t5 \8 t) M这样的确相当复杂,但Palm使用这样的结构有几个重要的原因。
+ y9 j0 h) X/ k9 i9 s9 p( Y5 I c' u8 c+ Q
1、就象SD卡,你的NVFS内存不需要用电力保存数据,这意味着电池耗尽也不会丢失数据。9 W8 q! s3 P2 z. A6 m7 ~! a1 U* g
2、既然NVFS内存不用电,那么,你的palm就可以有更长的电池续航能力。
+ Q# N, _" X% U) t3、NVFS内存价格便宜。这使得我们的palm可以用较低的价格获得较多的内存,坦白的说,我很惊奇厂家为什么没有提供给我们1G内存的设备。(译者:我考,650也太小气了吧!)! ^( b- b) a( }; Y5 t
# D+ s- A, @. h4 I6 f5 x
哪里出错了?
T9 J$ ? L# c: U8 d2 c$ {6 \8 i我在上次的文章《公告、后台程序和快速上网的treo》中,我解释了程序是如何注册系统通告,当特定的事件发生时,操作系统调用该程序,给它处理数据的机会。
/ ^8 y- Z: M# p3 ~. K% c% A. B3 {% H1 S/ j5 P2 `) ]8 i7 |0 c
下面是它出错的步骤:
9 b, W. [- m0 k1、一个程序(这里我们称呼它为“糟糕程序”)注册“hvch”通告,这是一个由任意一个虚拟字符被处理时发出的通告。你随时可能获得虚拟字符,比如按下键盘上的一个键、电池达到一定的容量、一个警报消除等等。6 A8 G5 ?2 t# `
2、“糟糕程序”关心的是速度,所以它注册了“the fast way绿色通道”。这意味着它告诉系统当通告发生时,请系统去某个特定的内存地址调用处理函数。
. E8 p, o* p C% J, i& E8 G) n2 E3、“糟糕程序”一般都是几年前写的,当时它们的作者并不了解NVFS,所以,程序不会再做任何其它事,它开始坐等通告的发生。* |6 D- G, ]1 n! h2 X
4、在你阅读文档、玩游戏等的前几个小时里,程序会工作的很正常。
* {& z% e: a* l; t+ `6 i' B8 v5、到了某个临界点时,DBCache装满了。1 g# U! [! M$ x {. s, z, C
6、系统开始察看DBCache,它高兴的发现没有任何程序会用到这个“糟糕程序”,于是,系统把所有改动拷贝进入NVFS,然后在DBCache里面把它删除。6 I! _$ }* y" o9 H
7、几乎与此同时,系统获得了一个虚拟字符,它开始试图去那个通告所注册的内存地址,运行相应的代码。比如说现在这个内存地址变成了你正在阅读的一个网页的代码,于是,系统崩溃了。+ s8 @: w! s! n( ~+ o0 Q
如果这时,你查看你的“崩溃日志”,你会看见一个类似“Emul68KMain.c, Line:403, illegal instruction xxxx at address xxxxxxxx”的错误提示信息。
f, V; P. T( J/ j* [" T现在编写的大部分程序都已经了解的NVFS的特性,所以,在上面第3步,它们会锁住自己的代码,禁止系统把它们从DBCache中清除出去。
t7 k" y2 d1 s9 B0 }3 O" q" u
a5 p8 m8 [) h# |! c# {5 SCache崩溃,你遇见过么?
0 _6 T% W7 `1 UDBCache崩溃的确很难弄清楚。它有可能引起、也有可能不引起上表所列的错误,你也永远无法知道它发生的时间。
+ @* j, c3 n% \4 \一个简单的检查方法是使用“Reset Doctor”。它可以让你按一个键来清除你的DBCache。如果这样引起了一次崩溃(或者在你清除DBCache后不久发生崩溃),那么,你的系统就是有这个cache崩溃问题。0 V( L* d+ w2 U) A7 {
“Reset Doctor”也可以让你自动清除DBCache来保持一定量的空闲内存。一个程序退出和另一个程序启动时,如果必要,“Reset Doctor”会清空DBCache。这意味着DBCache清理未必会在一个程序实际被打开时发生(这是另一件可能导致故障的操作)。更重要的是,“Reset Doctor”可以在它清除DBCache和系统重启时保存信息至日志文件。如果你的日志文件显示崩溃是在DBCache被清除后不久发生的,那么,这是系统有cache崩溃问题的又一信号。
" d' I2 G# O, i
/ |* [5 o% K+ X1 H- dCache崩溃:你可以做什么
: m' V0 X' Q; v: ~9 r: Y6 T' h我们能很方便的找到大多数注册为“the fast way绿色通道”通告的程序,同时也很方便能判断出它们是否锁定了自己。下面是做法:
0 M) k' V6 Z5 e# V+ \- M4 F# e# O2 S1)运行“Palm Internals” 点击“Notif”按钮,你可以看见如下列表:
+ E% ~2 M3 i- j# h# D8 ~" ?*如果系统的状态相当差——甚至运行“Palm Internals”都会导致cache被清空、系统重启,那么你必须把你怀疑有问题的程序移到卡里,手动重启机器,然后再次运行“Palm Internals”。如果可以正常运行,你可以逐步将这些程序移回内存同时注意观察是否有问题。
9 y8 r b, V# j/ n1 T7 C1 {2)检查这个列表,找到其中在它们注册后含有'm68k xxxx DBCache'字样的程序(这些是那些注册为“the fast way绿色通道”的程序)。我的列表中会有“butler”和其他一些“糟糕程序”。这些就是你的怀疑对象。
! i2 h8 w. g) h" C M9 t8 p( K3 w3)选择menu-locked DBs,这可以显示哪些数据库被锁定。; T$ _' [, u6 \4 P- L* g' ]
4)检查你的“怀疑列表”中的每一个程序。如果其中一个程序没有锁定自己的源代码,那么可能它就是导致出错的原因。我这里,“butler”已经锁定,而另外一个“糟糕程序”则没有。* |, x v- H0 r+ K
5)选择menu-protected DBs。列出哪个数据库做了保护,不被删除。. Y: S, ], T7 M i ~' N' h% H
6)检查你的“怀疑列表”中的每一个程序。这个检查相对不太重要,但程序应该能保护自己从而能知道系统什么时候会再次删除它们。“butler”被保护,另外一个“糟糕程序”则没有。" l5 w" F) H1 d" r! j4 G1 Q
/ G3 M+ B9 _, m9 B
你现在已经有了风险程序的列表,尝试把它们删除(或者移到卡里)。如果走运的话,你的palm就会稳定。# z$ w) F1 k0 D2 J
一旦你弄清除这些风险程序,你可以不再运行它们,或者用类似“Resco Locker”的程序来锁定它。一个附加的好处是:你现在已经确切知道哪个程序有风险,你可以不必再锁定其他的程序!过度使用“Resco Locker”有可能迅速填满你的cache,而且看起来会导致它自身出现问题。* e" \4 f# g7 P* [' q3 n1 c% H5 w
$ g& \& f4 w3 x这样做容易么?4 K) i+ P' f% N7 ]( {
希望如此!不幸的是,还有一些事会发生。
: i4 G6 W, R' w0 @+ L, {4 z你的“怀疑列表”并不十分完整。一些程序不使用通告直接潜入你的系统。它可以在后台做任何处理,并且不会显示在通告列表,你也就无法把它加入怀疑名单里。“LudusP”就是这样一个例子,它虽然是潜入系统,但我确信它给自己加上了保护。! s* f+ Y! p9 ? U/ V
还有一些程序仅在特定环境下才会注册通告。举例来说,一个程序可能为与通告相关的电话注册了“the slow way慢速通道”,但当电话正在进行时,它为关键按键注册了“the fast way绿色通道”。/ \4 b$ ]! F6 ?4 x
' Z5 Z, ]/ c( U; | h o
还有么?谁知道呢!palm总会用一些特殊的方式让我们吃惊……
# L& O& |, @# }而且,这也是我们期待的……(译者:对于崩溃,我可一点都不期待!)
, C$ M3 L! E5 G6 P( r3 O! j/ D, ]; I* o# g: B* {) U+ B
和palm和谐相处并不容易,但对于开发者来说,总有很多快乐的事可以做。
A/ E9 x/ [2 }0 T0 A
9 S9 N. h5 u5 A) o2 h一个避免锁定代码的技巧是把它拷入一些特征内存。这是操作系统可以识别需要留下来的正常内存。* P0 j9 J" p9 C6 ?& Q# z
这个技术被Daniel Grobe Sachs,可能还有其他人所采用。
# c' Z1 n% U2 q0 }6 T8 X/ a5 t不幸的是,我不知道有什么办法能让你检查哪个程序运用了这个技术。. v8 R+ b4 u! E: {; N
4 n- r5 \% T* l# Y* L7 M[ 本帖最后由 anil 于 2007-3-29 21:55 编辑 ] |