如何修复cache崩溃! |+ @3 C. \0 J) M& `' z, H
$ d3 }1 M% T; A8 zhttp://www.hobbyistsoftware.com/InsideYourTreo/cache-crash.php' ~& t, R+ s) K# d
8 E8 y4 r. x! p V7 @6 o
不稳定的palm会让你疯狂。更郁闷的是你无法确定究竟哪个程序引发了这个问题。5 `0 k, h- ^+ _* x0 x
如果你遇见的崩溃是随机的,看起来并非和某个特定的动作相关,那么这篇文章应该能帮助你。
0 X$ [$ p; w! V1 @3 i% r我会解释其中一部分这样的崩溃是来自哪里,同时,给你一些如何查找它们的线索。# F! G5 S' D3 |7 X# X
这种类型的崩溃适用于所有使用了NVFS(non-volatile file system非挥发性内存系统)内存的palm设备。包括650以上的treo、life drve、tungsten E2、T5、Tungsten X 和 Zire Z22,今后可能有更多这样的掌机问世。
- T6 T: E* K/ w0 Z. L! `- k: q3 n0 S
我们会用“Palm Internals”来观察treo的内部情况,用“Reset Doctor”来管理这些崩溃,同时有助于这些崩溃发生的更频繁:)。通过强制崩溃的频繁发生,更容易的制造这些崩溃,你可以更快的判断问题出在哪里。
& \$ x; Y0 Z+ v0 P& T9 I, A5 _0 n) b& @
快速cache翻新
: @0 a4 t% K- n我以treo 650为例,虽然各机型的存储容量不同,但适用于所有用NVFS内存的设备。
; r8 i a9 {$ Y7 ]$ {( cTreo 650宣称有32MB(23MB用户可用)的内存,但这并非表示你可以用到这么多内存。2 V. @7 W$ R L
你不可能用23MB内存来运行一个应用程序。8 z% o% z; U% ]3 V4 Q# I# I
运行中的应用程序无法抓取整块内存用来运算。
$ W7 M) \7 V8 g& P$ ?7 f这和你的treo 600的内存是完全不同的。- S, E; Z) }: Y7 f
实际上,650的内存更象是一块内建的32MB SD卡,我下面将谈到NVFS内存的这种情况。# o1 r. I: E8 B; F* r
$ \# o) A/ T6 DPalm不能在SD卡中运行程序,你必需把程序拷入RAM,在RAM中运行(你的launcher为你做了这些事,如果没有,那么get initiate(译者注:这句偶翻译不好,请达人指教))。你可能已经注意到从卡上运行程序会有延迟,那是你的launcher正在把程序拷入RAM。
3 h, ~- f3 S; k% Z
$ q9 f6 s$ F* D/ r3 P8 K5 X% J7 PNVFS内存有同样的限制。你不能在NVFS内存上运行程序,系统也不能用它作为工作内存来进行运算等工作。为了做运算等工作,palm有一些正常的内存,在650上,大约是12MB,这就是我们所说的DBCache。
* K% K4 \0 n4 y2 r1 b! `$ ?$ B* S
你设备上运行的程序认为它们可以拥有和处理的是一台有23MB内存的正常设备。它们希望可以存取数据库、创建数据库和使用这些内存。这意味着系统必需做一些设定的基础工作,在需要的时候动态的调用数据库和程序进入DBCache。当然,你不能把一夸特东西装到一品特的锅里,同样,23MB的NVFS和仅12MB的DBCache,DBCache必然会被装满。这时,系统不得不清理一些它认为不再需要的数据,这样就会导致错误。9 v* x2 I# m* w. ]7 @
6 p: S! K3 a- o* n8 ^7 T在这里,你可以了解更多NVFS和DBCache的细节。
* o6 u4 m, I. X) o4 `# L; O$ N% L: L5 N6 \+ g' t" a, B) [
这样的确相当复杂,但Palm使用这样的结构有几个重要的原因。
( N% o! v5 [ Y" Y! ]& F
% Z9 {1 {& P' X, O$ ^5 t- Z4 J1、就象SD卡,你的NVFS内存不需要用电力保存数据,这意味着电池耗尽也不会丢失数据。! ^: A% U/ t. g5 R/ I# }
2、既然NVFS内存不用电,那么,你的palm就可以有更长的电池续航能力。
( b+ \& n4 S% H) i, q8 d3、NVFS内存价格便宜。这使得我们的palm可以用较低的价格获得较多的内存,坦白的说,我很惊奇厂家为什么没有提供给我们1G内存的设备。(译者:我考,650也太小气了吧!)
' d) G& U, D; h( }6 f$ g5 g( u
' a9 t* U; Y \0 I, F" k$ r2 o哪里出错了?
4 n# V* t9 ~" W1 [我在上次的文章《公告、后台程序和快速上网的treo》中,我解释了程序是如何注册系统通告,当特定的事件发生时,操作系统调用该程序,给它处理数据的机会。
* X1 }% V8 C: ^0 Y7 G4 z' `
6 t( [; z; b) @) d3 `& R ]5 j下面是它出错的步骤:
9 [1 Y4 F5 m; \/ j s4 w1、一个程序(这里我们称呼它为“糟糕程序”)注册“hvch”通告,这是一个由任意一个虚拟字符被处理时发出的通告。你随时可能获得虚拟字符,比如按下键盘上的一个键、电池达到一定的容量、一个警报消除等等。" a; `; H0 K. C$ d' x4 ]
2、“糟糕程序”关心的是速度,所以它注册了“the fast way绿色通道”。这意味着它告诉系统当通告发生时,请系统去某个特定的内存地址调用处理函数。
+ i* g- p, D, L8 e3、“糟糕程序”一般都是几年前写的,当时它们的作者并不了解NVFS,所以,程序不会再做任何其它事,它开始坐等通告的发生。 M6 F2 i2 N2 M+ U* T
4、在你阅读文档、玩游戏等的前几个小时里,程序会工作的很正常。
* e$ u4 t- a! i% t7 P) b T5、到了某个临界点时,DBCache装满了。
# c' E0 S; j! d1 F6、系统开始察看DBCache,它高兴的发现没有任何程序会用到这个“糟糕程序”,于是,系统把所有改动拷贝进入NVFS,然后在DBCache里面把它删除。+ n2 W) s4 R% B6 \
7、几乎与此同时,系统获得了一个虚拟字符,它开始试图去那个通告所注册的内存地址,运行相应的代码。比如说现在这个内存地址变成了你正在阅读的一个网页的代码,于是,系统崩溃了。
+ O, V3 S; Z F: J: n2 b& t如果这时,你查看你的“崩溃日志”,你会看见一个类似“Emul68KMain.c, Line:403, illegal instruction xxxx at address xxxxxxxx”的错误提示信息。
: l4 w3 g4 `+ B) x& _% r现在编写的大部分程序都已经了解的NVFS的特性,所以,在上面第3步,它们会锁住自己的代码,禁止系统把它们从DBCache中清除出去。: p3 {/ s$ y; i; |: E F
2 E. c2 O4 V+ D! O, v
Cache崩溃,你遇见过么?! E6 E4 E" o+ P" D" L0 H
DBCache崩溃的确很难弄清楚。它有可能引起、也有可能不引起上表所列的错误,你也永远无法知道它发生的时间。
$ }+ i9 J/ [4 s+ p* i. \9 O一个简单的检查方法是使用“Reset Doctor”。它可以让你按一个键来清除你的DBCache。如果这样引起了一次崩溃(或者在你清除DBCache后不久发生崩溃),那么,你的系统就是有这个cache崩溃问题。
- q$ u6 C% n W/ r, Z“Reset Doctor”也可以让你自动清除DBCache来保持一定量的空闲内存。一个程序退出和另一个程序启动时,如果必要,“Reset Doctor”会清空DBCache。这意味着DBCache清理未必会在一个程序实际被打开时发生(这是另一件可能导致故障的操作)。更重要的是,“Reset Doctor”可以在它清除DBCache和系统重启时保存信息至日志文件。如果你的日志文件显示崩溃是在DBCache被清除后不久发生的,那么,这是系统有cache崩溃问题的又一信号。
9 L' d' p: x& K* O
. @; T" ?3 D. ]4 S s: RCache崩溃:你可以做什么
' o0 R& }9 s2 j2 g% S9 x: \我们能很方便的找到大多数注册为“the fast way绿色通道”通告的程序,同时也很方便能判断出它们是否锁定了自己。下面是做法:
, C" u! V7 ]3 p/ K8 e7 i2 F0 V1)运行“Palm Internals” 点击“Notif”按钮,你可以看见如下列表:
$ Y/ V! U# `# F1 @*如果系统的状态相当差——甚至运行“Palm Internals”都会导致cache被清空、系统重启,那么你必须把你怀疑有问题的程序移到卡里,手动重启机器,然后再次运行“Palm Internals”。如果可以正常运行,你可以逐步将这些程序移回内存同时注意观察是否有问题。
/ n, `9 ]$ j# E2 I: w0 d# h2)检查这个列表,找到其中在它们注册后含有'm68k xxxx DBCache'字样的程序(这些是那些注册为“the fast way绿色通道”的程序)。我的列表中会有“butler”和其他一些“糟糕程序”。这些就是你的怀疑对象。
: r% @* v: j- D, z1 y( q. k3)选择menu-locked DBs,这可以显示哪些数据库被锁定。9 \! a' K; a ~) } e, i4 W! ], B
4)检查你的“怀疑列表”中的每一个程序。如果其中一个程序没有锁定自己的源代码,那么可能它就是导致出错的原因。我这里,“butler”已经锁定,而另外一个“糟糕程序”则没有。
# Q0 @- T5 ^' v F' s3 V5)选择menu-protected DBs。列出哪个数据库做了保护,不被删除。
5 w& ~: Y8 P0 ?& F/ k4 d% R. W6)检查你的“怀疑列表”中的每一个程序。这个检查相对不太重要,但程序应该能保护自己从而能知道系统什么时候会再次删除它们。“butler”被保护,另外一个“糟糕程序”则没有。3 n& j1 H$ V( V% x
3 G3 h. e9 d% R3 [- Z& u你现在已经有了风险程序的列表,尝试把它们删除(或者移到卡里)。如果走运的话,你的palm就会稳定。3 B8 d3 A) }9 E! h8 y2 W7 W# H
一旦你弄清除这些风险程序,你可以不再运行它们,或者用类似“Resco Locker”的程序来锁定它。一个附加的好处是:你现在已经确切知道哪个程序有风险,你可以不必再锁定其他的程序!过度使用“Resco Locker”有可能迅速填满你的cache,而且看起来会导致它自身出现问题。
- ?$ W& Q" i- X6 H9 ]: y- k+ @2 b G0 d0 v0 x) `
这样做容易么?
- J, p) [" \" _7 Y1 S2 J% G希望如此!不幸的是,还有一些事会发生。, j z. X; s* i0 e$ g" M
你的“怀疑列表”并不十分完整。一些程序不使用通告直接潜入你的系统。它可以在后台做任何处理,并且不会显示在通告列表,你也就无法把它加入怀疑名单里。“LudusP”就是这样一个例子,它虽然是潜入系统,但我确信它给自己加上了保护。
3 t$ R( W) {) F1 N7 N! v还有一些程序仅在特定环境下才会注册通告。举例来说,一个程序可能为与通告相关的电话注册了“the slow way慢速通道”,但当电话正在进行时,它为关键按键注册了“the fast way绿色通道”。
; z* d" d) [! i6 U# D/ n( e9 f; f" D# F0 A
还有么?谁知道呢!palm总会用一些特殊的方式让我们吃惊……, a4 W. H; P- F1 G. e0 i; Q" f
而且,这也是我们期待的……(译者:对于崩溃,我可一点都不期待!)
8 j' I' `! |& a# ]! W8 W, p
4 [. W, w" o c和palm和谐相处并不容易,但对于开发者来说,总有很多快乐的事可以做。
/ N5 ~6 _; o: D- z; Q2 n1 S% f% N" C! Z# x6 C- {. Y
一个避免锁定代码的技巧是把它拷入一些特征内存。这是操作系统可以识别需要留下来的正常内存。7 k- L, B0 z. k& E. ^7 A" F
这个技术被Daniel Grobe Sachs,可能还有其他人所采用。- ~+ a" W) \* t9 I L
不幸的是,我不知道有什么办法能让你检查哪个程序运用了这个技术。
5 S$ i" z/ \: A) [& R) z; Z1 n& }# V/ k8 M2 `$ P/ r* |+ H
[ 本帖最后由 anil 于 2007-3-29 21:55 编辑 ] |