如何修复cache崩溃) J; X3 _2 N+ ~$ L% Q
$ @ `, ^: D A! J- ]http://www.hobbyistsoftware.com/InsideYourTreo/cache-crash.php
# t" f) c' G) V1 Q4 i
0 a, s8 Z7 |( }# U" C# b不稳定的palm会让你疯狂。更郁闷的是你无法确定究竟哪个程序引发了这个问题。
) V/ g" X6 J( Y如果你遇见的崩溃是随机的,看起来并非和某个特定的动作相关,那么这篇文章应该能帮助你。- G# _( Y Z% `1 z4 l% g$ E4 Y o
我会解释其中一部分这样的崩溃是来自哪里,同时,给你一些如何查找它们的线索。5 A' I; M$ g" \' K( w
这种类型的崩溃适用于所有使用了NVFS(non-volatile file system非挥发性内存系统)内存的palm设备。包括650以上的treo、life drve、tungsten E2、T5、Tungsten X 和 Zire Z22,今后可能有更多这样的掌机问世。
/ y" d( F% S1 \$ C+ n. c+ u4 Y0 `" n( Q" w3 B5 m
我们会用“Palm Internals”来观察treo的内部情况,用“Reset Doctor”来管理这些崩溃,同时有助于这些崩溃发生的更频繁:)。通过强制崩溃的频繁发生,更容易的制造这些崩溃,你可以更快的判断问题出在哪里。
7 s3 b0 m: g2 N- [ L9 V, C! T R
1 H* G" ]" s! g$ M4 y7 x快速cache翻新% V# d7 V9 ~8 \: ^/ B. c
我以treo 650为例,虽然各机型的存储容量不同,但适用于所有用NVFS内存的设备。) {. e* f7 K) k. x9 c
Treo 650宣称有32MB(23MB用户可用)的内存,但这并非表示你可以用到这么多内存。+ L& I# h" G& S- F/ Y
你不可能用23MB内存来运行一个应用程序。
. H( B9 u& V8 |; j) U运行中的应用程序无法抓取整块内存用来运算。$ m- R3 L+ G3 ]! f; Y. U
这和你的treo 600的内存是完全不同的。% N, N# T/ e/ b4 e8 z7 T, r
实际上,650的内存更象是一块内建的32MB SD卡,我下面将谈到NVFS内存的这种情况。3 ?; q3 a# B1 s e7 _
5 H' T' y7 I$ G3 pPalm不能在SD卡中运行程序,你必需把程序拷入RAM,在RAM中运行(你的launcher为你做了这些事,如果没有,那么get initiate(译者注:这句偶翻译不好,请达人指教))。你可能已经注意到从卡上运行程序会有延迟,那是你的launcher正在把程序拷入RAM。6 \) n) } c/ q A: h- C: L7 s
+ s4 S1 e5 l" {* p/ z& H7 ^4 RNVFS内存有同样的限制。你不能在NVFS内存上运行程序,系统也不能用它作为工作内存来进行运算等工作。为了做运算等工作,palm有一些正常的内存,在650上,大约是12MB,这就是我们所说的DBCache。" S: ^( U9 o. N7 D7 D7 n& e& P
9 K/ T+ y0 n8 P- y你设备上运行的程序认为它们可以拥有和处理的是一台有23MB内存的正常设备。它们希望可以存取数据库、创建数据库和使用这些内存。这意味着系统必需做一些设定的基础工作,在需要的时候动态的调用数据库和程序进入DBCache。当然,你不能把一夸特东西装到一品特的锅里,同样,23MB的NVFS和仅12MB的DBCache,DBCache必然会被装满。这时,系统不得不清理一些它认为不再需要的数据,这样就会导致错误。2 B7 i5 o+ t2 }
/ a% |+ a, |: I O3 @6 u在这里,你可以了解更多NVFS和DBCache的细节。6 O. B1 ^- [' l) d2 G
/ x+ f! x* T9 s
这样的确相当复杂,但Palm使用这样的结构有几个重要的原因。
2 \1 b& ^ m0 y& u* k
+ t: T6 F0 g; t; R, F) @1、就象SD卡,你的NVFS内存不需要用电力保存数据,这意味着电池耗尽也不会丢失数据。
9 y: e/ X" q' S. G2、既然NVFS内存不用电,那么,你的palm就可以有更长的电池续航能力。
8 m1 H+ h' M/ w# T+ u, {# h. N3、NVFS内存价格便宜。这使得我们的palm可以用较低的价格获得较多的内存,坦白的说,我很惊奇厂家为什么没有提供给我们1G内存的设备。(译者:我考,650也太小气了吧!)
' B$ [# F' f: I" S4 h0 q4 \% ?+ Z' F
哪里出错了?
* s/ _* W/ _0 D) ^) C我在上次的文章《公告、后台程序和快速上网的treo》中,我解释了程序是如何注册系统通告,当特定的事件发生时,操作系统调用该程序,给它处理数据的机会。. H1 K3 x7 ?4 k$ f# ]: W
7 ]5 H/ Y( a* ` c+ r% o
下面是它出错的步骤:
' }. h; ]: |. y% C1、一个程序(这里我们称呼它为“糟糕程序”)注册“hvch”通告,这是一个由任意一个虚拟字符被处理时发出的通告。你随时可能获得虚拟字符,比如按下键盘上的一个键、电池达到一定的容量、一个警报消除等等。& I5 n& _7 A6 _( \
2、“糟糕程序”关心的是速度,所以它注册了“the fast way绿色通道”。这意味着它告诉系统当通告发生时,请系统去某个特定的内存地址调用处理函数。- l, ?( Z: U2 d8 ]* ~2 n* y; O
3、“糟糕程序”一般都是几年前写的,当时它们的作者并不了解NVFS,所以,程序不会再做任何其它事,它开始坐等通告的发生。$ L- _9 @$ o9 e( j4 \% f5 Y" E4 U! r
4、在你阅读文档、玩游戏等的前几个小时里,程序会工作的很正常。% S. v0 y* a7 }5 w p( f, \
5、到了某个临界点时,DBCache装满了。, K' x9 s* `7 o% d8 d5 g! d. f
6、系统开始察看DBCache,它高兴的发现没有任何程序会用到这个“糟糕程序”,于是,系统把所有改动拷贝进入NVFS,然后在DBCache里面把它删除。
8 [6 `6 m* A3 g2 ^" a7、几乎与此同时,系统获得了一个虚拟字符,它开始试图去那个通告所注册的内存地址,运行相应的代码。比如说现在这个内存地址变成了你正在阅读的一个网页的代码,于是,系统崩溃了。: I' Y& m3 o7 {+ u8 |; r+ l+ L3 m
如果这时,你查看你的“崩溃日志”,你会看见一个类似“Emul68KMain.c, Line:403, illegal instruction xxxx at address xxxxxxxx”的错误提示信息。' I" U- r, \) R( _- ?; ^+ I2 Z7 U
现在编写的大部分程序都已经了解的NVFS的特性,所以,在上面第3步,它们会锁住自己的代码,禁止系统把它们从DBCache中清除出去。$ L4 \ K M' B& }# q4 R
* C' U8 ~' @5 O: g( t
Cache崩溃,你遇见过么?
' W/ {/ A- i7 i9 BDBCache崩溃的确很难弄清楚。它有可能引起、也有可能不引起上表所列的错误,你也永远无法知道它发生的时间。
/ M) @9 a# ^! {+ v2 W一个简单的检查方法是使用“Reset Doctor”。它可以让你按一个键来清除你的DBCache。如果这样引起了一次崩溃(或者在你清除DBCache后不久发生崩溃),那么,你的系统就是有这个cache崩溃问题。6 s0 j; n/ B5 C# ]# W, F* d, `2 G
“Reset Doctor”也可以让你自动清除DBCache来保持一定量的空闲内存。一个程序退出和另一个程序启动时,如果必要,“Reset Doctor”会清空DBCache。这意味着DBCache清理未必会在一个程序实际被打开时发生(这是另一件可能导致故障的操作)。更重要的是,“Reset Doctor”可以在它清除DBCache和系统重启时保存信息至日志文件。如果你的日志文件显示崩溃是在DBCache被清除后不久发生的,那么,这是系统有cache崩溃问题的又一信号。
! E* v& Q" v9 |# `
+ h1 T# X# C/ T) _Cache崩溃:你可以做什么
, ^+ D6 _9 ~5 F" x, k- l9 ?! f% X我们能很方便的找到大多数注册为“the fast way绿色通道”通告的程序,同时也很方便能判断出它们是否锁定了自己。下面是做法:
, f% `+ _; i0 S1)运行“Palm Internals” 点击“Notif”按钮,你可以看见如下列表:/ b5 Y+ f6 ]5 q1 k0 _' n) n2 @
*如果系统的状态相当差——甚至运行“Palm Internals”都会导致cache被清空、系统重启,那么你必须把你怀疑有问题的程序移到卡里,手动重启机器,然后再次运行“Palm Internals”。如果可以正常运行,你可以逐步将这些程序移回内存同时注意观察是否有问题。
" e2 w0 R8 e5 v6 \7 }9 l' F0 T2)检查这个列表,找到其中在它们注册后含有'm68k xxxx DBCache'字样的程序(这些是那些注册为“the fast way绿色通道”的程序)。我的列表中会有“butler”和其他一些“糟糕程序”。这些就是你的怀疑对象。
" b; {( C. h4 b; m! `3)选择menu-locked DBs,这可以显示哪些数据库被锁定。
, v; i% j. o& A' d' m9 l5 T4)检查你的“怀疑列表”中的每一个程序。如果其中一个程序没有锁定自己的源代码,那么可能它就是导致出错的原因。我这里,“butler”已经锁定,而另外一个“糟糕程序”则没有。1 F* r9 s- j$ j! Q$ _( i
5)选择menu-protected DBs。列出哪个数据库做了保护,不被删除。2 M; S3 ^: D7 _9 A: Z2 I
6)检查你的“怀疑列表”中的每一个程序。这个检查相对不太重要,但程序应该能保护自己从而能知道系统什么时候会再次删除它们。“butler”被保护,另外一个“糟糕程序”则没有。
5 J; O# O K0 M
. B6 |7 x$ r) k; m0 b# N: Z你现在已经有了风险程序的列表,尝试把它们删除(或者移到卡里)。如果走运的话,你的palm就会稳定。! ?6 R5 v$ H' y- k" z+ d
一旦你弄清除这些风险程序,你可以不再运行它们,或者用类似“Resco Locker”的程序来锁定它。一个附加的好处是:你现在已经确切知道哪个程序有风险,你可以不必再锁定其他的程序!过度使用“Resco Locker”有可能迅速填满你的cache,而且看起来会导致它自身出现问题。
/ C' {- i1 {% p' L8 r
1 O7 q8 E, d# {6 ]( ^. l/ t这样做容易么?
6 a w7 @) _5 o& b! K" {希望如此!不幸的是,还有一些事会发生。
: P1 k" e9 F! Z你的“怀疑列表”并不十分完整。一些程序不使用通告直接潜入你的系统。它可以在后台做任何处理,并且不会显示在通告列表,你也就无法把它加入怀疑名单里。“LudusP”就是这样一个例子,它虽然是潜入系统,但我确信它给自己加上了保护。 }# @" E4 L0 e4 ]3 r
还有一些程序仅在特定环境下才会注册通告。举例来说,一个程序可能为与通告相关的电话注册了“the slow way慢速通道”,但当电话正在进行时,它为关键按键注册了“the fast way绿色通道”。% q) S- N9 {$ l0 W
/ q1 T4 Y: D( T7 t& ]+ X/ h- D
还有么?谁知道呢!palm总会用一些特殊的方式让我们吃惊……
. N! `) V. G L, n& Y& g0 ?. e而且,这也是我们期待的……(译者:对于崩溃,我可一点都不期待!)
$ r$ c3 I3 y4 L' I- X& n
5 V: l/ A5 _! p6 B# ` s和palm和谐相处并不容易,但对于开发者来说,总有很多快乐的事可以做。5 y/ u( d1 a" c7 A/ t
' ^* Y& [0 p2 O; G4 N. g
一个避免锁定代码的技巧是把它拷入一些特征内存。这是操作系统可以识别需要留下来的正常内存。7 [$ H4 |1 f9 e, R* |6 A- B
这个技术被Daniel Grobe Sachs,可能还有其他人所采用。
+ t6 M$ {3 j8 k$ A/ d不幸的是,我不知道有什么办法能让你检查哪个程序运用了这个技术。
; g3 [. j* \: c* j: v- n
R( e4 E0 s- z2 [2 S[ 本帖最后由 anil 于 2007-3-29 21:55 编辑 ] |