思路:
1. 模塊分類
2. 即時調試:調試時改變錯誤變量的值,繼續調試,完成後,再修改代碼
3. 使用高級斷點
4.使用打印、error log輸出
具體方法:
1. 使用Assert(原則:儘量簡單)
assert只在debug下生效,release下不會被編譯。
2. 使用Trace
以下的例子只能在debug中顯示,
例子:
a) TRACE
CString csTest = “test”;
TRACE(“CString is %s/n”,csTest);
b) ATLTRACE
c) afxDump
CTime time = CTime::GetCurrentTime();
#ifdef _DEBUG
afxDump << time << “/n”;
#endif
3. GetLastError:來檢測返回值,通過得到錯誤代碼來分析錯誤原因
4. Error log:把錯誤信息記錄到文件中
另:VC watch窗口變量查看技巧(選自MSDN)
Symbols for Watch Variables
You can change the display format of variables in the QuickWatch dialog box or in the Watch window using the formatting symbols in the following table.
Symbol | Format | Value | Displays |
d,i | signed decimal integer | 0xF000F065 | -268373915 |
u | unsigned decimal integer | 0x0065 | 101 |
o | unsigned octal integer | 0xF065 | 0170145 |
x,X | Hexadecimal integer | 61541 (decimal) | 0x0000F065 |
l,h | long or short prefix for: d, i, u, o, x, X | 00406042,hx | 0x0c22 |
f | signed floating-point | 3./2. | 1.500000 |
e | signed scientific notation | 3./2. | 1.500000e+000 |
g | signed floating-point or signed scientific notation, whichever is shorter | 3./2. | 1.5 |
c | Single character | 0x0065 | 'e' |
s | String | 0x0012fde8 | “Hello world” |
su | Unicode string | “Hello world” | |
st | Unicode string or ANSI string, depending on Unicode Strings setting in autoexp.dat. | ||
hr | HRESULT or Win32 error code. | 0x00000000L | S_OK |
wc | Window class flag. | 0x00000040 | WC_DEFAULTCHAR |
wm | Windows message numbers | 0x0010 | WM_CLOSE |
To use a formatting symbol, type the variable name, followed by a comma and the appropriate symbol. For example, if var
has a value of 0x0065
, and you want to see the value in character form, type var,c
in the Name column on the tab of the Watch window. When you press ENTER, the character-format value appears:
var,c = 'e'
You can use the formatting symbols shown in the following table to format the contents of memory locations.
Symbol | Format | Displays |
ma | 64 ASCII characters | 0x0012ffac .4...0...".0W&.......1W&.0.:W..1...."..1.JO&.1.2.."..1...0y....1 |
m | 16 bytes in hexadecimal, followed by 16 ASCII characters | 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&.. |
mb | 16 bytes in hexadecimal, followed by 16 ASCII characters | 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&.. |
mw | 8 words | 0x0012ffac 34B3 00CB 3084 8094 22FF 308A 2657 0000 |
md | 4 doublewords | 0x0012ffac 00CB34B3 80943084 308A22FF 00002657 |
mq | 4 quadwords | 0x0012ffac 7ffdf00000000000 5f441a790012fdd4 |
mu | 2-byte characters (Unicode) | 0x0012fc60 8478 77f4 ffff ffff 0000 0000 0000 0000 |
With the memory location formatting symbols, you can type any value or expression that evaluates to a location.
To display the value of a character array as a string, precede the array name with an ampersand (&):
&yourname
A formatting character can follow an expression also:
rep+1,x
alps[0],mb
xloc,g
count,d
To watch the value at an address or the value pointed to by a register, use the BY, WO, or DW operator.
- BY returns the contents of the byte pointed to.
- WO returns the contents of the word pointed to.
- DW returns the contents of the doubleword pointed to.
Follow the operator with a variable, register, or constant. If the BY, WO, or DW operator is followed by a variable, then the environment watches the byte, word, or doubleword at the address contained in the variable.
You can also use the context operator { } to display the contents of any location.
To display a Unicode string in the Watch window or the QuickWatch dialog box, use the su format specifier. To display data bytes with Unicode characters in the Watch window or the QuickWatch dialog box, use the mu format specifier.
Note You can apply formatting symbols to structures, arrays, pointers, and objects as unexpanded variables only. If you expand the variable, the specified formatting affects all members. You cannot apply formatting symbols to individual members.
比如代碼裏多寫一些斷言和日誌,可以輔助你更快的定位問題,不是所有bug都需要跟蹤調試才能解決的,應該大部分bug是可以通過讀代碼和其他輔助線索幫助下定位的,還有就是解決問題的思路問題,跟蹤調試只是山窮水盡的最後一步,其實之前還是有很多方法的。