旧日志

14:00 2004-3-25
开始看sym和dcf格式
20:28 2004-3-28
整天下雨,真郁闷:(
16:27 2004-3-30
基本把sym和dcf搞定,确定大体的方案,符号转化为物理地址
10:00 2004-3-31
今天居然发现了编译器的一个BUG,如果在C程序中使用结构体或联合体,
用typedef来定义的话,dcf文件中的代码对应关系就会不正确,差几行.
把定义拿到一个单独的头文件就可以了.不用typedef也不会出现问题:(
11:36 2004-3-31
生成2500NOI输出格式的文件,源文件和代码的对应关系确定.暂时没有考虑含有转移结构(if,call,goto,while,do,for),顺序结构的调试步骤:在下一个行所对应的地址设断点.暂时没有区分step in和step over :)
15:14 2004-3-31
if结构已经解决(理论上),纪录每一个if所涉及的2个地址:条件满足所执行语句的地址;条件不满足所执行语句的地址.执行到if时,在这2个地址都打断点,到断点后看是哪个地址就可判断出程序有没有跳转,通过查表,把地址转换成行号:)这样就需要把断点管理好,不发生冲突^_^
15:39 2004-3-31
对于while的处理,和if一样:D
16:50 2004-3-31
while和if不一样啊while要处理while loop bottom :(
17:33 2004-3-31
把while和for一起解决掉了,方法是再添加一个跳转表,纪录跳转和跳转到的地址.对于while有一个从bottom到top的跳转,对于for有2个跳转:bottom->adjust & adjust->top,另外for还有一个分支:由top到body以及到bottom以后.跳转表可能适用于即将处理的call,goto等还有讨厌的switch,估计要费点功夫吧 :P
17:44 2004-3-31
解决goto真是太容易了,添加到跳转表就可以了 :D
9:50 2004-4-1
我不知道昨天下午的工作是不是很愚蠢,今天想到可以把每一行对应的地址打断点,这样就不用分析程序的结构了,当然很简单,但是这样以来模拟器每执行一条指令就要查一大堆断点,肯定会影响速度:(
10:25 2004-4-1
如果单步调试程序或者过程调试,程序执行速度肯定很慢,这样在所有行打断点也可以啊,要是程序全速执行的话,这些单步的调试断点无效,一个也不用检查:D,看来昨天下午的功夫全废了,不过多少也学了点东西,以后(如果)做编译器什么的应该能用上:P该死的switch也不是好处理的,我感觉dcf没有提供足够的信息,特别是多个switch嵌套时很难处理.关键是不知道break以后跳到哪里?
16:37 2004-4-1
function call:内嵌汇编都作为1行处理,即SRC_LINE_START和SRC_LINE_END,里面有JSR指令也不会出现FUNCTION_CALL.
9:24 2004-4-2
对于ASM文件,一个文件中可以包含多个section,放到多个group里面,产生的代码分段,不连续.可以通过比较相邻的两个地址,差大于10000h就认为是2个section ^_^
10:59 2004-4-2
任工提了几个意见:(1)修改连接的配置文件,使得逻辑地址和物理地址有联系,可以互相转化,这样DCF中的地址转换和系统就没有关系了,不过要设置2个参数,基地址和逻辑地址每个BANK号所对应的BANK个数,现为4. (2)还是要分析程序的结构.
就是SWITCH罗嗦一些,打断点的方式:修改断点的程序为BRK,就跳到断点处理程序了:D
15:23 2004-4-2
哈,把地址都统一了:在连接的配置文件中,locate at的地址要和link to的地址一样,这样DCF中的地址都是带BANK号的逻辑地址.不过重新组合的配置文件要罗嗦一些.
10:24 2004-4-3
讨厌的SWITCH还是很难处理,要求最后一个CASE或者DEFAULT的最后必须要用BREAK.而且我决定用多趟扫描处理.第一趟:
13:53 2004-4-4
统计出有多少行对应信息,单分支和多分支的数量,计算出总的内存用量.第二趟:分析出每一个行对应关系,单分支,多分支,跳转调用等信息并纪录.统计各个模块所占的区域.其中SWITCH_BREAK以及BANKED FUNCTION CALL都读了TSK文件,从生成的代码得到地址信息;D
14:36 2004-4-4
DCF分析的差不多了,现在继续看SYM:对变量常量而言,banked(far),register不起作用,被编译器忽略了:)对于static:变量在function里面时在符号前面加了一个?.
21:34 2004-4-4
没有想到SYM文件也这么烦人,主要是怎么把符号分类,要分的清晰,容易双向查找.
11:00 2004-4-5
刚又问了任工,符号存储可以使用临时文件,不要求从地址查符号,反汇编时就不用符号了:D遇到function时需要知道SP的值来查看局部变量,这样处理:到一个function开始时,执行到下一条语句开始,即函数体的第一行,函数完成对局部变量的分配,纪录此时的SP :D 对于局部变量和全局变量重名字的,以局部变量优先.程序要能够自动处理C符号前面的下划线(局部static为?,banked产生的地址符号为&)
21:24 2004-4-5
居然没有用临时文件,和DCF一样,对SYM同样进行2次扫描,第一次计算所用内存量,第二次分析文件.不解的是,我以为只有局部static会加?,今天发现了还有几个也加?,没有什么规律,干脆把他们全部换成_了:)符号分析出来全部放在内存中!现在测试程序大约占2M多一点吧:)最后对符号排序,本打算写一段排序程序,正考虑怎么排的更快时,突然想起来qsort :D,用qsort排序巨EZ,不费吹灰之力:D排序之后发现除了S打头的符号多一些(居然1K多!),其他字母的都不多,顺序比较来查找都没有问题,只要做一个索引就完了,其实1K也不算多嘛,现在机器这么快的^_^
8:46 2004-4-6
索引建立完毕:)
10:49 2004-4-6
简单的符号查询做完了,感觉有一点轻松:)不过又发现了一个BUG,结构体没有对应好:(
10:51 2004-4-6
是一个小错误,马上就搞定了:D下一步:反汇编!
11:35 2004-4-6
发现BUG:对于for(;;) ...;格式的语句,只产生FOR_LOOP_BOTTOM
14:21 2004-4-6
又修改了一下程序,这样不允许出现下面的结构:
for (;condition;){}
for (;;adjust){}
for(;;).
17:37 2004-4-6
真郁闷,又是该死的switch,break的信息还是不够:(
19:36 2004-4-6
仔细分析了一下,出错误的地方都是由switch break产生的,所以就把地址转换为大于此地址中最小的地址.
另外由于lib中的代码在dcf中没有相关的调试信息,所以不能进行源码调试(源码在哪儿啊?)还有系统中的editb中有一个for用的不规范.
20:18 2004-4-6
MD,continue一点信息也没有产生,在DCF中根本没有出现!!!!生成一个JMP代码.
20:34 2004-4-6
FT~~,不用处理continue了:D
8:23 2004-4-7
开始看看界面:)
14:33 2004-4-7
开发文档写完,待阅,看看界面代码:)
9:31 2004-4-8
把工作区搞定:)
10:32 2004-4-8
输出区框架搭好
14:06 2004-4-8
上午刘谋平提出建议:
“从文档描述来看,你写的这个调试器的功能已经可以满足我们的开发需求了。不过,对源文件程序 for 循环的格式要求不点不太爽,我希望对 for 循环条件块没有任何要求。另外,locate at 和 link to 地址要保持一致,在调试单个程序的时候没有什么问题,但在联调的时候就会遇到一些麻烦,幸好这个问题不是太重要。”
另外还有:最好要支持条件断点,对某个变量进行监视.
20:15 2004-4-8
MD,CJ60的类库竟然有些BUG,dock的工具栏浮动时菜单就不好用了,幸好问题不大,很容易解决了:)
14:10 2004-4-9
界面基本搞定,要处理接口了.
19:42 2004-4-10
MD,终于把界面搞定,费了好多功夫.开始我怀疑选择MDI模式是不是不如SDI合适,用SDI的话就只有一个窗口了:(最终还是决定用MDI,但是是形式的MDI,内部把他看作SDI处理了:)具体是:保证系统只有1个DOC,这个DOC可以产生多个不同的VIEW,参数不一样,结果就不一样,还是用同一个VIEW类.还有好多等着做啊,努力ing...
17:36 2004-4-11
左面的目录树也搞定了:D
22:25 2004-4-11
把前段时间写的DCF和SYM处理程序移植过来了,还没有完全处理完,整体框架没有变.写了好长时间的REMARK,没有办法拉~~~~
22:27 2004-4-12
MD!程序在DEBUG时好用,RELEASE的就不好用了!!
22:41 2004-4-12
找到问题所在了,还是内存不够用,但是还没有找到好的解决方法,居然在DEBUG下能用!
8:36 2004-4-13
今天换了一下方法,用静态数组,这样好用,但又换成动态申请时,又不出问题了,郁闷!
10:57 2004-4-13
哈哈哈哈!不用管混合模式了!只管源代码和反汇编2种模式!
21:04 2004-4-13
MD!终于把内存的问题搞定了,原因是多用了一个字节!!!!!太吝啬了,一个字节都不让多用!!还有一个问题是CDbgView::UpdateViewInfo中没有判断模式,导致程序出错,奇怪的是调试时不出现问题,即使RELEASE版本调试也不出问题:(幸好用了OLLYDBG来调试RELEASE版本的,比用VC还方便:)
15:16 2004-4-14
开始准备接口和模拟器了。
11:19 2004-4-15
ha!模拟器能跑起来了:D
16:12 2004-4-15
又修改了模拟指令的几处错误,大多是数据类型不同引起的.现在模拟器跑不出问题了,死不了了.
18:39 2004-4-16
hahahahahahahaha!困扰一下午的问题解决了,居然在吃饭的时候想起来的:) 模拟器用DLL方式,在调试环境里面反映非常慢,但是单独跑就不慢,开始以为线程同步什么的有问题,试了好多方法,做了2个外壳来加载DLL都很正常!在打饭的时候还对刘谋平说帮着解决一下,结果刚坐下吃饭就想起来了:刷屏间隔时间太长!根本没有刷新屏幕!原来在LCDVIEW里面是1000毫秒刷一次,改成100就OK了:D
21:24 2004-4-17
断点管理不是那么容易啊,努力中....
16:06 2004-4-18
不允许在非程序段设置断点,复位代码中第一个JSR也不能跳过,因为断点会修改内存,非程序段会造成数据破坏!!!!!
20:06 2004-4-19
下午发现把LCD集成是件愚蠢的事情,不如放在DLL中处理,于是用了整个下午,把DLL底层重新整理了一遍,现在LCD窗口由DLL产生,并且可以用消息循环了:)可以单独接收键盘.PS:刚把汇编级STEPOVER做完,不过和STEPOVER一样,不小心会跑飞,归根结底都是BANKED CALL中$D572段的间接跳转,用RTS来代替JMP!
20:27 2004-4-19
MD,把RESET段的JSR和IND CALL段的RST都给限制!在这2个点上单独处理STEP OVER和STEP OUT!
21:01 2004-4-19
SET/REMOVE BP,RUN 2 CURSOR 全部搞定(汇编). :D
10:11 2004-4-21
C的基本都完成了,还有一些小问题,STEPOUT还有重新修改一下.ASM的只要处理RTS
11:36 2004-4-21
我好像又发现了一些什么,SWITCH CASE结构中最后一个CASE的自动添加的,为SWITCH的BOTTOM :)  <---有待于验证!!!
11:53 2004-4-21
switch中如果没有default,才会出现上面的情况,有default最后一个就是default,但是跳转的地址有的加了0x4000,好像没有什么规律。另外源程序应该尽可能的采用PC换行格式,不能混合使用,否则行对应就会出错
12:28 2004-4-21
换行格式没有太大的问题,调试程序中能处理混合的换行模式,只是在EDIT+中行号没有对应而已:D
13:20 2004-4-21
哈哈哈哈哈!!!终于让我发现规律了,原来又是一个大大的BUG!连接时候把const_data放在对应的program前面,SWITCH一切OK,放在后面的话,就完蛋拉~~~
13:42 2004-4-21
MD!!把const_data放在前面程序还不能跑!大概和调度有关系吧
14:49 2004-4-21
赫赫!可以的,可以把const_data放到前面,除了lib和dictgui,其他的都可以.
15:07 2004-4-21
2500A.D.实在太烂了!!!把const_data放到前面,TMD switch case产生的地址还和以前一样!
真实的地址已经加了数据的长度了.好在数据段的长度能够知道,通过第一条指令的地址就知道,
毕竟比起找program的大小要简单的多!
15:13 2004-4-21
2500A.D弱智!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
15:37 2004-4-21
switch-case结构中,如果case分支多于4个(不包含4个),编译器会采用单独的__switch_comparison来处理,这种情况下前N - 1 个分支的地址信息都不正确,只有最后一个是对的,default也算一个分支,如果没有default的话,编译自动加一个bootom of switch作为default
21:08 2004-4-21
连接的时候把program放在前面,有些SWITCH的CASE地址就加了一个program的长度,把const_data放在前面的话,就少了一个const_data的长度
9:23 2004-4-24
赫赫,用了一天多的时间,把变量TREE基本的东西搞定了:)
16:20 2004-4-27
今天上午开始做REGISTER,现在完工了.WATCH还没有完成,主要是STRUCT POINTER ARRAY混合的情况很复杂,还没有想出来好的方法.努力...
17:27 2004-4-28
哈,终于把WATCH的TREE搞定了,把以前的非递归代码都换成递归了,非递归麻烦也容易出问题.在解析符号时也用了递归,数组的优先级最高,其次是指针,最后结构体.
下面是用来做测试的一些符号,都很正常:)
偶尔在删除操作时出了问题,改了相关的一点代码后再没有出现.
union BBB
{
char a[4];
int b[2];
long c;
};
struct AAA
{
char a[4];
int b[2];
long c;
struct AAA* pNext;
};
struct AAA aaa;
union  BBB bbb;
struct  MMM{
struct MMM* bbb;
char data;
}ttt,*d,**mmm[2][1];
char     a_1[2];
char     a_2[2][2];
char     a_3[2][2][2];
char*    p_1;
char**   p_2;
char***  p_3;
char*    pa_11[2];
char*    pa_12[2][2];
char*    pa_13[2][2][2];
char**   pa_21[2];
char**   pa_22[2][2];
char**   pa_23[2][2][2];
char***  pa_31[2];
char***  pa_32[2][2];
char***  pa_33[2][2][2];
只可惜不是动态的,特别是链表,进行了层次限制,以后再做,坚决要动态,即在展开和关闭分支的时候重新对树做调整,把不可见的分支全部清理掉.这样更省内存,特别是一个特别大的字符串数组,例如char szName[1024],而这个数组只放了几个字母,静态时会创建1024个分支,即使永远不展开,永远不可见!而动态的话事先不用创建分支,等的确需要展开时,并且做提醒,才展开.
23:52 2004-4-28
自己做了一个bitmap menu,其实也不麻烦,重载2个函数就可以了:)
10:20 2004-4-29
实现了NavigateTo,GoBack,GoForward等象浏览器一样的功能:)历史纪录:256个地址.
19:24 2004-4-29
已经把地址搞定了,剩下的是显示了.
11:41 2004-5-1
哈哈,watch都已经搞定,16进制和10进制互相转换,随意修改,局部变量都支持:)
18:23 2004-5-1
下午本来准备做MEMORY的,但有些东西还没有确定,等刘谋平回来听听他的意见再做.
重新看37020资料,对模拟器做了改进:
(1) 加入了HALT模式,使模拟器占CPU率大大降低,一般10%左右,未使用前是100%!
(2) 对模拟器的MEMORY管理重新做了调整,由原来的一次申请16M改成用多少申请多少,按1M分页,这样使模拟器占MEMORY减少,调试512K的TSK时只占用不到3M的MEMORY,其中包括录入 准备看看FC之类的模拟器,搞清楚现在的模拟器为什么这么慢!
9:28 2004-5-3
昨天一整天都在优化模拟器,最后把瓶颈找到了:CPU_Execute这个函数,特别是检查中断,对速度影响很大.我把底层的东西改动了很多:
(1) 对0x300一下地址的访问全部采用函数指针数组,这样就不用switch来判断地址了,只是需要区分FLASH
(2) 对于某些寻址或指令中,固定访问低端内存的,例如0页,堆栈等,全部不用转换地址,直接访问内存.
(3) 检查中断的条件由以前的判断P & 4改成判断新加的标志bWantInt,这个标志只有在产生中断(如按键,TIMER)以后,才设置TRUE,根据这个条件来判断中断的命中率为100%!而且不用比较跳转,直接用函数指针数组,对于预取指令页同样采用函数指针数组.
(4) 对程序的运行方式,主要是TIMER的产生做了调整,程序运行时纪录运行的时钟周期,到一定数量(目前40000个对应10MS)就产生TIMER.当CPU HALT以后,模拟器同样Hibernate,但是Hibernate之后要增加运行的ticks,这样可以产生TIMER,来启动CPU.
(5) 现在模拟器可以用2种内存模式编译,普通模式申请16M的内存来RUN,得到物理地址后不用转换,直接从内存中读取.COMPACT模式是加载多少ROM,就申请多少内存,得到物理地址还要再经过一次映射.COMPACT模式目前在A600还没有完全解决,是A600扩展内存的原因.A100的科学计算器也存在问题
(6) 对于关键的地方用汇编写了代码,速度有所提高,但是不是很明显,编译器本身已经做了很多优化,和用汇编书写相差无几,有的甚至更好!对于2种内存模式编译出来,速度差别也不是很大,测试时是让模拟器连续跑1000000个TICKS,计算一下时间,内存模式会影响10~20个ms.陈泽伟提出了一种新的方法:在切换BANK的时候,单独拷贝16K到逻辑内存,然后在64K空间使用,这样不用进行地址转换.但是目前模拟器是和调试器做在一起的,这种方法有一些限制,如FLASH等,有好多东西要重新设计,单独做模拟器的时候我会去尝试一下速度.
(7) 有些函数如CPU_ReadByte,CPU_Write可以_forceinline.
(8) 现在模拟器跑伏魔记的速度已经很快了,特别是开始的动画,加了休眠后也很流畅.
10:00 2004-5-3
昨天发现的新问题:方块游戏完成一行后会等待很长一段时间,在任新村做的模拟器也有同样的问题,跑A100的ROM没问题,A600就出现.
原因:
A600完成一行会调用SysSpeBackSoundPlay来播放声音,底层的_Speech691_initial和_Speech691Play都有延时的等待,现在的691又没有去模拟,才产生上面的问题.
其他:播放声音的时候程序一直在等待,做不了其他的事情,浪费资源,真的很郁闷!
21:56 2004-5-5
这2天MEMORY迟迟没有做出来,我似乎在做一些无关紧要的事情:
(1) ANSI C对memcpy没有规定重叠,memmove是可以重叠的.
(2) for (i = 0; i < strlen(str); i++) 是平方的.
14:11 2004-5-11
今天终于把MEMORY完成了,但是最近又发现了许多新的问题,需要进一步改进.
15:28 2004-5-21
在关闭调试器的时候,0xA44E6A和0xA44E74会产生异常,对应setticks,此时内存已经释放,为什么还会去访问??
17:20 2004-5-21
上面提到的是线程部同步的问题,要先终止模拟器线程,再释放DLL.
15:22 2004-5-22
偶尔在变量窗口中展开一个数组时出现了一次内存异常.
9:39 2004-5-24
1.数组异常是DrawItem里面获得ItemData为0,暂时做退出处理
2.Watch新加直接输入地址模式,格n@xxxx,n = (1,2,4)代表字节数,xxxx是地址

                     /---
                    /
