---
title: "代码调试 - 开发程序 - MetaEditor 帮助"
description: "MetaEditor 拥有一个内置的调试器，允许您单步执行 (各个函数) 以便检验程序。 在代码中放置断点。 这些是应该暂停程序执行的地方。 然后在常规图表或 策略测试器 中启动程序。 一旦程序到达断点，它就会暂停。... - 代码调试 - 开发程序 - MetaEditor 帮助"
image: "https://www.metatrader5.com/i/logo_metatrader5.png"
---

[MetaEditor 帮助](https://www.metatrader5.com/zh/metaeditor/help) → [开发程序](https://www.metatrader5.com/zh/metaeditor/help/development) → 代码调试

# 代码调试

MetaEditor 拥有一个内置的调试器，允许您单步执行 (各个函数) 以便检验程序。 在代码中放置断点。 这些是应该暂停程序执行的地方。 然后在常规图表或 [策略测试器](https://www.metatrader5.com/zh/metaeditor/help/development/debug#history) 中启动程序。 一旦程序到达断点，它就会暂停。 这允许您查看计算变量的值，然后继续单步执行程序检查算法。

- [预设](https://www.metatrader5.com/zh/metaeditor/help/development/debug#settings)
- [断点](https://www.metatrader5.com/zh/metaeditor/help/development/debug#breakpoint)
- [启动调试](https://www.metatrader5.com/zh/metaeditor/help/development/debug#start)
- [观察表达式](https://www.metatrader5.com/zh/metaeditor/help/development/debug#watch)
- [查看调用堆栈](https://www.metatrader5.com/zh/metaeditor/help/development/debug#stack)
- [单步调试](https://www.metatrader5.com/zh/metaeditor/help/development/debug#step)
- [暂停，恢复并结束调试](https://www.metatrader5.com/zh/metaeditor/help/development/debug#stop)
- [依据历史数据调试](https://www.metatrader5.com/zh/metaeditor/help/development/debug#history)

## 预设 [#](#settings)

调试之前，在 [MetaEditor 设置](https://www.metatrader5.com/zh/metaeditor/help/beginning/settings#debug) 中为常规参数设定。 您可以指定一个品种和图表周期，应用程序会在该图表调试。 每次开始调试时会临时创建这种图表，并在完成后立即将其删除。

| 位于交易平台的 /profiles/templates 文件夹中的 debug.tpl 模板将被应用于调试图表。 |
| --- |

## 断点 [#](#breakpoint)

断点 是程序执行到达指定字符串时触发的命令。 该命令停止该字符串的执行。 断点允许检查指定代码区域中的程序行为: 查看变量值和函数堆栈。 随后，调试过程可以恢复或终止。</ t1>

在启动调试之前，在程序代码中至少设置一个断点。 为此，请双击代码行左侧的灰色区域。 您也可以将光标放在行上并单击![切换断点](https://www.metatrader5.com/i/help/metaeditor/en/breakpoint_icon.png) 位于 [调试](https://www.metatrader5.com/zh/metaeditor/help/main_menu/main_menu_debug#breakpoint) 菜单里的切换断点，或按 F9。 断点也以同样的方式禁用。

![启用断点](https://www.metatrader5.com/i/help/metaeditor/en/debug_breakpoint.png)

如果您需要跳转到程序停止执行的位置，请在调用堆栈查看窗口中双击函数。 还有，使用窗口关联菜单，可以打开当前调试程序中所有断点的列表:

![跳至断点](https://www.metatrader5.com/i/help/metaeditor/en/breakpoint_goto.png)

通过双击，您可以跳转到任何断点。

## 启动调试 [#](#start)

若要运行调试, 请打开 [程序主体文件](https://www.metatrader5.com/zh/metaeditor/help/structure#main_file) 或一个 [项目](https://www.metatrader5.com/zh/metaeditor/help/mql5storage/projects)。 调试可按照两种模式执行:

- 依据真实数据。 调试启动![依据真实数据开始/恢复调试](https://www.metatrader5.com/i/help/metaeditor/en/start_debug_icon.png) 位于 [调试](https://www.metatrader5.com/zh/metaeditor/help/main_menu/main_menu_debug#start) 菜单里的依据真实数据开始命令，或按 F5。 在此模式, 调试程序运行在交易平台的 [特殊图表](https://www.metatrader5.com/zh/metaeditor/help/development/debug#settings) 上。 使用来自服务器的价格数据在实际条件下执行调试。
- 依据历史数据。 调试启动![依据历史数据开始](https://www.metatrader5.com/i/help/metaeditor/en/start_debug_history_icon.png) 位于 [调试](https://www.metatrader5.com/zh/metaeditor/help/main_menu/main_menu_debug#start) 菜单里的依据历史数据开始命令，或按 Ctrl+F5。 这个模式下的程序会在策略测试中启用。使用它以任何期望的历史间隔测试程序性能，无需等待特定的市场条件。默认情况下使用非可视化测试模式，以避免在渲染图形元素时使用额外的资源。必要情况下，您可以在[MetaEditor设置](https://www.metatrader5.com/zh/metaeditor/help/beginning/settings#debug)中启用可视化模式。

一旦程序在调试模式下执行到达断点，它就会暂停。 暂停执行的行被标记为![触发断点](https://www.metatrader5.com/i/help/metaeditor/en/breakpoint_triggered_icon.png) 图标。 [调试](https://www.metatrader5.com/zh/metaeditor/help/workspace/toolbox#debug) 选卡也出现在工具箱窗口中。 它的左边部分显示函数 [调用堆栈](https://www.metatrader5.com/zh/metaeditor/help/development/debug#stack)。

![启动调试后触发断点](https://www.metatrader5.com/i/help/metaeditor/en/debug_start.png)

## 观察表达式 [#](#watch)

在调试过程中，可以在当前程序执行步骤中跟踪各种表达式 (变量) 的值。 工具箱窗口的 [调试](https://www.metatrader5.com/zh/metaeditor/help/workspace/toolbox#debug) 选卡右侧显示相应的结果。 若要跟踪表达式数值，请将其添加到观察值中:

- 在调试过程中，将光标置于源代码中的表达式上，然后单击![添加关注](https://www.metatrader5.com/i/help/metaeditor/en/add_watch_icon.png)在关联菜单中添加观察。
- 点击![添加](https://www.metatrader5.com/i/help/metaeditor/en/add_watch_icon.png)在调试选项卡右侧的关联菜单中添加。 在新出现的行中输入表达式名称。
- 若要更改所跟踪表达式的名称，请双击它。

![查看堆栈和表达式值](https://www.metatrader5.com/i/help/metaeditor/en/debug_watch.png)

您还可以在调试器观察列表中启用自动显示局部变量。可以通过快捷菜单的“本地”命令启用此显示。随着调试器操作在代码中进行，当前作用域中的变量会自动显示在列表中。

在表达式观察窗口中，可以执行简单的数学计算 (加、减、乘、除)，也可以查看指定数组下标处的值，例如指定A[3][4] 项，其中 A 是一个数组名称，而 3 和 4 是其维度中的位置。 将对象添加到所观察的表达式时，我们可以在末尾指定完全停止，或单击 Ctrl+空格来查看其成员的列表:

![插入对象成员](https://www.metatrader5.com/i/help/metaeditor/en/debug_watch_autocomplete.png)

要查看任何数组或对象的内容，请在观察窗口双击该数组或对象。

默认情况下，整数以十进制形式显示在观察窗口中。 若要以二进制或十六进制形式显示值，请在表达式字段中相应地指定逗号分隔的 b 或 x 修饰符。

![以二进制和十六进制形式查看表达式](https://www.metatrader5.com/i/help/metaeditor/en/debug_watch_binary_hex.png)

## 查看调用堆栈 [#](#stack)

从子程序 (嵌套函数) 向程序 (主事件处理程序 OnInit，OnTick 等) 返回控制的数据要在调用堆栈中指定。 该堆栈允许您跟踪 [交易平台中事件发生](https://www.mql5.com/zh/docs/runtime/event_fire) 的整个顺序，直到调用指定函数。

每个函数都显示以下数据:

- 发起函数调用的文件名。
- 函数名称。
- 文件中调用该函数的行号。

单步调试

[调试](https://www.metatrader5.com/zh/metaeditor/help/main_menu/main_menu_debug) 菜单或 [标准](https://www.metatrader5.com/zh/metaeditor/help/toolbar/toolbar_standard) 工具栏命令用于单步调试，并具有查看调用堆栈的能力:

- ![步进](https://www.metatrader5.com/i/help/metaeditor/en/step_into_icon.png)步进 ― 程序执行前移一步并进入被调用函数。 与按 F11 键执行相同的动作。
- ![步跃](https://www.metatrader5.com/i/help/metaeditor/en/step_over_icon.png)步跃 ― 程序执行前移一步但不进入被调用函数。 与按 F10 键执行相同的动作。
- ![退出](https://www.metatrader5.com/i/help/metaeditor/en/step_out_icon.png)步出 ― 单步执行高一级程序。 与按 Shift+F11 键执行相同的动作。

仅当程序在调试模式下暂停后，才能使用单步调试命令:

- 触发断点后。
- 程序被手动暂停后![暂停](https://www.metatrader5.com/i/help/metaeditor/en/break_debug_icon.png) 位于 [调试](https://www.metatrader5.com/zh/metaeditor/help/main_menu/main_menu_debug#break) 菜单里的暂停命令，或按 Break。

| 事件继续发生 [在交易平台里](https://www.mql5.com/zh/docs/runtime/event_fire) 即使程序处于断点。 所有发生的事件都放入一个队列中，在当前事件处理程序退出代码后继续使用智能系统进行处理。 |
| --- |

## 暂停，恢复并结束调试 [#](#stop)

一旦执行抵达带有断点的字符串，程序就会在调试过程中自动停止。 调试也可以手动管理:

- 暂停执行调试过程中的程序执行可以手动暂停，这是通过使用![暂停](https://www.metatrader5.com/i/help/metaeditor/en/break_debug_icon.png) 位于 [调试](https://www.metatrader5.com/zh/metaeditor/help/main_menu/main_menu_debug#break) 菜单里的暂停命令，或按 Break。 暂停后，您可以应用单步调试命令。
- 恢复执行若要在暂停后恢复程序执行，请单击![恢复](https://www.metatrader5.com/i/help/metaeditor/en/start_debug_icon.png) 位于 [调试](https://www.metatrader5.com/zh/metaeditor/help/main_menu/main_menu_debug#start) 菜单里的恢复，或按 F5。
- 完成调试若要停止调试, 点击 ![停止](https://www.metatrader5.com/i/help/metaeditor/en/stop_debug_icon.png) 位于 [调试](https://www.metatrader5.com/zh/metaeditor/help/main_menu/main_menu_debug#stop) 菜单里的停止，或按 Shift+F5。 该程序将从启动调试时所加载的 [特别图表](https://www.metatrader5.com/zh/metaeditor/help/development/debug#settings) 中删除，而图表本身也被关闭。

| 没有源 MQ4、MQ5 和 MQH 文件，调试是不可能的。不建议分发调试过程中得到的可执行 EX4/EX5 文件。 |
| --- |

## 依据历史数据调试 [#](#history)

除了实时价格数据外，交易机器人和技术指标的调试也可以依据历史数据进行。 任何程序都可以根据所需的历史数据进行测试，而无需实时等待某些交易事件。

依据历史数据调试在策略测试器中以可视化测试模式运行。 基于测试器中模拟的时间序列，或累积的历史逐笔报价 (从经纪商收到)，在图表上执行应用程序。

若要开始依据历史数据调试, 在 [MetaEditor 设置](https://www.metatrader5.com/zh/metaeditor/help/beginning/settings#debug) 中设置测试参数。

![配置依据历史数据调试](https://www.metatrader5.com/i/help/metaeditor/en/debug_history_settings.png)

在代码中设置断点，然后使用历史价格开始调试。

![启动依据历史数据调试](https://www.metatrader5.com/i/help/metaeditor/en/debug_history_run.png)

这将启动可视化测试和调试过程。

![依据历史数据调试](https://www.metatrader5.com/i/help/metaeditor/en/debug_history_running.png)

```json
{"@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [ {"@type": "ListItem", "position": 1, "item": {"@id": "/zh/metaeditor/help", "name": "MetaEditor 帮助"}}, {"@type": "ListItem", "position": 2, "item": {"@id": "/zh/metaeditor/help/development", "name": "开发程序"}}, {"@type": "ListItem", "position": 3, "item": {"@id": "/zh/metaeditor/help/development/debug", "name": "代码调试"}} ]}
{ "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{ "@type": "Question", "name": "MetaTrader 5: 代码调试", "acceptedAnswer": { "@type": "Answer", "text": "MetaEditor 拥有一个内置的调试器，允许您单步执行 (各个函数) 以便检验程序。 在代码中放置断点。 这些是应该暂停程序执行的地方。 然后在常规图表或 策略测试器 中启动程序。 一旦程序到达断点，它就会暂停。 这允许您查看计算变量的值，然后继续单步执行程序检查算法。 预设 断点..." } }] }
```
