?? 45.asp
字號:
<P> </P>
</DIR>
</DIR>
<P>假 設 我 們 不 確 定 副 程 式 執 行 的 結 果 是 否 正 確 , 可 以 采
用 逐 行 執 行 的 方 式 , 如 下 : </P>
<P> </P>
<DIR>
<P><B>1</B>. 輸 入 以 上 副 程 式 , 然 後 在 表 單 上 布 置 一 個 命 令
鈕 , 并 且 在 命 令 鈕 的 Click 事 件 程 序 中 撰 寫 以 下 程 式 : </P>
<P> </P>
<P>Private Sub Command1_Click()</P>
<DIR>
<P>X = 100<BR>
Y = 200<BR>
Swap X, Y</P>
</DIR>
<P>End Sub</P>
<P> </P>
<P><B>2</B>. 按 下 F8 執 行 程 式 , 然 後 按 下 表 單 上 的 命 令 鈕 ,
此 時 程 式 視 窗 會 彈 到 螢 幕 的 最 前 端 , 而 在 程 式 視 窗 中 標
示 著 箭 號 的 敘 述 為 下 一 個 被 執 行 的 敘 述 , 如 圖 -3, 持 續
按 下 F8, 直 到 程 式 進 入 Swap 副 程 式 為 止 。 </P>
<P> </P>
<CENTER><P><IMG SRC="45-3.gif" HEIGHT=249 WIDTH=329></P></CENTER>
<CENTER><P>圖 -3 程 式 視 窗 中 下 一 個 被 執 行 的 敘 述 </P></CENTER>
<P> </P>
<P><B>3</B>. 進 入 Swap 副 程 式 之 後 , 選 取 VB 功 能 表 的「檢 視 /區
域 變 數 視 窗」, 此 時 所 調 出 的 區 域 變 數 視 窗 如 圖 -4。 </P>
<P> </P>
<CENTER><P><IMG SRC="45-4.gif" HEIGHT=163 WIDTH=322></P></CENTER>
<CENTER><P>圖 -4 利 用 區 域 變 數 視 窗 檢 驗 變 數 的 內 容 </P></CENTER>
<P> </P>
<P><B>4</B>. 接 著 還 是 以 F8 逐 行 執 行 程 式 , 而 由 於 按 下 F8 只
執 行 一 行 程 式 , 因 此 我 們 可 以 在 每 執 行 一 行 程 式 之 後 ,
即 檢 驗 區 域 變 數 視 窗 中 A、 B、 temp 變 數 的 結 果 是 否 正 確 ,
若 有 錯 誤 便 可 以 輕 易 地 找 到 。 </P>
<P> </P>
</DIR>
<H3>設 定 中 斷 點 的 技 巧 </H3>
<P> </P>
<P>如 果 程 式 比 較 大 或 含 有 回 圈 , 就 不 適 合 采 用 逐 行 執 行
的 偵 測 技 巧 , 此 時 我 們 通 常 會 每 隔 一 段 程 式 設 定 一 個 中
斷 點 , 并 且 在 程 式 執 行 到 中 斷 點 時 檢 驗 變 數 的 內 容 是 否
正 確 , 如 果 正 確 便 繼 續 向 下 測 試 , 如 果 不 正 確 , 即 表 示
這 個 中 斷 點 與 上 一 個 中 斷 點 之 間 的 程 式 有 錯 。 </P>
<P> </P>
<P>接 著 還 是 讓 筆 者 以 實 例 來 說 明 偵 測 的 過 程 , 假 設 有 一
副 程 式 如 下 , 此 一 副 程 式 的 作 用 是 以 空 白 為 分 割 字 元 ,
將 參 數 Sin 字 串 分 割 成 多 個 字 串 , 并 且 存 放 在 Sout 字 串 陣
列 中 , 而 參 數 N 則 會 記 錄 放 到 Sout 之 中 的 字 串 數 目 , 但 這
個 副 程 式 有 bug, 以 下 讓 我 們 找 出 bug 所 在 , 并 且 加 以 修 正
: </P>
<P> </P>
<DIR>
<P>' 參 數 一 Sin : 輸 入 的 字 串 <BR>
' 參 數 二 Sout: 傳 回 的 字 串 陣 列 <BR>
' 參 數 三 N : 傳 回 的 字 串 數 目 <BR>
Sub Parse(ByVal Sin As String, Sout() As String, N As Integer)</P>
<DIR>
<P>Dim pos As Integer<BR>
N = 0<BR>
S = Trim(S)<BR>
Do</P>
<DIR>
<P>pos = InStr(Sin, " ") ' 找 出 空 白 字 元 的 所 在 位 置 <BR>
If pos > 0 Then ' 如 果 含 有 空 白 字 元</P>
<DIR>
<P>N = N + 1<BR>
Sout(N) = Left(Sin, pos - 1)<BR>
Sin = Trim(Mid(Sin, pos + 1))</P>
</DIR>
<P>End If</P>
</DIR>
<P>Loop Until pos = 0</P>
</DIR>
<P>End Sub</P>
<P> </P>
<P><B>1</B>. 輸 入 以 上 副 程 式 , 然 後 在 表 單 上 布 置 一 個 命 令
鈕 , 并 且 在 命 令 鈕 的 Click 事 件 程 序 中 撰 寫 以 下 程 式 : </P>
<P> </P>
<P>Private Sub Command1_Click()</P>
<DIR>
<P>Dim X(1 To 10) As String, N As Integer</P>
<P>Parse "AAA BBB CCC", X, N</P>
</DIR>
<P>End Sub</P>
<P> </P>
<P><B>2</B>. 假 設 Parse 副 程 式 是 正 確 的 , 所 以 執 行「Parse "AAA
BBB CCC", X, N」之 後 , 我 們 預 期 的 結 果 琌「X(1)="AAA"、
X(2)="BBB"、 X(3)="CCC"、 N=3」, 為 了 檢 驗 結 果
, 首 先 將 輸 入 游 標 移 到「Parse "AAA BBB CCC", X, N」的
下 一 行 敘 述 , 然 後 按 下 F9 將 中 斷 點 設 定 在 此 一 敘 述 之 後
。 </P>
<P> </P>
<P><B>3</B>. 按 下 F5 執 行 程 式 , 然 後 再 按 下 表 單 上 的 命 令 鈕
, 使 程 式 執 行 過「Parse "AAA BBB CCC", X, N」, 接 著 會
進 入 中 斷 模 式 , 此 時 請 檢 視 區 域 變 數 視 窗 的 X 及 N, 結 果「X(1)="AAA"、
X(2)="BBB"、 N=2」, 與 我 們 期 望 的 不 符 合 , 這 表 示 Parse
副 程 式 是 有 錯 誤 的 。 </P>
<P> </P>
<P><B>4</B>. 要 測 試 Parse 副 程 式 , 采 用「逐 行 執 行」固 然 也 可
行 , 但 比 較 節 省 時 間 的 作 法 是 將「Do」及「Loop Until pos = 0」兩
行 敘 述 設 定 成 中 斷 點 , 因 為 我 們 可 以 在 每 次 執 行 回 圈 之
前 先 檢 視 Sin、 Sout、 及 N 參 數 的 內 容 , 而 每 執 行 回 圈 一 次
, 這 幾 個 參 數 的 內 容 應 該 都 會 改 變 才 對 , 所 以 也 在「Loop
Until pos = 0」敘 述 上 面 設 定 中 斷 點 , 以 檢 驗 結 果 。 </P>
<P> </P>
<P><B>5</B>. 設 定 好 中 斷 點 之 後 , 按 下 F5 及 命 令 鈕 執 行 程 式
, 并 且 在 每 次 中 斷 時 檢 查 Sin、 Sout、 及 N 變 數 的 內 容 , 然
後 再 按 下 F5 執 行 程 式 , 結 果 各 次 檢 驗 的 結 果 如 下 : </P>
</DIR>
<CENTER><TABLE BORDER=1 CELLSPACING=0 >
<TR BGCOLOR="#00FFFF">
<TD WIDTH="30%" VALIGN="TOP"><FONT SIZE=-1>中 斷 點 </FONT></TD>
<TD WIDTH="70%" VALIGN="TOP"><FONT SIZE=-1>檢 驗 結 果 </FONT></TD>
</TR>
<TR>
<TD WIDTH="30%" VALIGN="TOP"><FONT SIZE=-1>進 入 Do 時 </FONT></TD>
<TD WIDTH="70%" VALIGN="TOP"><FONT SIZE=-1>Sin="AAA BBB CCC",
N=0</FONT></TD>
</TR>
<TR>
<TD VALIGN=TOP NOWRAP WIDTH="30%"><FONT SIZE=-1>第 1次 的 Loop Until</FONT></TD>
<TD WIDTH="70%" VALIGN="TOP"><FONT SIZE=-1>Sin="BBB CCC", N=1,
Sout(1)="AAA"</FONT></TD>
</TR>
<TR>
<TD WIDTH="30%" VALIGN="TOP"><FONT SIZE=-1>第 2次 的 Loop Until</FONT></TD>
<TD VALIGN=TOP NOWRAP WIDTH="70%"><FONT SIZE=-1>Sin="CCC", N=2,
Sout(1)="AAA", Sout(2)="BBB"</FONT></TD>
</TR>
<TR>
<TD WIDTH="30%" VALIGN="TOP"><FONT SIZE=-1>第 3次 的 Loop Until</FONT></TD>
<TD WIDTH="70%" VALIGN="TOP"><FONT SIZE=-1>Sin="CCC", N=2, Sout(1)="AAA",
Sout(2)="BBB"</FONT></TD>
</TR>
</TABLE></CENTER>
<P>檢 驗 到 第 3 次 的 Loop Until 時 , 我 們 可 以 發 現 在 Sin 等 於
"CCC"(不 含 空 白 字 元 )時 , 程 式 并 未 將 它 設 定 給 Sout(3),
所 以 Parse 副 程 式 中 的 If-End If 敘 述 需 修 正 如 下 : </P>
<P> </P>
<DIR>
<P>If pos > 0 Then ' 如 果 含 有 空 白 字 元 </P>
<DIR>
<P>N = N + 1<BR>
Sout(N) = Left(Sin, pos - 1)<BR>
Sin = Trim(Mid(Sin, pos + 1))</P>
</DIR>
<P>Else ' 如 果 未 含 空 白 字 元 </P>
<DIR>
<P>N = N + 1<BR>
Sout(N) = Sin</P>
</DIR>
<P>End If</P>
<P> </P>
</DIR>
<H3>監 看 式 與 中 斷 點 的 搭 配 </H3>
<P> </P>
<P>在 上 一 個 測 試 的 例 子 中 , 不 知 道 您 會 使 用 哪 一 種 視 窗
來 檢 驗 變 數 的 內 容 , 筆 者 使 用 的 是 監 看 視 窗 , 因 為 區 域
變 數 視 窗 會 列 出 所 有 的 變 數 , 看 起 來 比 較 凌 亂 , 使 用 監
看 視 窗 則 是 指 定 想 要 檢 視 的 變 數 , 相 對 之 下 就 清 爽 多 了
。 承 續 上 一 個 例 子 , 假 設 我 們 想 將 Parse 副 程 式 的 Sin 變 數
加 入 於 監 看 視 窗 中 , 則 方 法 如 下 : </P>
<P> </P>
<DIR>
<P><B>1</B>. 選 取 功 能 表 的「檢 視 /監 看 視 窗」, 然 後 在「監 看
視 窗」上 面 按 下 滑 鼠 右 鈕 , 待 出 現 快 顯 功 能 表 時 , 選 取「新
增 監 看 式」命 令 。 </P>
<P> </P>
<P><B>2</B>. 待 出 現「新 增 監 看 式」交 談 窗 時 , 分 別 在「程 序」欄
位 中 選 取「Parse」, 在「運 算 式」欄 位 輸 入 Sin, 則 Sin 變 數 即
會 成 為 被 監 看 的 變 數 。 </P>
<P> </P>
</DIR>
<P>使 用 監 看 式 還 有 另 一 個 特 殊 的 功 能 , 以 下 筆 者 直 接 以
實 例 來 說 明 , 假 設 一 回 圈 如 下 : </P>
<P> </P>
<DIR>
<P>Dim A As Single</P>
<P>A = 0</P>
<P>Do</P>
<DIR>
<P>A = A + 0.01</P>
</DIR>
<P>Loop Until A = 1</P>
<P> </P>
</DIR>
<P>此 一 程 式 會 進 入 無 窮 回 圈 , 假 設 我 們 不 清 楚 為 什 麼 ,
所 以 想 利 用 VB 偵 錯 的 功 能 加 以 檢 驗 , 此 時 如 果 我 們 將 中
斷 點 設 定 在「Loop Until A=1」, 則 為 了 讓 A 的 值 接 近 於 1 以 檢
驗 為 什 麼「A = 1」不 成 立 , 所 需 按 下 F5 持 續 執 行 程 式 的 次
數 大 約 是 100 次 , 這 好 像 太 辛 苦 了 一 點 , 所 以 便 有 了 以 下
的 方 法 : </P>
<P> </P>
<DIR>
<P><B>1</B>. 在「新 增 監 看 式」交 談 窗 中 , 輸 入「A > 0.95」到「運
算 式」欄 位 中 , 然 後 選 取「監 看 方 式」欄 位 中 的「數 值 由 False改
變 為 True時 中 斷」, 如 圖 -5, 此 一 設 定 的 作 用 是 當 A > 0.95
時 , 使 程 式 進 入 中 斷 模 式 。 </P>
<P> </P>
<CENTER><P><IMG SRC="45-5.gif" HEIGHT=258 WIDTH=382></P></CENTER>
<CENTER><P>圖 -5 條 件 式 中 斷 設 定 法 </P></CENTER>
<P> </P>
<P><B>2</B>. 除 了 新 增「A > 0.95」的 監 看 式 之 外 , 也 增 加 變
數 A 的 監 看 式 , 然 後 按 下 F5 執 行 程 式 , 結 果 在 A=0.9599994
時 進 入 中 斷 模 式 , 您 可 以 發 現 A 竟 然 不 等 於 9.6, 這 是 電
腦 在 小 數 點 方 面 的 些 微 誤 差 所 致 。 </P>
<P> </P>
<P><B>3</B>. 接 下 來 則 利 用 F8 逐 行 執 行 程 式 , 果 然 發 現 A 最
接 近 1 的 兩 個 值 分 別 是 0.9999993 及 1.009999, 并 沒 有 出 現 等
於 1 的 數 值 , 這 是 以 上 回 圈 會 進 入 無 窮 回 圈 的 原 因 。 </P>
<P> </P>
</DIR>
<H3>檢 視 程 序 呼 叫 的 歷 程 </H3>
<P> </P>
<P>對 於 比 較 復 雜 的 程 式 而 言 , 程 序 連 續 向 下 呼 叫 的 情 況
時 有 所 見 , 當 程 式 中 斷 於 某 一 程 序 時 , 我 們 往 往 也 需 要
知 道 整 個 呼 叫 的 過 程 中 , 是 從 哪 一 個 程 序 開 始 呼 叫 的 ,
經 過 哪 些 程 序 , 執 行 過 哪 些 敘 述 , 如 此 方 可 正 確 地 判 斷
目 前 所 呈 現 的 結 果 是 為 何 而 來 。 </P>
<P> </P>
<P>當 呼 叫 歷 程 超 過 兩 個 程 序 以 上 , 而 且 又 進 入 中 斷 模 式
時 , VB 便 允 許 我 們 選 取 功 能 表 的「檢 視 /呼 叫 堆 疊」以 顯 示
程 序 的 呼 叫 歷 程 , 舉 例 來 說 , Command_Click 程 序 呼 叫 了 Insert
副 程 式 , 而 Insert 副 程 式 又 呼 叫 了 Swap 副 程 式 , 則 當 程 式
中 斷 於 Swap 副 程 式 時 , 則 選 取 功 能 表 的「檢 視 /呼 叫 堆 疊」,
可 顯 示 如 圖 -6 的「呼 叫 堆 疊」視 窗 。 </P>
<P> </P>
<CENTER><P><IMG SRC="45-6.gif" HEIGHT=156 WIDTH=444></P></CENTER>
<CENTER><P>圖 -6 呼 叫 堆 疊 視 窗 </P></CENTER>
<P> </P>
<P>此 時 我 們 可 以 選 取 并 且 顯 示 呼 叫 堆 疊 視 窗 中 的 任 何 一
個 程 序 , 接 著 被 選 取 的 程 序 便 會 顯 示 在 程 式 視 窗 之 中 ,
并 且 以 箭 號 標 示 出 此 一 程 序 最 後 一 個 被 執 行 的 敘 述 , 如
果 想 要 確 知 程 式 執 行 的 經 過 , 則 只 要 逐 一 選 取 并 且 顯 示
呼 叫 堆 疊 視 窗 中 的 每 一 個 程 序 即 可 。 </P>
<P> </P>
<P>此 一 功 能 對 於 多 模 組 程 式 的 偵 測 很 有 幫 助 , 因 為 即 使
是 跨 越 不 同 模 組 的 呼 叫 也 都 會 顯 示 在 呼 叫 堆 疊 視 窗 中 ,
而 藉 此 我 們 可 以 瀏 覽 程 序 完 整 的 呼 叫 過 程 , 不 必 為 了 尋
找 不 同 程 序 而 在 各 個 模 組 之 間 切 來 切 去 。 </P>
<P> </P>
<H2>使 用 Debug 物 件 </H2>
<P> </P>
<P>以 上 所 介 紹 的 偵 錯 功 能 都 必 須 在 中 斷 模 式 進 行 , 但 也
許 我 們 覺 得 程 式 已 經 測 試 得 差 不 多 了 , 應 該 不 會 有 bug 了
, 於 是 不 再 中 斷 程 式 , 而 讓 程 式 一 路 執 行 下 去 , 并 且 期
望 它 能 夠 正 確 地 執 行 , 但 往 往 事 與 愿 違 , 結 果 又 出 現 了
bug, 此 時 該 怎 麼 辦 呢 ? 當 然 必 須 重 新 設 定 中 斷 點 重 新 偵
錯 , 然 而 隨 著 程 式 越 寫 越 大 , 必 須 設 定 中 斷 點 的 地 方 也
越 來 越 多 , 而 重 新 設 定 的 工 作 也 會 越 來 越 沈 重 , 由 此 可
見 只 使 用 以 上 的 偵 錯 功 能 仍 然 是 不 夠 的 。 </P>
<P> </P>
<P>為 了 解 決 上 述 的 問 題 , 我 們 通 常 會 在 程 式 之 中 比 較 關
鍵 的 地 方 埋 設「偵 測 碼」, 舉 例 來 說 , 呼 叫 某 一 副 程 式 之
後 , 將 呼 叫 的 結 果 顯 示 出 來 , 以 檢 測 副 程 式 是 否 正 確 執
行 , 而 當 我 們 埋 設 很 多 偵 測 碼 之 後 , 將 來 只 要 程 式 一 執
行 , 就 不 斷 會 有 階 段 性 的 執 行 結 果 被 顯 示 出 來 。 若 程 式
執 行 正 確 , 我 們 可 以 不 去 理 會 階 段 性 的 執 行 結 果 , 如 果
發 生 錯 誤
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -