一月工作总结

来源:互联网 发布:帝国cms在线视频网站 编辑:程序博客网 时间:2024/04/30 12:09

看到业已蒙上灰尘的总结,贴出来吧,年前写的。

 

1, 

对于结构体变量进行初始化操作,特别是用初始化参数列表方式进行初始化,应该注意数据位的对齐。

例如:

        Typded structure _testStruct

{

  Int a;

  char b;

  Int c;

}TestStruct;

TestStruct test = {1,2};//这里的2被赋给b了。

2, 

关于内存管理

这里涉及qualcomm的机制。在app退出时,默认会将该应用所有申请的空间释放了。

Ams启动三个APPlaunchapp mvmappamsapplet,进去java app再退出时,实际上只退出了UI显示的amsapplet,仍有launch app在后台运行,而mvmapp则是在java程序运行时才存在的。因此,退出java app时,该app实际上还存在,不会将里面分配的内存释放掉。

而在filemanager中调用amsext,退出filemanager,根据高通机制则将整个app分配的内存都释放了。对于这点,会存在问题。因为在install时启动线程IAMSTHREAD_MainInstallSession内重建suitlst时,先释放内存再分配内存,这段内存,会在退出filemanager时释放掉。因此下次再进去filemanager调用这个install接口时,内存中就是存在乱数据了。

  解决方案:将安装线程maininstallsection中对amsenginesuitlist重建的代码拿掉,换为post event给一直在后台跑的launchapp,将amsengine传给launchapp,让launchappsuitlist的重建处理。这样,在amsext被释放之际,就不会释放掉amsengine

3, 

使用TRACE32分析死机问题。

1)在死机下,按”#”进入download模式,使用qpstmemory debug applicationdump文件getregions抓取下来,保存到路径A

2) 运行trace32 simulator,具体方式是将trace32目录下的config.t32中的PBI设置为SIM,然后启动trace32即可;

3) 在trace32命令行下,进入AMSS代码工程的build/ms目录,然后输入命令”do load_log.cmm”,然后将看到弹出窗口;

4) Select logtype选择USB crash logs,Select Debug Platform选择TRACE32 Simulator;Register Source选择rex_core;Select ELF file选择与手机上程序对应的工程elf文件,例如C7001.elf(elf文件大概200MB左右,这里要注意的是:需要编译debug版本);SelectLogFile选择对应的loadcmm,这个文件存放于下载USB dump时所选的目录下,在这里也即路径A;

5) 点击Go! Load the logs,trace32开始load USB dump信息,一切正常的话,将可以看到其存器中都有内容,并且会弹出死机时的代码信息;

6) 若看到寄存器都是0,则需要手动输入寄存器值。R0-R14以及PC的值都填入。可通过命令”d.dump jtag_console_buffer /nohex” 或者在工具栏中点击”console”按钮查看到寄存器值。也能使用do load_uitcb_register.cmm命令,自动填充寄存器的值,但需确保在build/ms目录下。

7) 若在工具栏没有”console”按钮,可能是因为没有安装L4的快捷命令菜单,可按顺序运行如下命令:task.config l4.t32, menu.reset, menu.reprogram l4.men;

8) 若是调试动态模块,则还需要输入命令”do csmods.cmm”,可看到弹出窗口中显示出所有的动态模块列表,以及起始地址和结束地址。根据PC地址值找到该值位于哪个起始地址与结束地址之间,就能知道死机死在哪个模块内。输入命令加载所需要调试的动态模块的elf,例如:” d.load.elf stk.elf 0x61a8aa8 /nocode /noclear”(这里的地址即为之前看到的起始地址,并且该命令要在elf所在目录输入);另外,还要将模块的源代码路进加进来,例如:”ypath d:/mmi/apps/stk/src”;

9) 此时开始各种分析工作,例如可以选择trace32的view->stackframe查看到函数call stack;查看代码运行处的变量等。

 

4, 

高通的3033版的空指针问题相关。

         3033  base line对空指针进行读写操作会出现死机,而3032 base line对空指针进行读操作不会死机,写操作则会死机。3032中,若进行读操作,则会返回0xdead的值(该值针对16位数据,随数据长度不同而不同,例如对于32位值,返回0xdeaddead)。

  PS:解释下对空指针的读写操作。

  Int32 *p = NULL;

  DBGPRINTF(“*p 0x%x”,*p);//读操作

  *p =  12;//写操作

5, 

文件操作相关。

C标准库定义了,WRITE不能直接修改文件中的某个字串,WRITE只能全部写覆盖文件。对于高通的IFile_Write,也是如此。

6, 

比较字符相关。

        char inch  =  ‘A’;

        char outch ;

outch = inch | 0x20;

使用如上代码即可将’A’转换为小写的’a’。因为0x20100000B),’A’1000001B),’a’1100001B),|操作后即可转为小写。对于其他字母也一样。此思想用于比较不区分大小写比较字母字串很有帮助,相对于一般算法(判断是否大小写再跟对应的大写或小写字母比较,例:先判断字母字符属于大写,在让字母字符跟’A’比较,而若字母字符属于小写,则让字母字符跟’a’比较)速度快。

 

原创粉丝点击