|  |__/^^^\^\ /^:\  |
| |__/\____\/^\__/  |
 --------------------
 \__________________/
   /              \
  ⊙              ⊙
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,您可以编写一个 Shell 脚本,结合 `find` 和 `rm` 命令来实现日志目录大于1GB自动清理日志的功能。 以下是一个示例脚本: ```bash #!/bin/bash # 设置日志目录路径和阈值大小 log_dir="/path/to/log/dir" max_size=1073741824 # 1GB,单位为字节 # 查找日志文件并按修改时间排序,最早修改的文件排在最前面 log_files=$(find $log_dir -maxdepth 1 -type f -name "*.log" -printf "%T+ %p\n" | sort) # 计算日志目录的总大小 total_size=$(du -cs $log_dir | tail -n 1 | awk '{print $1}') # 如果总大小小于阈值,则直接退出 if [ $total_size -lt $max_size ]; then exit 0 fi # 遍历日志文件列表,删除最早修改的文件,直到目录大小小于阈值 for log_file in $log_files; do size=$(echo $log_file | awk '{print $1}') file=$(echo $log_file | awk '{print $2}') total_size=$(($total_size - $size)) rm $file if [ $total_size -lt $max_size ]; then break fi done ``` 该脚本首先设置日志目录路径和阈值大小,然后使用 `find` 命令查找日志文件并按修改时间排序,最早修改的文件排在最前面。接着,统计日志目录的总大小,如果总大小小于阈值,则直接退出。 如果总大小大于等于阈值,则遍历日志文件列表,依次删除最早修改的文件,直到目录大小小于阈值为止。每次删除文件后,都需要更新目录大小,如果目录大小已经小于阈值,则退出循环。 最后,您可以将该脚本加入到定时任务中,例如每天凌晨执行一次,来实现自动清理日志的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值