Engineering Excellence Traning
People, process, Tools
Advanced Debuging
By Raymond Zhang张银奎
CPU 的调试支持(INT1,INT 3)
软件支持调试应该由架构师通盘考虑。
Method for fixing bugs: intuition, Diagnostics, Leap of faith, Head in sand, Scientific approach.
软件断点:
Int3指令
・ 机器码为1字节,即0xCC
・ 没有数量限制
・ 局限性:
属于代码类断点,即可以让CPU执行到代码段内的某个地址时停下来,不适用于数据段和I/O空间.
对于在中执行的程序,比如或其他固件程序,无法动态增加软件断点,硬件断点。
Debug 与Release的区别之一:一个变量如果没有初始化,则在debug中编译器会初始化,而在release版中则不会被初始化(耗费时间),这也是为什么有时在deb ug中是好的而release版中出错的原因之一。
CPU的调试寄存器。
软件断点设置的是代码段的地址,硬件断点则可以是,代码段,数据段,I/O段的地址。
Exception and interuption
高级语言的Exception都来自CPU Exception,如 0 Divide-By-Zero, 1 Debug Exception, etc.比如,如果一个指针没有真正指向一个有效地址,这时往指针强行写值,CPU就会抛出Page Fault(14) exception
Best Practices:
Design code so bugs are easy to isolate:
・ Assertions
・ Tracing
・ Logging
・ Error Messages
・ IDs,在代码内部给每个错误分配一个错误ID,帮助开发人员定位源代码。
微软自带一个工具可以看window内核的tracing 信息,什么工具?
Write complete unit tests.
Set compiler to its pickiest mode.
Use tools to ensure good code coverage. i.e: Magellan from MSR.
Time spent on quality saves time later!
函数返回值都是放在Ax寄存器中。
Windows中的异常:
Win32, CLR及.Net异常(异常代码e0434f4d) ,C++(0x06d7363)
JIT调试器的设置!与Windbg或VS.net结合 cmd: windbg -i
Dr.Watson
Msdn杂志有调试专栏
《成功人士的七个习惯》
Communication:
Listenning skills:
・ Value the opinions of others
・ Be considerate, don't interrupt.
・ Non-verbal message are important also.
Asking questions:
・ Make the point.
Persuasion:
Know your audience.
Three type of people
Software Lifecycle.
Planning, definition, design, implement, test, CCB, RTM
Milestone,spec,
Feature meeting
unit test, code review.
Code complete, feature complete,
Bug tracking,Bug bush, trigle meeting(PM, Dev,QA)
Soft CCB, Hard CCB
Performance, Security in software lifecycle.
Milestone Quality(MQ), Quality gates
Priorities and Time Management.
Make decision: Pugh concept Selection process.
浪费时间: interrupt.
Suggestion:
2 tasks at a time.
Batch process.
Use Outlook's task list.
Design
Successful design strategy: simply!
Design Process: basic design, draft, iterator, UML, TDD
Design issue:
・ Performance,
・ Usability
・ Reliability
・ Internationalization
・ Localizability.
・ Security.
Design by Contract.
Design Pattern.
Prototyping.
Documentation.
TDD
Unit test.
Performance testing practices.
C++ Object model:
每个函数都会被分配一个stack。
Compiler在compile的过程中将每一个函数需要的stack空间算好了,这些信息就存在exe文件中。然后在运行时再分配空间。
对于if else这样的分支,现代编译器都会将这样的block当成一个函数,然后在Active stack中为其分配statck空间。
Stack空间是提前分配好了的,即stack是静态存储空间,在运行时已不可改变。
内存分配的两个原则: 谁new谁释放。构造函数中分配,析构函数中释放。
No comments:
Post a Comment