VxWorks调试备忘录
Posted 布列瑟农的秋天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VxWorks调试备忘录相关的知识,希望对你有一定的参考价值。
1. 系统出错打印出堆栈时,不一定是打印堆栈附近的代码报错了,有可能是前面代码报错了,然后随机延时了一段时间才把堆栈
信息打印出来了,需要加在前面代码中不断缩小范围排查;
2. 中断处理例程里面尽量不要使用memset去初始化数据结构,否则有可能会导致系统卡死;
3. 中断处理例程里面不要使用for循环去初始化数据结构,否则会导致系统卡死;
4. 中断处理例程里面不要使用new X(),单参数的new()会调用malloc(),而malloc有可能会进入睡眠,从而造成死锁;
5. 初始化数组时,使用int msgq_item[4] = 0 这样方式,编译器可能只初始化了msgq_item[0]等于0,其他几个成员可能没有初
始化,因此有出现异常的风险。需要分别逐个初始化,msgq_item[0] = 0,msgq_item[1] = 0, msgq_item[2] =
0, msgq_item[3]= 0,这样写比较严谨些。
6. 在中断处理例程里面打印信息,建议使用logMsg,使用printf打印可能会导致系统卡死。
7. 当出现堆栈错误时,将错误指向的地址复制到终端命令行上执行,也许会显示出具体的某个函数+偏移。如果是0地址,那么肯
定是代码里面出现NULL指针操作了,需要自己加log定位。
8. 编写代码时,不要使用goto语句,因为workbench工具链对goto语句支持不太友好,简单一点的goto语句没问题,复杂一点的
编译会报错。
9. 命令行终端可以执行“函数名+参数”,有些时候想验证接口的时候可以通过这种方式验证结果。
10. 在中断上下文中使用memset要格外注意,memset可能会造成系统卡死,或者造成函数参数无法正常使用,例如参数无法打
印,一打印就卡死。此时,如果出现卡死问题,可以排查下是不是memset引起的,如果没有更好的解决办法,可以暂时使用
for循环来代替memset。
以上是关于VxWorks调试备忘录的主要内容,如果未能解决你的问题,请参考以下文章
VxWorks Fuzzing 之道:VxWorks 工控实时操作系统漏洞挖掘调试与利用揭秘