📄 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 + -